diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index abbcb5506..2b20bd785 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 -e9c463e0cf56ed28ee26a33debeae3ecc2e941d2 assets/create/lang/en_ud.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 +c71f5246d2cb8e9913d1552d23fcc82c43cde7a0 assets/create/lang/en_ud.json +ec002cefbb883258daed50448e17f874eb814c18 assets/create/lang/en_us.json +639b3bbd99887014d67fc943d6e1415bebd1c70a assets/create/lang/unfinished/de_de.json +3dca81115778734215a4d361ec30f43b1342b51c assets/create/lang/unfinished/es_es.json +df82753f7276ceb72a834170bb09260c4c4f7936 assets/create/lang/unfinished/es_mx.json +021158ff586e33ccfd0012c2c4fbfba83b62d57b assets/create/lang/unfinished/fr_fr.json +4d3132ccb4a8d7c211451e195165fb3719c135a6 assets/create/lang/unfinished/it_it.json +741f5a61d9fec8ece2936649490318ef4b06b15f assets/create/lang/unfinished/ja_jp.json +79983f46c225a3dca6b9e6cecc26f73e07db1b86 assets/create/lang/unfinished/ko_kr.json +c85b841cf6ef7a5205782da242e98c2dc3b2af9a assets/create/lang/unfinished/nl_nl.json +2bcee4396da8bc2cbba794e7dd4b33a406d58360 assets/create/lang/unfinished/pl_pl.json +0b45c9ecdf8fc82f7f1e112d82cb95e94cf8b064 assets/create/lang/unfinished/pt_br.json +b7ef8659876e0890016e696b5adf73404b31ef8a assets/create/lang/unfinished/ru_ru.json +f04ba370732503448596909c56ff0e05aec5a233 assets/create/lang/unfinished/zh_cn.json +708e423b949fc4113cefc46a0119d02cad8f71ad 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 @@ -1273,6 +1273,7 @@ d7cb2f7bac8fae893fc5179af8140786a908f3f5 assets/create/models/item/copper_shingl f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles.json 5583368909c319acfcf0f7a419bedf23272fe613 assets/create/models/item/copper_valve_handle.json 4e253e7c0626dfd76e2d39786ce1a34e0baaa62d assets/create/models/item/crafter_slot_cover.json +1f947dafff30da701b7675f5b026ccab3129b079 assets/create/models/item/crafting_blueprint.json 7b333dea353afaa27b182aedc647c9e9e34e92ef assets/create/models/item/creative_crate.json f7d06c52c3ca8c22ad67f5741471f06ac22e7fcb assets/create/models/item/creative_fluid_tank.json 5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 15c089697..2428052fc 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -410,6 +410,7 @@ "block.create.zinc_block": "\u0254u\u0131Z \u025Fo \u029E\u0254o\u05DF\u15FA", "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", + "entity.create.crafting_blueprint": "\u0287u\u0131\u0279d\u01DDn\u05DF\u15FA bu\u0131\u0287\u025F\u0250\u0279\u0186", "entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141", "entity.create.seat": "\u0287\u0250\u01DDS", "entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S", @@ -438,6 +439,7 @@ "item.create.copper_nugget": "\u0287\u01DDbbnN \u0279\u01DDddo\u0186", "item.create.copper_sheet": "\u0287\u01DD\u01DD\u0265S \u0279\u01DDddo\u0186", "item.create.crafter_slot_cover": "\u0279\u01DD\u028Co\u0186 \u0287o\u05DFS \u0279\u01DD\u0287\u025F\u0250\u0279\u0186", + "item.create.crafting_blueprint": "\u0287u\u0131\u0279d\u01DDn\u05DF\u15FA bu\u0131\u0287\u025F\u0250\u0279\u0186", "item.create.crushed_aluminum_ore": "\u01DD\u0279O \u026Fnu\u0131\u026Fn\u05DF\u2C6F p\u01DD\u0265sn\u0279\u0186", "item.create.crushed_brass": "ss\u0250\u0279\u15FA p\u01DD\u0265sn\u0279\u0186", "item.create.crushed_copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186 p\u01DD\u0265sn\u0279\u0186", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 2e0e212ef..3dbb3ce81 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -404,26 +404,24 @@ "block.create.weighted_ejector": "Weighted Ejector", "block.create.white_sail": "White Sail", "block.create.white_seat": "White Seat", - "block.create.white_valve_handle": "White Valve Handle", - "block.create.windmill_bearing": "Windmill Bearing", - "block.create.wooden_bracket": "Wooden Bracket", - "block.create.yellow_sail": "Yellow Sail", - "block.create.yellow_seat": "Yellow Seat", - "block.create.yellow_valve_handle": "Yellow Valve Handle", - "block.create.zinc_block": "Block of Zinc", - "block.create.zinc_ore": "Zinc Ore", - - "entity.create.contraption": "Contraption", - "entity.create.gantry_contraption": "Gantry Contraption", - "entity.create.seat": "Seat", - "entity.create.stationary_contraption": "Stationary Contraption", - "entity.create.super_glue": "Super Glue", - - "fluid.create.milk": "Milk", - "fluid.create.potion": "Potion", - "fluid.create.tea": "Builder's Tea", - - "item.create.andesite_alloy": "Andesite Alloy", + "block.create.white_valve_handle": "White Valve Handle", + "block.create.windmill_bearing": "Windmill Bearing", + "block.create.wooden_bracket": "Wooden Bracket", + "block.create.yellow_sail": "Yellow Sail", + "block.create.yellow_seat": "Yellow Seat", + "block.create.yellow_valve_handle": "Yellow Valve Handle", + "block.create.zinc_block": "Block of Zinc", + "block.create.zinc_ore": "Zinc Ore", + "entity.create.contraption": "Contraption", + "entity.create.crafting_blueprint": "Crafting Blueprint", + "entity.create.gantry_contraption": "Gantry Contraption", + "entity.create.seat": "Seat", + "entity.create.stationary_contraption": "Stationary Contraption", + "entity.create.super_glue": "Super Glue", + "fluid.create.milk": "Milk", + "fluid.create.potion": "Potion", + "fluid.create.tea": "Builder's Tea", + "item.create.andesite_alloy": "Andesite Alloy", "item.create.attribute_filter": "Attribute Filter", "item.create.bar_of_chocolate": "Bar of Chocolate", "item.create.belt_connector": "Mechanical Belt", @@ -434,26 +432,27 @@ "item.create.brass_nugget": "Brass Nugget", "item.create.brass_sheet": "Brass Sheet", "item.create.builders_tea": "Builder's Tea", - "item.create.chest_minecart_contraption": "Chest Minecart Contraption", - "item.create.chocolate_bucket": "Chocolate Bucket", - "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", - "item.create.chromatic_compound": "Chromatic Compound", - "item.create.cinder_flour": "Cinder Flour", - "item.create.copper_backtank": "Copper Backtank", - "item.create.copper_ingot": "Copper Ingot", - "item.create.copper_nugget": "Copper Nugget", - "item.create.copper_sheet": "Copper Sheet", - "item.create.crafter_slot_cover": "Crafter Slot Cover", - "item.create.crushed_aluminum_ore": "Crushed Aluminum Ore", - "item.create.crushed_brass": "Crushed Brass", - "item.create.crushed_copper_ore": "Crushed Copper Ore", - "item.create.crushed_gold_ore": "Crushed Gold Ore", - "item.create.crushed_iron_ore": "Crushed Iron Ore", - "item.create.crushed_lead_ore": "Crushed Lead Ore", - "item.create.crushed_nickel_ore": "Crushed Nickel Ore", - "item.create.crushed_osmium_ore": "Crushed Osmium Ore", - "item.create.crushed_platinum_ore": "Crushed Platinum Ore", - "item.create.crushed_quicksilver_ore": "Crushed Quicksilver Ore", + "item.create.chest_minecart_contraption": "Chest Minecart Contraption", + "item.create.chocolate_bucket": "Chocolate Bucket", + "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", + "item.create.chromatic_compound": "Chromatic Compound", + "item.create.cinder_flour": "Cinder Flour", + "item.create.copper_backtank": "Copper Backtank", + "item.create.copper_ingot": "Copper Ingot", + "item.create.copper_nugget": "Copper Nugget", + "item.create.copper_sheet": "Copper Sheet", + "item.create.crafter_slot_cover": "Crafter Slot Cover", + "item.create.crafting_blueprint": "Crafting Blueprint", + "item.create.crushed_aluminum_ore": "Crushed Aluminum Ore", + "item.create.crushed_brass": "Crushed Brass", + "item.create.crushed_copper_ore": "Crushed Copper Ore", + "item.create.crushed_gold_ore": "Crushed Gold Ore", + "item.create.crushed_iron_ore": "Crushed Iron Ore", + "item.create.crushed_lead_ore": "Crushed Lead Ore", + "item.create.crushed_nickel_ore": "Crushed Nickel Ore", + "item.create.crushed_osmium_ore": "Crushed Osmium Ore", + "item.create.crushed_platinum_ore": "Crushed Platinum Ore", + "item.create.crushed_quicksilver_ore": "Crushed Quicksilver Ore", "item.create.crushed_silver_ore": "Crushed Silver Ore", "item.create.crushed_tin_ore": "Crushed Tin Ore", "item.create.crushed_uranium_ore": "Crushed Uranium Ore", @@ -662,26 +661,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create Palettes", - - "death.attack.create.crush": "%1$s was processed by Crushing Wheels", - "death.attack.create.fan_fire": "%1$s was burned to death by hot air", - "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", - "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", - "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", - "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", - - "create.block.deployer.damage_source_name": "a rogue Deployer", - "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", - - "create.recipe.crushing": "Crushing", - "create.recipe.milling": "Milling", - "create.recipe.fan_washing": "Bulk Washing", - "create.recipe.fan_washing.fan": "Fan behind Flowing Water", - "create.recipe.fan_smoking": "Bulk Smoking", - "create.recipe.fan_smoking.fan": "Fan behind Fire", - "create.recipe.fan_blasting": "Bulk Blasting", - "create.recipe.fan_blasting.fan": "Fan behind Lava", - "create.recipe.pressing": "Pressing", + "death.attack.create.crush": "%1$s was processed by Crushing Wheels", + "death.attack.create.fan_fire": "%1$s was burned to death by hot air", + "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", + "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", + "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", + "create.block.deployer.damage_source_name": "a rogue Deployer", + "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", + "create.menu.return": "Return to Menu", + "create.menu.configure": "Configure...", + "create.menu.getting_started": "Getting Started", + "create.menu.project_page": "Project Page", + "create.menu.report_bugs": "Report Issues", + "create.menu.support": "Support Us", + "create.recipe.crushing": "Crushing", + "create.recipe.milling": "Milling", + "create.recipe.fan_washing": "Bulk Washing", + "create.recipe.fan_washing.fan": "Fan behind Flowing Water", + "create.recipe.fan_smoking": "Bulk Smoking", + "create.recipe.fan_smoking.fan": "Fan behind Fire", + "create.recipe.fan_blasting": "Bulk Blasting", + "create.recipe.fan_blasting.fan": "Fan behind Lava", + "create.recipe.pressing": "Pressing", "create.recipe.mixing": "Mixing", "create.recipe.deploying": "Deploying", "create.recipe.automatic_shapeless": "Automated Shapeless Crafting", @@ -1102,24 +1104,29 @@ "create.tooltip.chute.no_fans_attached": "No attached fans", "create.tooltip.chute.fans_push_up": "Fans push from Below", "create.tooltip.chute.fans_push_down": "Fans push from Above", - "create.tooltip.chute.fans_pull_up": "Fans pull from Above", - "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", - "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.empty_bearing.title": "Update Bearing", - "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "Deployer Item Overflow", - "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.tooltip.chute.fans_pull_up": "Fans pull from Above", + "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.crafting_blueprint.crafting_slot": "Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "Display Slot", + "create.crafting_blueprint.inferred": "Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "Secondary Display Slot", + "create.crafting_blueprint.optional": "Optional", + "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", + "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.empty_bearing.title": "Update Bearing", + "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.hint.full_deployer.title": "Deployer Item Overflow", + "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", @@ -1611,27 +1618,24 @@ "create.ponder.cart_assembler_rails.header": "Other types of Minecarts and Rails", "create.ponder.cart_assembler_rails.text_1": "Cart Assemblers on Regular Tracks will not affect the passing carts' motion", - "create.ponder.cart_assembler_rails.text_2": "When on Powered or Controller Rail, the carts will be held in place until it's Powered", - "create.ponder.cart_assembler_rails.text_3": "Other types of Minecarts can be used as the anchor", - "create.ponder.cart_assembler_rails.text_4": "Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", - - "create.ponder.chain_drive.header": "Relaying rotational force with Chain Drives", - "create.ponder.chain_drive.text_1": "Chain Drives relay rotation to each other in a row", - "create.ponder.chain_drive.text_2": "All shafts connected like this will rotate in the same direction", - "create.ponder.chain_drive.text_3": "Any part of the row can be rotated by 90 degrees", - - "create.ponder.chain_gearshift.header": "Controlling rotational speed with Chain Gearshifts", - "create.ponder.chain_gearshift.text_1": "Unpowered Chain Gearshifts behave exacly like Chain Drives", - "create.ponder.chain_gearshift.text_2": "When Powered, the speed transmitted to other Chain Drives in the row is doubled", - "create.ponder.chain_gearshift.text_3": "Whenever the Powered Gearshift is not at the source, its speed will be halved instead", - "create.ponder.chain_gearshift.text_4": "In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", - "create.ponder.chain_gearshift.text_5": "Using analog signals, the ratio can be adjusted more precisely between 1 and 2", - "create.ponder.chain_gearshift.text_6": "12 RPM", - - "create.ponder.chute.header": "Transporting Items downward via Chutes", - "create.ponder.chute.text_1": "Chutes can transport items vertically from and to inventories", - "create.ponder.chute.text_2": "Using the Wrench, a window can be created", - "create.ponder.chute.text_3": "Placing chutes targeting the side faces of another will make it diagonal", + "create.ponder.cart_assembler_rails.text_2": "When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "Relaying rotational force with Chain Drives", + "create.ponder.chain_drive.text_1": "Chain Drives relay rotation to each other in a row", + "create.ponder.chain_drive.text_2": "All shafts connected like this will rotate in the same direction", + "create.ponder.chain_drive.text_3": "Any part of the row can be rotated by 90 degrees", + "create.ponder.chain_gearshift.header": "Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "Unpowered Chain Gearshifts behave exactly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "12 RPM", + "create.ponder.chute.header": "Transporting Items downward via Chutes", + "create.ponder.chute.text_1": "Chutes can transport items vertically from and to inventories", + "create.ponder.chute.text_2": "Using the Wrench, a window can be created", + "create.ponder.chute.text_3": "Placing chutes targeting the side faces of another will make it diagonal", "create.ponder.chute_upward.header": "Transporting Items upward via Chutes", "create.ponder.chute_upward.text_1": "Using Encased Fans at the top or bottom, a Chute can move items upward", 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 e9eca8365..8f302cd31 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 953", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "Akazienholzfenster", - "block.create.acacia_window_pane": "Akazienholzfensterscheibe", - "block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe", - "block.create.adjustable_crate": "Verstellbare Kiste", - "block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker", - "block.create.adjustable_repeater": "Verstellbarer Verstärker", - "block.create.analog_lever": "Analoger Schalter", + "_": "Missing Localizations: 968", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "Akazienholzfenster", + "block.create.acacia_window_pane": "Akazienholzfensterscheibe", + "block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe", + "block.create.adjustable_crate": "Verstellbare Kiste", + "block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker", + "block.create.adjustable_repeater": "Verstellbarer Verstärker", + "block.create.analog_lever": "Analoger Schalter", "block.create.andesite_belt_funnel": "Riementrichter aus Andesit", "block.create.andesite_bricks": "Andesitziegel", "block.create.andesite_bricks_slab": "Andesitziegelstufe", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "Gewichteter Werfer", "block.create.white_sail": "Weiße Segel", "block.create.white_seat": "Weißer Sitz", - "block.create.white_valve_handle": "Weißer Ventilgriff", - "block.create.windmill_bearing": "Windmühlenlager", - "block.create.wooden_bracket": "Holzhalterung", - "block.create.yellow_sail": "Gelbes Segel", - "block.create.yellow_seat": "Gelber Sitz", - "block.create.yellow_valve_handle": "Gelber Ventilgriff", - "block.create.zinc_block": "Zinkblock", - "block.create.zinc_ore": "Zinkerz", - - "entity.create.contraption": "Vorrichtung", - "entity.create.gantry_contraption": "Portalkran Vorrichtung", - "entity.create.seat": "Sitz", - "entity.create.stationary_contraption": "Stationäre Vorrichtung", - "entity.create.super_glue": "Superkleber", - - "fluid.create.milk": "Milch", - "fluid.create.potion": "Trank", - "fluid.create.tea": "Bauherrentee", - - "item.create.andesite_alloy": "Andesitlegierung", + "block.create.white_valve_handle": "Weißer Ventilgriff", + "block.create.windmill_bearing": "Windmühlenlager", + "block.create.wooden_bracket": "Holzhalterung", + "block.create.yellow_sail": "Gelbes Segel", + "block.create.yellow_seat": "Gelber Sitz", + "block.create.yellow_valve_handle": "Gelber Ventilgriff", + "block.create.zinc_block": "Zinkblock", + "block.create.zinc_ore": "Zinkerz", + "entity.create.contraption": "Vorrichtung", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "Portalkran Vorrichtung", + "entity.create.seat": "Sitz", + "entity.create.stationary_contraption": "Stationäre Vorrichtung", + "entity.create.super_glue": "Superkleber", + "fluid.create.milk": "Milch", + "fluid.create.potion": "Trank", + "fluid.create.tea": "Bauherrentee", + "item.create.andesite_alloy": "Andesitlegierung", "item.create.attribute_filter": "Attribut Filter", "item.create.bar_of_chocolate": "Schokoladentafel", "item.create.belt_connector": "Mechanischer Riemen", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "Messingklumpen", "item.create.brass_sheet": "Messingblech", "item.create.builders_tea": "Baumeisters Tee", - "item.create.chest_minecart_contraption": "Güterloren Vorrichtung", - "item.create.chocolate_bucket": "Schokoladeneimer", - "item.create.chocolate_glazed_berries": "Schokoladenglasierte Beeren", - "item.create.chromatic_compound": "Chromatische Verbindung", - "item.create.cinder_flour": "Aschenmehl", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "Kupferbarren", - "item.create.copper_nugget": "Kupferklumpen", - "item.create.copper_sheet": "Kupferblech", - "item.create.crafter_slot_cover": "Handwerkseinheit Slot Abdeckung", - "item.create.crushed_aluminum_ore": "Zerkleinertes Aluminiumerz", - "item.create.crushed_brass": "Zerkleinertes Messing", - "item.create.crushed_copper_ore": "Zerkleinertes Kupfererz", - "item.create.crushed_gold_ore": "Zerkleinertes Golderz", - "item.create.crushed_iron_ore": "Zerkleinertes Eisenerz", - "item.create.crushed_lead_ore": "Zerkleinertes Bleierz", - "item.create.crushed_nickel_ore": "Zerkleinertes Nickelerz", - "item.create.crushed_osmium_ore": "Zerkleinertes Osmiumerz", - "item.create.crushed_platinum_ore": "Zerkleinertes Platinerz", - "item.create.crushed_quicksilver_ore": "Zerkleinertes Quecksilbererz", + "item.create.chest_minecart_contraption": "Güterloren Vorrichtung", + "item.create.chocolate_bucket": "Schokoladeneimer", + "item.create.chocolate_glazed_berries": "Schokoladenglasierte Beeren", + "item.create.chromatic_compound": "Chromatische Verbindung", + "item.create.cinder_flour": "Aschenmehl", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "Kupferbarren", + "item.create.copper_nugget": "Kupferklumpen", + "item.create.copper_sheet": "Kupferblech", + "item.create.crafter_slot_cover": "Handwerkseinheit Slot Abdeckung", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "Zerkleinertes Aluminiumerz", + "item.create.crushed_brass": "Zerkleinertes Messing", + "item.create.crushed_copper_ore": "Zerkleinertes Kupfererz", + "item.create.crushed_gold_ore": "Zerkleinertes Golderz", + "item.create.crushed_iron_ore": "Zerkleinertes Eisenerz", + "item.create.crushed_lead_ore": "Zerkleinertes Bleierz", + "item.create.crushed_nickel_ore": "Zerkleinertes Nickelerz", + "item.create.crushed_osmium_ore": "Zerkleinertes Osmiumerz", + "item.create.crushed_platinum_ore": "Zerkleinertes Platinerz", + "item.create.crushed_quicksilver_ore": "Zerkleinertes Quecksilbererz", "item.create.crushed_silver_ore": "Zerkleinertes Silbererz", "item.create.crushed_tin_ore": "Zerkleinertes Zinnerz", "item.create.crushed_uranium_ore": "Zerkleinertes Uranerz", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create Paletten", - - "death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", - "death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet", - "death.attack.create.fan_lava": "%1$s wurde von Lava verweht", - "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", - "death.attack.create.mechanical_saw": "%1$s wurde zersägt", - "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", - - "create.block.deployer.damage_source_name": "einem Finger", - "create.block.cart_assembler.invalid": "Platziere deinen Lorenmonteur auf einer Schiene.", - - "create.recipe.crushing": "Mahlen (Mahlwerk)", - "create.recipe.milling": "Mahlen (Mahlstein)", - "create.recipe.fan_washing": "Sammelwaschen", - "create.recipe.fan_washing.fan": "Propeller hinter fließendem Wasser", - "create.recipe.fan_smoking": "Sammelräuchern", - "create.recipe.fan_smoking.fan": "Propeller hinter Feuer", - "create.recipe.fan_blasting": "Sammelschmelzen", - "create.recipe.fan_blasting.fan": "Propeller hinter Lava", - "create.recipe.pressing": "Mechanische Presse", + "death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", + "death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet", + "death.attack.create.fan_lava": "%1$s wurde von Lava verweht", + "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", + "death.attack.create.mechanical_saw": "%1$s wurde zersägt", + "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", + "create.block.deployer.damage_source_name": "einem Finger", + "create.block.cart_assembler.invalid": "Platziere deinen Lorenmonteur auf einer Schiene.", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "Mahlen (Mahlwerk)", + "create.recipe.milling": "Mahlen (Mahlstein)", + "create.recipe.fan_washing": "Sammelwaschen", + "create.recipe.fan_washing.fan": "Propeller hinter fließendem Wasser", + "create.recipe.fan_smoking": "Sammelräuchern", + "create.recipe.fan_smoking.fan": "Propeller hinter Feuer", + "create.recipe.fan_blasting": "Sammelschmelzen", + "create.recipe.fan_blasting.fan": "Propeller hinter Lava", + "create.recipe.pressing": "Mechanische Presse", "create.recipe.mixing": "Mixen", "create.recipe.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "Automatisiertes Formloses Bauen", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "Keine angeschlossenen Propeller", "create.tooltip.chute.fans_push_up": "Propeller schieben von unterhalb", "create.tooltip.chute.fans_push_down": "Propeller schieben von oberhalb", - "create.tooltip.chute.fans_pull_up": "Propeller ziehen von oberhalb", - "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", - "create.hint.mechanical_arm_no_targets": "Es schein dieser _Mechanische_ _Arm_ hat keine _Ziele_. Wähle Riemen, Depots oder Trichter und andere Blöcke indem du sie _Rechts-Klickst_ während du den _Mechanischen_ _Arm_ in deiner _Hand_ _hälst_.", - "create.hint.empty_bearing.title": "Aktualisiere Lager", - "create.hint.empty_bearing": "_Rechts-Klicke_ das Lager mit einer _leeren_ _Hand_ um die Struktur die du davor gebaut hast _anzubringen_.", - "create.hint.full_deployer.title": "Einsatzgerät Gegenstand Überlauf", - "create.hint.full_deployer": "Es scheint, dieses _Einsatzgerät_ enthält _überflüssige_ _Gegenstände_ die _extrahiert_ werden müssen. Nutze _Trichter_ oder anderes um ihn von seinem Überfluss zu befreien.", + "create.tooltip.chute.fans_pull_up": "Propeller ziehen von oberhalb", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "Es schein dieser _Mechanische_ _Arm_ hat keine _Ziele_. Wähle Riemen, Depots oder Trichter und andere Blöcke indem du sie _Rechts-Klickst_ während du den _Mechanischen_ _Arm_ in deiner _Hand_ _hälst_.", + "create.hint.empty_bearing.title": "Aktualisiere Lager", + "create.hint.empty_bearing": "_Rechts-Klicke_ das Lager mit einer _leeren_ _Hand_ um die Struktur die du davor gebaut hast _anzubringen_.", + "create.hint.full_deployer.title": "Einsatzgerät Gegenstand Überlauf", + "create.hint.full_deployer": "Es scheint, dieses _Einsatzgerät_ enthält _überflüssige_ _Gegenstände_ die _extrahiert_ werden müssen. Nutze _Trichter_ oder anderes um ihn von seinem Überfluss zu befreien.", "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "Dies ist ein Beispiel Overlay", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 fd3961305..c3cedde14 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 654", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "Ventana de acacia", - "block.create.acacia_window_pane": "Panel de ventana de acacia", - "block.create.adjustable_chain_gearshift": "Cadena de transmisión ajustable", - "block.create.adjustable_crate": "Caja ajustable", - "block.create.adjustable_pulse_repeater": "Repetidor de pulso ajustable", - "block.create.adjustable_repeater": "Repetidor ajustable", - "block.create.analog_lever": "Palanca analógica", + "_": "Missing Localizations: 669", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "Ventana de acacia", + "block.create.acacia_window_pane": "Panel de ventana de acacia", + "block.create.adjustable_chain_gearshift": "Cadena de transmisión ajustable", + "block.create.adjustable_crate": "Caja ajustable", + "block.create.adjustable_pulse_repeater": "Repetidor de pulso ajustable", + "block.create.adjustable_repeater": "Repetidor ajustable", + "block.create.analog_lever": "Palanca analógica", "block.create.andesite_belt_funnel": "Embudo de cinta de andesita", "block.create.andesite_bricks": "Ladrillos de andesita", "block.create.andesite_bricks_slab": "Losa de ladrillos de andesita", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", "block.create.white_sail": "Vela blanca", "block.create.white_seat": "Asiento blanco", - "block.create.white_valve_handle": "Asa de válvula blanco", - "block.create.windmill_bearing": "Rodamiento del molino de viento", - "block.create.wooden_bracket": "Soporte de madera para ejes", - "block.create.yellow_sail": "Vela amarilla", - "block.create.yellow_seat": "Asiento amarillo", - "block.create.yellow_valve_handle": "Asa de válvula amarillo", - "block.create.zinc_block": "Bloque de zinc", - "block.create.zinc_ore": "Mineral de zinc", - - "entity.create.contraption": "Artilugio", - "entity.create.gantry_contraption": "Artilugio de grúa", - "entity.create.seat": "Asiento", - "entity.create.stationary_contraption": "Artilugio estacionario", - "entity.create.super_glue": "Super Pegamento", - - "fluid.create.milk": "Leche", - "fluid.create.potion": "Poción", - "fluid.create.tea": "Té del Constructor", - - "item.create.andesite_alloy": "Aleación de andesita", + "block.create.white_valve_handle": "Asa de válvula blanco", + "block.create.windmill_bearing": "Rodamiento del molino de viento", + "block.create.wooden_bracket": "Soporte de madera para ejes", + "block.create.yellow_sail": "Vela amarilla", + "block.create.yellow_seat": "Asiento amarillo", + "block.create.yellow_valve_handle": "Asa de válvula amarillo", + "block.create.zinc_block": "Bloque de zinc", + "block.create.zinc_ore": "Mineral de zinc", + "entity.create.contraption": "Artilugio", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "Artilugio de grúa", + "entity.create.seat": "Asiento", + "entity.create.stationary_contraption": "Artilugio estacionario", + "entity.create.super_glue": "Super Pegamento", + "fluid.create.milk": "Leche", + "fluid.create.potion": "Poción", + "fluid.create.tea": "Té del Constructor", + "item.create.andesite_alloy": "Aleación de andesita", "item.create.attribute_filter": "Filtro de atributos", "item.create.bar_of_chocolate": "Barra de chocolate", "item.create.belt_connector": "Correa", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "Pepita de latón", "item.create.brass_sheet": "Lámina de latón", "item.create.builders_tea": "Té del Constructor", - "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", - "item.create.chocolate_bucket": "Cubo de chocolate", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", - "item.create.chromatic_compound": "Compuesto cromático", - "item.create.cinder_flour": "Harina de ceniza", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "Lingote de cobre", - "item.create.copper_nugget": "Pepita de cobre", - "item.create.copper_sheet": "Lámina de cobre", - "item.create.crafter_slot_cover": "Tapa de ranura del Autoensamblador mecánico", - "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", - "item.create.crushed_brass": "Latón molido", - "item.create.crushed_copper_ore": "Mineral de cobre molido", - "item.create.crushed_gold_ore": "Mineral de oro molido", - "item.create.crushed_iron_ore": "Mineral de hierro molido", - "item.create.crushed_lead_ore": "Mineral de plomo molido", - "item.create.crushed_nickel_ore": "Mineral de níquel molido", - "item.create.crushed_osmium_ore": "Mineral de osmio molido", - "item.create.crushed_platinum_ore": "Mineral de platino molido", - "item.create.crushed_quicksilver_ore": "Mineral de mercurio molido", + "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", + "item.create.chocolate_bucket": "Cubo de chocolate", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chromatic_compound": "Compuesto cromático", + "item.create.cinder_flour": "Harina de ceniza", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "Lingote de cobre", + "item.create.copper_nugget": "Pepita de cobre", + "item.create.copper_sheet": "Lámina de cobre", + "item.create.crafter_slot_cover": "Tapa de ranura del Autoensamblador mecánico", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", + "item.create.crushed_brass": "Latón molido", + "item.create.crushed_copper_ore": "Mineral de cobre molido", + "item.create.crushed_gold_ore": "Mineral de oro molido", + "item.create.crushed_iron_ore": "Mineral de hierro molido", + "item.create.crushed_lead_ore": "Mineral de plomo molido", + "item.create.crushed_nickel_ore": "Mineral de níquel molido", + "item.create.crushed_osmium_ore": "Mineral de osmio molido", + "item.create.crushed_platinum_ore": "Mineral de platino molido", + "item.create.crushed_quicksilver_ore": "Mineral de mercurio molido", "item.create.crushed_silver_ore": "Mineral de plata molido", "item.create.crushed_tin_ore": "Mineral de estaño molido", "item.create.crushed_uranium_ore": "Mineral de uranio molido", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Paletas", - - "death.attack.create.crush": "%1$s se procesó por las Ruedas de trituración", - "death.attack.create.fan_fire": "%1$s murió quemado por el aire caliente", - "death.attack.create.fan_lava": "%1$s murió quemado por un abanico de lava", - "death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico", - "death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica", - "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj cucú manipulado", - - "create.block.deployer.damage_source_name": "un Desplegador rebelde", - "create.block.cart_assembler.invalid": "Coloque su Ensamblador de vagonetas en un bloque de Raíles", - - "create.recipe.crushing": "Trituración", - "create.recipe.milling": "Fresado", - "create.recipe.fan_washing": "Lavado a granel", - "create.recipe.fan_washing.fan": "Ventilador detrás del agua fluyente", - "create.recipe.fan_smoking": "Ahumador a granel", - "create.recipe.fan_smoking.fan": "Ventilador detrás del fuego", - "create.recipe.fan_blasting": "Voladuras a granel", - "create.recipe.fan_blasting.fan": "Ventilador detrás de la lava", - "create.recipe.pressing": "Prensando", + "death.attack.create.crush": "%1$s se procesó por las Ruedas de trituración", + "death.attack.create.fan_fire": "%1$s murió quemado por el aire caliente", + "death.attack.create.fan_lava": "%1$s murió quemado por un abanico de lava", + "death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico", + "death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica", + "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj cucú manipulado", + "create.block.deployer.damage_source_name": "un Desplegador rebelde", + "create.block.cart_assembler.invalid": "Coloque su Ensamblador de vagonetas en un bloque de Raíles", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "Trituración", + "create.recipe.milling": "Fresado", + "create.recipe.fan_washing": "Lavado a granel", + "create.recipe.fan_washing.fan": "Ventilador detrás del agua fluyente", + "create.recipe.fan_smoking": "Ahumador a granel", + "create.recipe.fan_smoking.fan": "Ventilador detrás del fuego", + "create.recipe.fan_blasting": "Voladuras a granel", + "create.recipe.fan_blasting.fan": "Ventilador detrás de la lava", + "create.recipe.pressing": "Prensando", "create.recipe.mixing": "Mezclando", "create.recipe.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "Elaboración automatizada de productos sin forma", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "No hay ventiladores adjuntos", "create.tooltip.chute.fans_push_up": "Los ventiladores empujan desde abajo", "create.tooltip.chute.fans_push_down": "Los ventiladores empujan desde arriba", - "create.tooltip.chute.fans_pull_up": "Los ventiladores tiran desde arriba", - "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", - "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona correas, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", - "create.hint.empty_bearing.title": "Rodamiento de reloj", - "create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él", - "create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador", - "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento.", + "create.tooltip.chute.fans_pull_up": "Los ventiladores tiran desde arriba", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona correas, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", + "create.hint.empty_bearing.title": "Rodamiento de reloj", + "create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él", + "create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador", + "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento.", "create.gui.config.overlay1": "Hola :)", "create.gui.config.overlay2": "Esta es una muestra de la superposición", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 ed8f9dfdb..ab2a1d3c4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 1277", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "Ventana de Acacia", - "block.create.acacia_window_pane": "Panel de Ventana de Acacia", - "block.create.adjustable_chain_gearshift": "Cambio Ajustable de Velocidad de Cadena", - "block.create.adjustable_crate": "Caja Ajustable", - "block.create.adjustable_pulse_repeater": "Repetidor de Pulso Ajustable", - "block.create.adjustable_repeater": "Repetidor Ajustable", - "block.create.analog_lever": "Palanca Analogica", + "_": "Missing Localizations: 1292", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "Ventana de Acacia", + "block.create.acacia_window_pane": "Panel de Ventana de Acacia", + "block.create.adjustable_chain_gearshift": "Cambio Ajustable de Velocidad de Cadena", + "block.create.adjustable_crate": "Caja Ajustable", + "block.create.adjustable_pulse_repeater": "Repetidor de Pulso Ajustable", + "block.create.adjustable_repeater": "Repetidor Ajustable", + "block.create.analog_lever": "Palanca Analogica", "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", "block.create.andesite_bricks": "Ladrillos de Andesita", "block.create.andesite_bricks_slab": "Losa de Ladrillos de Andesita", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", "block.create.white_sail": "Vela Blanca", "block.create.white_seat": "Asiento Blanco", - "block.create.white_valve_handle": "Manija de Válvula Blanca", - "block.create.windmill_bearing": "Rodamiento de Molino de Viento", - "block.create.wooden_bracket": "Soporte de Madera", - "block.create.yellow_sail": "Vela Amarilla", - "block.create.yellow_seat": "Asiento Amarillo", - "block.create.yellow_valve_handle": "Manija de Válvula Amarilla", - "block.create.zinc_block": "Bloque de Zinc", - "block.create.zinc_ore": "Mineral de Zinc", - - "entity.create.contraption": "Artefacto", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", - "entity.create.seat": "Asiento", - "entity.create.stationary_contraption": "Artefacto Estacionario", - "entity.create.super_glue": "Super Pegamento", - - "fluid.create.milk": "Leche", - "fluid.create.potion": "Poción", - "fluid.create.tea": "Té del Constructor", - - "item.create.andesite_alloy": "Aleación de Andesita", + "block.create.white_valve_handle": "Manija de Válvula Blanca", + "block.create.windmill_bearing": "Rodamiento de Molino de Viento", + "block.create.wooden_bracket": "Soporte de Madera", + "block.create.yellow_sail": "Vela Amarilla", + "block.create.yellow_seat": "Asiento Amarillo", + "block.create.yellow_valve_handle": "Manija de Válvula Amarilla", + "block.create.zinc_block": "Bloque de Zinc", + "block.create.zinc_ore": "Mineral de Zinc", + "entity.create.contraption": "Artefacto", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.seat": "Asiento", + "entity.create.stationary_contraption": "Artefacto Estacionario", + "entity.create.super_glue": "Super Pegamento", + "fluid.create.milk": "Leche", + "fluid.create.potion": "Poción", + "fluid.create.tea": "Té del Constructor", + "item.create.andesite_alloy": "Aleación de Andesita", "item.create.attribute_filter": "Filtro por Atributos", "item.create.bar_of_chocolate": "Barra de Chocolate", "item.create.belt_connector": "Conector de Correa", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "Pepita de Latón", "item.create.brass_sheet": "Lámina de Latón", "item.create.builders_tea": "Té del Constructor", - "item.create.chest_minecart_contraption": "Artefacto de Vagón con Cofre", - "item.create.chocolate_bucket": "Cubeta de Chocolate", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", - "item.create.chromatic_compound": "Compuesto Cromático", - "item.create.cinder_flour": "Ceniza Molida", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "Lingote de Cobre", - "item.create.copper_nugget": "Pepita de Cobre", - "item.create.copper_sheet": "Lámina de Cobre", - "item.create.crafter_slot_cover": "Cubierta de Ranura del Crafter", - "item.create.crushed_aluminum_ore": "Mineral de Aluminio Molido", - "item.create.crushed_brass": "Latón Molido", - "item.create.crushed_copper_ore": "Mineral de Cobre Molido", - "item.create.crushed_gold_ore": "Mineral de Oro Molido", - "item.create.crushed_iron_ore": "Mineral de Hierro Molido", - "item.create.crushed_lead_ore": "Mineral de Plomo Molido", - "item.create.crushed_nickel_ore": "Mineral de Nickel Molido", - "item.create.crushed_osmium_ore": "Mineral de Osmio Molido", - "item.create.crushed_platinum_ore": "Mineral de Platino Molido", - "item.create.crushed_quicksilver_ore": "Mineral de Mercurio Molido", + "item.create.chest_minecart_contraption": "Artefacto de Vagón con Cofre", + "item.create.chocolate_bucket": "Cubeta de Chocolate", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chromatic_compound": "Compuesto Cromático", + "item.create.cinder_flour": "Ceniza Molida", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "Lingote de Cobre", + "item.create.copper_nugget": "Pepita de Cobre", + "item.create.copper_sheet": "Lámina de Cobre", + "item.create.crafter_slot_cover": "Cubierta de Ranura del Crafter", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "Mineral de Aluminio Molido", + "item.create.crushed_brass": "Latón Molido", + "item.create.crushed_copper_ore": "Mineral de Cobre Molido", + "item.create.crushed_gold_ore": "Mineral de Oro Molido", + "item.create.crushed_iron_ore": "Mineral de Hierro Molido", + "item.create.crushed_lead_ore": "Mineral de Plomo Molido", + "item.create.crushed_nickel_ore": "Mineral de Nickel Molido", + "item.create.crushed_osmium_ore": "Mineral de Osmio Molido", + "item.create.crushed_platinum_ore": "Mineral de Platino Molido", + "item.create.crushed_quicksilver_ore": "Mineral de Mercurio Molido", "item.create.crushed_silver_ore": "Mineral de Plata Molido", "item.create.crushed_tin_ore": "Mineral de Estaño Molido", "item.create.crushed_uranium_ore": "Mineral de Uranio Molido", @@ -662,26 +659,29 @@ "itemGroup.create.base": "UNLOCALIZED: Create", "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", - - "death.attack.create.crush": "UNLOCALIZED: %1$s was processed by Crushing Wheels", - "death.attack.create.fan_fire": "UNLOCALIZED: %1$s was burned to death by hot air", - "death.attack.create.fan_lava": "UNLOCALIZED: %1$s was burned to death by lava fan", - "death.attack.create.mechanical_drill": "UNLOCALIZED: %1$s was impaled by a Mechanical Drill", - "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", - "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", - - "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", - "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", - - "create.recipe.crushing": "UNLOCALIZED: Crushing", - "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", - "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", - "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", - "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", - "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", - "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", - "create.recipe.pressing": "UNLOCALIZED: Pressing", + "death.attack.create.crush": "UNLOCALIZED: %1$s was processed by Crushing Wheels", + "death.attack.create.fan_fire": "UNLOCALIZED: %1$s was burned to death by hot air", + "death.attack.create.fan_lava": "UNLOCALIZED: %1$s was burned to death by lava fan", + "death.attack.create.mechanical_drill": "UNLOCALIZED: %1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "UNLOCALIZED: Crushing", + "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.pressing": "UNLOCALIZED: Pressing", "create.recipe.mixing": "UNLOCALIZED: Mixing", "create.recipe.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", - "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", - "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", - "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", - "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", - "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", + "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 bb199c9dd..900028973 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 1205", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "Fenêtre en acacia", - "block.create.acacia_window_pane": "Vitre en acacia", - "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", - "block.create.adjustable_crate": "Caisse ajustable", - "block.create.adjustable_pulse_repeater": "Répéteur d'impulsions réglable", - "block.create.adjustable_repeater": "Répéteur réglable", - "block.create.analog_lever": "Levier analogique", + "_": "Missing Localizations: 1220", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "Fenêtre en acacia", + "block.create.acacia_window_pane": "Vitre en acacia", + "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", + "block.create.adjustable_crate": "Caisse ajustable", + "block.create.adjustable_pulse_repeater": "Répéteur d'impulsions réglable", + "block.create.adjustable_repeater": "Répéteur réglable", + "block.create.analog_lever": "Levier analogique", "block.create.andesite_belt_funnel": "Entonnoir en andésite pour tapis roulant", "block.create.andesite_bricks": "Briques d'andésite", "block.create.andesite_bricks_slab": "Dalle en briques d'andésite", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", - "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", - "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", - "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", - "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", - "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", - "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", - "block.create.zinc_block": "Bloc de zinc", - "block.create.zinc_ore": "Minerai de zinc", - - "entity.create.contraption": "Engin", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", - "entity.create.seat": "Siège", - "entity.create.stationary_contraption": "Engin stationnaire", - "entity.create.super_glue": "Colle extra-forte", - - "fluid.create.milk": "Lait", - "fluid.create.potion": "Potion", - "fluid.create.tea": "Thé du constructeur", - - "item.create.andesite_alloy": "Alliage d'andésite", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", + "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", + "block.create.zinc_block": "Bloc de zinc", + "block.create.zinc_ore": "Minerai de zinc", + "entity.create.contraption": "Engin", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.seat": "Siège", + "entity.create.stationary_contraption": "Engin stationnaire", + "entity.create.super_glue": "Colle extra-forte", + "fluid.create.milk": "Lait", + "fluid.create.potion": "Potion", + "fluid.create.tea": "Thé du constructeur", + "item.create.andesite_alloy": "Alliage d'andésite", "item.create.attribute_filter": "Filtre d'attribut", "item.create.bar_of_chocolate": "Barre de chocolat", "item.create.belt_connector": "Tapis roulant", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "Pépite de laiton", "item.create.brass_sheet": "Plaques de laiton", "item.create.builders_tea": "Thé du constructeur", - "item.create.chest_minecart_contraption": "Engin de wagonnet avec coffre", - "item.create.chocolate_bucket": "Seau de chocolat", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", - "item.create.chromatic_compound": "Composé chromatique", - "item.create.cinder_flour": "Farine de braise", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "Lingot de cuivre", - "item.create.copper_nugget": "Pépite de cuivre", - "item.create.copper_sheet": "Plaques de cuivre", - "item.create.crafter_slot_cover": "Couvercle", - "item.create.crushed_aluminum_ore": "Aluminium concassé", - "item.create.crushed_brass": "Laiton concassé", - "item.create.crushed_copper_ore": "Cuivre concassé", - "item.create.crushed_gold_ore": "Or concassé", - "item.create.crushed_iron_ore": "Fer concassé", - "item.create.crushed_lead_ore": "Plomb concassé", - "item.create.crushed_nickel_ore": "Nickel concassé", - "item.create.crushed_osmium_ore": "Osmium concassé", - "item.create.crushed_platinum_ore": "Platinium concassé", - "item.create.crushed_quicksilver_ore": "Vif-argent concassé", + "item.create.chest_minecart_contraption": "Engin de wagonnet avec coffre", + "item.create.chocolate_bucket": "Seau de chocolat", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chromatic_compound": "Composé chromatique", + "item.create.cinder_flour": "Farine de braise", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "Lingot de cuivre", + "item.create.copper_nugget": "Pépite de cuivre", + "item.create.copper_sheet": "Plaques de cuivre", + "item.create.crafter_slot_cover": "Couvercle", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "Aluminium concassé", + "item.create.crushed_brass": "Laiton concassé", + "item.create.crushed_copper_ore": "Cuivre concassé", + "item.create.crushed_gold_ore": "Or concassé", + "item.create.crushed_iron_ore": "Fer concassé", + "item.create.crushed_lead_ore": "Plomb concassé", + "item.create.crushed_nickel_ore": "Nickel concassé", + "item.create.crushed_osmium_ore": "Osmium concassé", + "item.create.crushed_platinum_ore": "Platinium concassé", + "item.create.crushed_quicksilver_ore": "Vif-argent concassé", "item.create.crushed_silver_ore": "Argent concassé", "item.create.crushed_tin_ore": "Etain concassé", "item.create.crushed_uranium_ore": "Uranium concassé", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create Palettes", - - "death.attack.create.crush": "%1$s a été concassé.e", - "death.attack.create.fan_fire": "%1$s a été brûlé à mort par l'air chaud", - "death.attack.create.fan_lava": "%1$s a été brûlé à mort par un ventilateur de lave", - "death.attack.create.mechanical_drill": "%1$s a été empalé par une perceuse mécanique", - "death.attack.create.mechanical_saw": "%1$s a été coupé en deux par une scie mécanique", - "death.attack.create.cuckoo_clock_explosion": "%1$s a été explosé par un coucou trafiquée", - - "create.block.deployer.damage_source_name": "un déployeur voyou", - "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", - - "create.recipe.crushing": "Ecrasement", - "create.recipe.milling": "Mouture", - "create.recipe.fan_washing": "Lavage", - "create.recipe.fan_washing.fan": "Ventilateur derrière de l'eau", - "create.recipe.fan_smoking": "Fumage", - "create.recipe.fan_smoking.fan": "Ventilateur derrière du feu", - "create.recipe.fan_blasting": "Fonte", - "create.recipe.fan_blasting.fan": "Ventilateur derrière de la lave", - "create.recipe.pressing": "Pressage", + "death.attack.create.crush": "%1$s a été concassé.e", + "death.attack.create.fan_fire": "%1$s a été brûlé à mort par l'air chaud", + "death.attack.create.fan_lava": "%1$s a été brûlé à mort par un ventilateur de lave", + "death.attack.create.mechanical_drill": "%1$s a été empalé par une perceuse mécanique", + "death.attack.create.mechanical_saw": "%1$s a été coupé en deux par une scie mécanique", + "death.attack.create.cuckoo_clock_explosion": "%1$s a été explosé par un coucou trafiquée", + "create.block.deployer.damage_source_name": "un déployeur voyou", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "Ecrasement", + "create.recipe.milling": "Mouture", + "create.recipe.fan_washing": "Lavage", + "create.recipe.fan_washing.fan": "Ventilateur derrière de l'eau", + "create.recipe.fan_smoking": "Fumage", + "create.recipe.fan_smoking.fan": "Ventilateur derrière du feu", + "create.recipe.fan_blasting": "Fonte", + "create.recipe.fan_blasting.fan": "Ventilateur derrière de la lave", + "create.recipe.pressing": "Pressage", "create.recipe.mixing": "Mixage", "create.recipe.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", - "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", - "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", - "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", - "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", - "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", + "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 6c80f9860..cb2f4c0c1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 671", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "Finestra di acacia", - "block.create.acacia_window_pane": "Pannello di finestra di acacia", - "block.create.adjustable_chain_gearshift": "Cambio a catena regolabile", - "block.create.adjustable_crate": "Baule regolabile", - "block.create.adjustable_pulse_repeater": "Ripetitore di impulsi regolabile", - "block.create.adjustable_repeater": "Ripetitore regolabile", - "block.create.analog_lever": "Leva analogica", + "_": "Missing Localizations: 686", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "Finestra di acacia", + "block.create.acacia_window_pane": "Pannello di finestra di acacia", + "block.create.adjustable_chain_gearshift": "Cambio a catena regolabile", + "block.create.adjustable_crate": "Baule regolabile", + "block.create.adjustable_pulse_repeater": "Ripetitore di impulsi regolabile", + "block.create.adjustable_repeater": "Ripetitore regolabile", + "block.create.analog_lever": "Leva analogica", "block.create.andesite_belt_funnel": "Imbuto per nastro di andesite", "block.create.andesite_bricks": "Mattoni di andesite", "block.create.andesite_bricks_slab": "Lastra di mattoni di andesite", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", "block.create.white_sail": "Vela bianca", "block.create.white_seat": "Sedile bianco", - "block.create.white_valve_handle": "Maniglia per valvola bianca", - "block.create.windmill_bearing": "Supporto per mulino a vento", - "block.create.wooden_bracket": "Supporto di legno", - "block.create.yellow_sail": "Vela gialla", - "block.create.yellow_seat": "Sedile giallo", - "block.create.yellow_valve_handle": "Maniglia per valvola gialla", - "block.create.zinc_block": "Blocco di zinco", - "block.create.zinc_ore": "Zinco grezzo", - - "entity.create.contraption": "Contrazione", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", - "entity.create.seat": "Sedile", - "entity.create.stationary_contraption": "Contrazione stazionaria", - "entity.create.super_glue": "Super colla", - - "fluid.create.milk": "Latte", - "fluid.create.potion": "Pozione", - "fluid.create.tea": "Tè del costruttore", - - "item.create.andesite_alloy": "Lega di andesite", + "block.create.white_valve_handle": "Maniglia per valvola bianca", + "block.create.windmill_bearing": "Supporto per mulino a vento", + "block.create.wooden_bracket": "Supporto di legno", + "block.create.yellow_sail": "Vela gialla", + "block.create.yellow_seat": "Sedile giallo", + "block.create.yellow_valve_handle": "Maniglia per valvola gialla", + "block.create.zinc_block": "Blocco di zinco", + "block.create.zinc_ore": "Zinco grezzo", + "entity.create.contraption": "Contrazione", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.seat": "Sedile", + "entity.create.stationary_contraption": "Contrazione stazionaria", + "entity.create.super_glue": "Super colla", + "fluid.create.milk": "Latte", + "fluid.create.potion": "Pozione", + "fluid.create.tea": "Tè del costruttore", + "item.create.andesite_alloy": "Lega di andesite", "item.create.attribute_filter": "Filtro attributi", "item.create.bar_of_chocolate": "Barretta di cioccolato", "item.create.belt_connector": "Nastro meccanico", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "Pepita di ottone", "item.create.brass_sheet": "Lamiera di ottone", "item.create.builders_tea": "Tè del costruttore", - "item.create.chest_minecart_contraption": "Contrazione per carrello da miniera con baule", - "item.create.chocolate_bucket": "Secchio di cioccolata", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", - "item.create.chromatic_compound": "Composto cromatico", - "item.create.cinder_flour": "Cenere farinosa", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "Lingotto di rame", - "item.create.copper_nugget": "Pepita di rame", - "item.create.copper_sheet": "Lamiera di rame", - "item.create.crafter_slot_cover": "Rivestimento per slot da costruzione", - "item.create.crushed_aluminum_ore": "Alluminio grezzo frantumato", - "item.create.crushed_brass": "Ottone frantumato", - "item.create.crushed_copper_ore": "Rame grezzo frantumato", - "item.create.crushed_gold_ore": "Oro grezzo frantumato", - "item.create.crushed_iron_ore": "Ferro grezzo frantumato", - "item.create.crushed_lead_ore": "Piombo grezzo frantumato", - "item.create.crushed_nickel_ore": "Nichel grezzo frantumato", - "item.create.crushed_osmium_ore": "Osmio grezzo frantumato", - "item.create.crushed_platinum_ore": "Platino grezzo frantumato", - "item.create.crushed_quicksilver_ore": "Mercurio grezzo frantumato", + "item.create.chest_minecart_contraption": "Contrazione per carrello da miniera con baule", + "item.create.chocolate_bucket": "Secchio di cioccolata", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chromatic_compound": "Composto cromatico", + "item.create.cinder_flour": "Cenere farinosa", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "Lingotto di rame", + "item.create.copper_nugget": "Pepita di rame", + "item.create.copper_sheet": "Lamiera di rame", + "item.create.crafter_slot_cover": "Rivestimento per slot da costruzione", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "Alluminio grezzo frantumato", + "item.create.crushed_brass": "Ottone frantumato", + "item.create.crushed_copper_ore": "Rame grezzo frantumato", + "item.create.crushed_gold_ore": "Oro grezzo frantumato", + "item.create.crushed_iron_ore": "Ferro grezzo frantumato", + "item.create.crushed_lead_ore": "Piombo grezzo frantumato", + "item.create.crushed_nickel_ore": "Nichel grezzo frantumato", + "item.create.crushed_osmium_ore": "Osmio grezzo frantumato", + "item.create.crushed_platinum_ore": "Platino grezzo frantumato", + "item.create.crushed_quicksilver_ore": "Mercurio grezzo frantumato", "item.create.crushed_silver_ore": "Argento grezzo frantumato", "item.create.crushed_tin_ore": "Stagno grezzo frantumato", "item.create.crushed_uranium_ore": "Uranio grezzo frantumato", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create: Blocchi", - - "death.attack.create.crush": "%1$s è stato frantumato", - "death.attack.create.fan_fire": "%1$s è stato bruciato dall'aria calda", - "death.attack.create.fan_lava": "%1$s è stato bruciato dal ventilatore di lava", - "death.attack.create.mechanical_drill": "%1$s è stato trafitto dal trapano meccanico", - "death.attack.create.mechanical_saw": "%1$s è stato tagliato a metà dalla sega meccanica", - "death.attack.create.cuckoo_clock_explosion": "%1$s è saltato in aria da un orologio a cucù manomesso", - - "create.block.deployer.damage_source_name": "un disadattato", - "create.block.cart_assembler.invalid": "Piazza il tuo assemblatore di carrelli da miniera su un binario", - - "create.recipe.crushing": "Frantumazione", - "create.recipe.milling": "Macinatura", - "create.recipe.fan_washing": "Lavaggio volumetrico", - "create.recipe.fan_washing.fan": "Ventilatore dietro l'acqua corrente", - "create.recipe.fan_smoking": "Fumo volumetrico", - "create.recipe.fan_smoking.fan": "Ventilatore dietro il fuoco", - "create.recipe.fan_blasting": "Esplosione volumetrica", - "create.recipe.fan_blasting.fan": "Ventilatore dietro la lava", - "create.recipe.pressing": "Pressatura", + "death.attack.create.crush": "%1$s è stato frantumato", + "death.attack.create.fan_fire": "%1$s è stato bruciato dall'aria calda", + "death.attack.create.fan_lava": "%1$s è stato bruciato dal ventilatore di lava", + "death.attack.create.mechanical_drill": "%1$s è stato trafitto dal trapano meccanico", + "death.attack.create.mechanical_saw": "%1$s è stato tagliato a metà dalla sega meccanica", + "death.attack.create.cuckoo_clock_explosion": "%1$s è saltato in aria da un orologio a cucù manomesso", + "create.block.deployer.damage_source_name": "un disadattato", + "create.block.cart_assembler.invalid": "Piazza il tuo assemblatore di carrelli da miniera su un binario", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "Frantumazione", + "create.recipe.milling": "Macinatura", + "create.recipe.fan_washing": "Lavaggio volumetrico", + "create.recipe.fan_washing.fan": "Ventilatore dietro l'acqua corrente", + "create.recipe.fan_smoking": "Fumo volumetrico", + "create.recipe.fan_smoking.fan": "Ventilatore dietro il fuoco", + "create.recipe.fan_blasting": "Esplosione volumetrica", + "create.recipe.fan_blasting.fan": "Ventilatore dietro la lava", + "create.recipe.pressing": "Pressatura", "create.recipe.mixing": "Mescolamento", "create.recipe.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "Costruzione informe automatizzata", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "Nessun ventilatore attaccato", "create.tooltip.chute.fans_push_up": "I ventilatori spingono da sotto", "create.tooltip.chute.fans_push_down": "I ventilatori spingono da sopra", - "create.tooltip.chute.fans_pull_up": "I ventilatori tirano da sopra", - "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", - "create.hint.mechanical_arm_no_targets": "Sembra che questo _braccio_ _meccanico_ non sia stato assegnato a nessun _bersaglio_. Seleziona nastri, depositi, imbuti e altri blocchi _cliccandoli_ _col_ _destro_ e _tenendo_ _in_ _mano_ il _braccio_ _meccanico_.", - "create.hint.empty_bearing.title": "Aggiorna il supporto", - "create.hint.empty_bearing": "_Clicca_ _col_ _destro_ il supporto con una _mano_ _vuota_ per _attaccarci_ la struttura che ci hai appena costruito davanti.", - "create.hint.full_deployer.title": "Overflow di oggetti dell'installatore", - "create.hint.full_deployer": "Sembra che questo _installatore_ contenga _oggetti_ _eccessivi_ che necessitano di essere _estratti_. Usa una _tramoggia_, un _imbuto_ o altro per liberarlo dall'overflow.", + "create.tooltip.chute.fans_pull_up": "I ventilatori tirano da sopra", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "Sembra che questo _braccio_ _meccanico_ non sia stato assegnato a nessun _bersaglio_. Seleziona nastri, depositi, imbuti e altri blocchi _cliccandoli_ _col_ _destro_ e _tenendo_ _in_ _mano_ il _braccio_ _meccanico_.", + "create.hint.empty_bearing.title": "Aggiorna il supporto", + "create.hint.empty_bearing": "_Clicca_ _col_ _destro_ il supporto con una _mano_ _vuota_ per _attaccarci_ la struttura che ci hai appena costruito davanti.", + "create.hint.full_deployer.title": "Overflow di oggetti dell'installatore", + "create.hint.full_deployer": "Sembra che questo _installatore_ contenga _oggetti_ _eccessivi_ che necessitano di essere _estratti_. Usa una _tramoggia_, un _imbuto_ o altro per liberarlo dall'overflow.", "create.gui.config.overlay1": "Ciao :)", "create.gui.config.overlay2": "Questo overlay è di esempio", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 4e2783d3f..050bf7304 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 35", - - "_": "->------------------------] 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": "アナログレバー", + "_": "Missing Localizations: 50", + "_": "->------------------------] 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": "安山岩レンガのハーフブロック", @@ -404,26 +402,24 @@ "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": "安山岩合金", + "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.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "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": "メカニカルベルト", @@ -434,26 +430,27 @@ "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_backtank": "UNLOCALIZED: Copper Backtank", - "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.chest_minecart_contraption": "からくりチェスト付きトロッコ", + "item.create.chocolate_bucket": "チョコレート入りバケツ", + "item.create.chocolate_glazed_berries": "チョコレートグレーズドベリー", + "item.create.chromatic_compound": "色彩の化合物", + "item.create.cinder_flour": "ネザーラックの粉", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "銅インゴット", + "item.create.copper_nugget": "銅塊", + "item.create.copper_sheet": "銅板", + "item.create.crafter_slot_cover": "クラフタースロットカバー", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "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": "砕いたウラン鉱石", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "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": "プレス", + "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.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "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.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "自動不定形クラフト", @@ -1102,24 +1102,29 @@ "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.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": "ターゲットが見つかりません", - "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.tooltip.chute.fans_pull_up": "ファンが上から吸い込んでいます", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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": "これはオーバーレイのサンプルです", @@ -2119,4 +2124,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 4c28e0a5f..fff79c695 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 724", - - "_": "->------------------------] 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": "아날로그 레버", + "_": "Missing Localizations: 739", + "_": "->------------------------] 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": "안산암 벽돌 반 블록", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "UNLOCALIZED: 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": "UNLOCALIZED: 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": "안산암 합금", + "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.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "UNLOCALIZED: 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": "기계식 벨트", @@ -434,26 +430,27 @@ "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": "UNLOCALIZED: Chocolate Glazed Berries", - "item.create.chromatic_compound": "색채 혼합물", - "item.create.cinder_flour": "잿가루", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "구리 주괴", - "item.create.copper_nugget": "구리 조각", - "item.create.copper_sheet": "구리 판", - "item.create.crafter_slot_cover": "조합기 슬롯 덮개", - "item.create.crushed_aluminum_ore": "UNLOCALIZED: 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": "UNLOCALIZED: Crushed Lead Ore", - "item.create.crushed_nickel_ore": "UNLOCALIZED: Crushed Nickel Ore", - "item.create.crushed_osmium_ore": "UNLOCALIZED: Crushed Osmium Ore", - "item.create.crushed_platinum_ore": "UNLOCALIZED: Crushed Platinum Ore", - "item.create.crushed_quicksilver_ore": "UNLOCALIZED: Crushed Quicksilver Ore", + "item.create.chest_minecart_contraption": "상자가 실린 광산 수레 장치", + "item.create.chocolate_bucket": "초콜릿 양동이", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chromatic_compound": "색채 혼합물", + "item.create.cinder_flour": "잿가루", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "구리 주괴", + "item.create.copper_nugget": "구리 조각", + "item.create.copper_sheet": "구리 판", + "item.create.crafter_slot_cover": "조합기 슬롯 덮개", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "UNLOCALIZED: 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": "UNLOCALIZED: Crushed Lead Ore", + "item.create.crushed_nickel_ore": "UNLOCALIZED: Crushed Nickel Ore", + "item.create.crushed_osmium_ore": "UNLOCALIZED: Crushed Osmium Ore", + "item.create.crushed_platinum_ore": "UNLOCALIZED: Crushed Platinum Ore", + "item.create.crushed_quicksilver_ore": "UNLOCALIZED: Crushed Quicksilver Ore", "item.create.crushed_silver_ore": "UNLOCALIZED: Crushed Silver Ore", "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create 팔레트", - - "death.attack.create.crush": "%1$s이(가) 분쇄 휠에 의해 가공되었습니다", - "death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 의해 익어버렸습니다", - "death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 구워졌습니다", - "death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다", - "death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다", - "death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", - - "create.block.deployer.damage_source_name": "배포기", - "create.block.cart_assembler.invalid": "카트조립기를 레일 위에 설치하세요", - - "create.recipe.crushing": "분쇄", - "create.recipe.milling": "맷돌질", - "create.recipe.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": "압착", + "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.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "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.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "무형 자동 조합", @@ -1102,24 +1102,29 @@ "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": "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": "목표 없음", - "create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않은 것 같습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 깔때기를 _우클릭_하여 목표로 지정하세요.", - "create.hint.empty_bearing.title": "베어링 업데이트_", - "create.hint.empty_bearing": "_맨 손_으로 베어링을 _우클릭_하여 구조물을 _부착_하세요.", - "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", - "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.tooltip.chute.fans_pull_up": "선풍기가 위에서 당김", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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": "목표 없음", + "create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않은 것 같습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 깔때기를 _우클릭_하여 목표로 지정하세요.", + "create.hint.empty_bearing.title": "베어링 업데이트_", + "create.hint.empty_bearing": "_맨 손_으로 베어링을 _우클릭_하여 구조물을 _부착_하세요.", + "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", + "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 cf7c6b7f9..2fcd26057 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 1588", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "UNLOCALIZED: Acacia Window", - "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", - "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", - "block.create.adjustable_crate": "FlexKrat", - "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", - "block.create.adjustable_repeater": "FlexSterker", - "block.create.analog_lever": "UNLOCALIZED: Analog Lever", + "_": "Missing Localizations: 1603", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", + "block.create.adjustable_crate": "FlexKrat", + "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", + "block.create.adjustable_repeater": "FlexSterker", + "block.create.analog_lever": "UNLOCALIZED: Analog Lever", "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", "block.create.andesite_bricks": "Andesietstenen", "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", - "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", - "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", - "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", - "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", - "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", - "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", - "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", - "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", - - "entity.create.contraption": "UNLOCALIZED: Contraption", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", - "entity.create.seat": "UNLOCALIZED: Seat", - "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", - "entity.create.super_glue": "UNLOCALIZED: Super Glue", - - "fluid.create.milk": "UNLOCALIZED: Milk", - "fluid.create.potion": "UNLOCALIZED: Potion", - "fluid.create.tea": "UNLOCALIZED: Builder's Tea", - - "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", + "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", + "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", + "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.seat": "UNLOCALIZED: Seat", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.milk": "UNLOCALIZED: Milk", + "fluid.create.potion": "UNLOCALIZED: Potion", + "fluid.create.tea": "UNLOCALIZED: Builder's Tea", + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate", "item.create.belt_connector": "Mechanische Transportband", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "Brons klompje", "item.create.brass_sheet": "Brons Platen", "item.create.builders_tea": "UNLOCALIZED: Builder's Tea", - "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", - "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", - "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", - "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "Koperstaaf", - "item.create.copper_nugget": "Koper klompje", - "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", - "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", - "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", - "item.create.crushed_brass": "Gemalen Brons", - "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", - "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", - "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", - "item.create.crushed_lead_ore": "UNLOCALIZED: Crushed Lead Ore", - "item.create.crushed_nickel_ore": "UNLOCALIZED: Crushed Nickel Ore", - "item.create.crushed_osmium_ore": "UNLOCALIZED: Crushed Osmium Ore", - "item.create.crushed_platinum_ore": "UNLOCALIZED: Crushed Platinum Ore", - "item.create.crushed_quicksilver_ore": "UNLOCALIZED: Crushed Quicksilver Ore", + "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", + "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", + "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "Koperstaaf", + "item.create.copper_nugget": "Koper klompje", + "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", + "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", + "item.create.crushed_brass": "Gemalen Brons", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_lead_ore": "UNLOCALIZED: Crushed Lead Ore", + "item.create.crushed_nickel_ore": "UNLOCALIZED: Crushed Nickel Ore", + "item.create.crushed_osmium_ore": "UNLOCALIZED: Crushed Osmium Ore", + "item.create.crushed_platinum_ore": "UNLOCALIZED: Crushed Platinum Ore", + "item.create.crushed_quicksilver_ore": "UNLOCALIZED: Crushed Quicksilver Ore", "item.create.crushed_silver_ore": "UNLOCALIZED: Crushed Silver Ore", "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", @@ -662,26 +659,29 @@ "itemGroup.create.base": "UNLOCALIZED: Create", "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", - - "death.attack.create.crush": "%1$s is verwerkd door verpulverende wielen", - "death.attack.create.fan_fire": "%1$s is verbrand door hete lucht", - "death.attack.create.fan_lava": "%1$s is verbrand door een lava ventilator", - "death.attack.create.mechanical_drill": "%1$s is gespietst door een mechanische boor", - "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", - "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", - - "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", - "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", - - "create.recipe.crushing": "Verpulveren", - "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", - "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", - "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", - "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", - "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", - "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", - "create.recipe.pressing": "Persen", + "death.attack.create.crush": "%1$s is verwerkd door verpulverende wielen", + "death.attack.create.fan_fire": "%1$s is verbrand door hete lucht", + "death.attack.create.fan_lava": "%1$s is verbrand door een lava ventilator", + "death.attack.create.mechanical_drill": "%1$s is gespietst door een mechanische boor", + "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "Verpulveren", + "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.pressing": "Persen", "create.recipe.mixing": "Mengen", "create.recipe.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", - "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", - "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", - "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", - "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", - "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", + "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 409334069..d7397f94b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 11", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "Akacjowe okno", - "block.create.acacia_window_pane": "Akacjowa szyba okienna", - "block.create.adjustable_chain_gearshift": "Regulowany przekładnik łańcuchowy", - "block.create.adjustable_crate": "Regulowana skrzynka", - "block.create.adjustable_pulse_repeater": "Regulowany przekaźnik pulsu", - "block.create.adjustable_repeater": "Regulowany przekaźnik", - "block.create.analog_lever": "Dźwignia analogowa", + "_": "Missing Localizations: 26", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "Akacjowe okno", + "block.create.acacia_window_pane": "Akacjowa szyba okienna", + "block.create.adjustable_chain_gearshift": "Regulowany przekładnik łańcuchowy", + "block.create.adjustable_crate": "Regulowana skrzynka", + "block.create.adjustable_pulse_repeater": "Regulowany przekaźnik pulsu", + "block.create.adjustable_repeater": "Regulowany przekaźnik", + "block.create.analog_lever": "Dźwignia analogowa", "block.create.andesite_belt_funnel": "Andezytowy lejek taśmowy", "block.create.andesite_bricks": "Andezytowe cegły", "block.create.andesite_bricks_slab": "Andezytowa ceglana płyta", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "Wyrzutnia odważnikowa", "block.create.white_sail": "Biały żagiel", "block.create.white_seat": "Białe siedzenie", - "block.create.white_valve_handle": "Białe pokrętło", - "block.create.windmill_bearing": "Łożysko wiatraka", - "block.create.wooden_bracket": "Drewniany wspornik", - "block.create.yellow_sail": "Żółty żagiel", - "block.create.yellow_seat": "Żółte siedzenie", - "block.create.yellow_valve_handle": "Żółte pokrętło", - "block.create.zinc_block": "Blok cynku", - "block.create.zinc_ore": "Ruda cynku", - - "entity.create.contraption": "Maszyna", - "entity.create.gantry_contraption": "Maszyna suwnicowa", - "entity.create.seat": "Siedzenie", - "entity.create.stationary_contraption": "Maszyna stacjonarna", - "entity.create.super_glue": "Super Glue", - - "fluid.create.milk": "Mleko", - "fluid.create.potion": "Mikstura", - "fluid.create.tea": "Herbatka Budowniczego", - - "item.create.andesite_alloy": "Stop andezytu", + "block.create.white_valve_handle": "Białe pokrętło", + "block.create.windmill_bearing": "Łożysko wiatraka", + "block.create.wooden_bracket": "Drewniany wspornik", + "block.create.yellow_sail": "Żółty żagiel", + "block.create.yellow_seat": "Żółte siedzenie", + "block.create.yellow_valve_handle": "Żółte pokrętło", + "block.create.zinc_block": "Blok cynku", + "block.create.zinc_ore": "Ruda cynku", + "entity.create.contraption": "Maszyna", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "Maszyna suwnicowa", + "entity.create.seat": "Siedzenie", + "entity.create.stationary_contraption": "Maszyna stacjonarna", + "entity.create.super_glue": "Super Glue", + "fluid.create.milk": "Mleko", + "fluid.create.potion": "Mikstura", + "fluid.create.tea": "Herbatka Budowniczego", + "item.create.andesite_alloy": "Stop andezytu", "item.create.attribute_filter": "Filtr atrybutowy", "item.create.bar_of_chocolate": "Tabliczka czekolady", "item.create.belt_connector": "Taśma", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "Bryłka mosiądzu", "item.create.brass_sheet": "Arkusz mosiądzu", "item.create.builders_tea": "Herbatka Budowniczego", - "item.create.chest_minecart_contraption": "Maszyna w wagoniku ze skrzynią", - "item.create.chocolate_bucket": "Wiadro czekolady", - "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", - "item.create.crafter_slot_cover": "Przykrywka na slot stołu rzemieślniczego", - "item.create.crushed_aluminum_ore": "Rozkruszona ruda żelaza", - "item.create.crushed_brass": "Rozkruszony mosiądz", - "item.create.crushed_copper_ore": "Rozkruszona ruda miedzi", - "item.create.crushed_gold_ore": "Rozkruszona ruda złota", - "item.create.crushed_iron_ore": "Rozkruszona ruda żelaza", - "item.create.crushed_lead_ore": "Rozkruszona ruda ołowiu", - "item.create.crushed_nickel_ore": "Rozkruszona ruda niklu", - "item.create.crushed_osmium_ore": "Rozkruszona ruda osmu", - "item.create.crushed_platinum_ore": "Rozkruszona ruda platyny", - "item.create.crushed_quicksilver_ore": "Rozkruszona ruda rtęci", + "item.create.chest_minecart_contraption": "Maszyna w wagoniku ze skrzynią", + "item.create.chocolate_bucket": "Wiadro czekolady", + "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", + "item.create.crafter_slot_cover": "Przykrywka na slot stołu rzemieślniczego", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "Rozkruszona ruda żelaza", + "item.create.crushed_brass": "Rozkruszony mosiądz", + "item.create.crushed_copper_ore": "Rozkruszona ruda miedzi", + "item.create.crushed_gold_ore": "Rozkruszona ruda złota", + "item.create.crushed_iron_ore": "Rozkruszona ruda żelaza", + "item.create.crushed_lead_ore": "Rozkruszona ruda ołowiu", + "item.create.crushed_nickel_ore": "Rozkruszona ruda niklu", + "item.create.crushed_osmium_ore": "Rozkruszona ruda osmu", + "item.create.crushed_platinum_ore": "Rozkruszona ruda platyny", + "item.create.crushed_quicksilver_ore": "Rozkruszona ruda rtęci", "item.create.crushed_silver_ore": "Rozkruszona ruda srebra", "item.create.crushed_tin_ore": "Rozkruszona ruda cyny", "item.create.crushed_uranium_ore": "Rozkruszona ruda uranu", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Palety Create", - - "death.attack.create.crush": "Gracz %1$s został zgnieciony przez koło kruszące", - "death.attack.create.fan_fire": "Gracz %1$s poparzył się gorącym powietrzem", - "death.attack.create.fan_lava": "Gracz %1$s poparzył się kroplami lawy", - "death.attack.create.mechanical_drill": "Gracz %1$s nabił się na mechaniczne wiertło", - "death.attack.create.mechanical_saw": "Gracz %1$s został przecięty na pół przez mechaniczną piłę", - "death.attack.create.cuckoo_clock_explosion": "Gracz %1$s został wysadzony w powietrze przez uszkodzony zegar z kukułką", - - "create.block.deployer.damage_source_name": "zbuntowany aplikator", - "create.block.cart_assembler.invalid": "Postaw monter wagoników na torze", - - "create.recipe.crushing": "Kruszenie", - "create.recipe.milling": "Mielenie", - "create.recipe.fan_washing": "Hurtowe płukanie", - "create.recipe.fan_washing.fan": "Wiatrak za płynącą wodą", - "create.recipe.fan_smoking": "Hurtowe wędzenie", - "create.recipe.fan_smoking.fan": "Wiatrak za ogniem", - "create.recipe.fan_blasting": "Hurtowe topienie", - "create.recipe.fan_blasting.fan": "Wiatrak za lawą", - "create.recipe.pressing": "Tłoczenie", + "death.attack.create.crush": "Gracz %1$s został zgnieciony przez koło kruszące", + "death.attack.create.fan_fire": "Gracz %1$s poparzył się gorącym powietrzem", + "death.attack.create.fan_lava": "Gracz %1$s poparzył się kroplami lawy", + "death.attack.create.mechanical_drill": "Gracz %1$s nabił się na mechaniczne wiertło", + "death.attack.create.mechanical_saw": "Gracz %1$s został przecięty na pół przez mechaniczną piłę", + "death.attack.create.cuckoo_clock_explosion": "Gracz %1$s został wysadzony w powietrze przez uszkodzony zegar z kukułką", + "create.block.deployer.damage_source_name": "zbuntowany aplikator", + "create.block.cart_assembler.invalid": "Postaw monter wagoników na torze", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "Kruszenie", + "create.recipe.milling": "Mielenie", + "create.recipe.fan_washing": "Hurtowe płukanie", + "create.recipe.fan_washing.fan": "Wiatrak za płynącą wodą", + "create.recipe.fan_smoking": "Hurtowe wędzenie", + "create.recipe.fan_smoking.fan": "Wiatrak za ogniem", + "create.recipe.fan_blasting": "Hurtowe topienie", + "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", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "Brak przyłączonych wiatraków", "create.tooltip.chute.fans_push_up": "Wiatraki pchają od dołu", "create.tooltip.chute.fans_push_down": "Wiatraki pchają od góry", - "create.tooltip.chute.fans_pull_up": "Wiatraki ciągną od góry", - "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", - "create.hint.mechanical_arm_no_targets": "Wygląda na to, że żadne _cele_ nie zostały przypisane do tego _mechanicznego_ _ramienia_. Wybierz taśmociągi, składnice, lejki i inne bloki _klikając_ na nie _PPM_, trzymając w _ręce_ _mechaniczne_ _ramię_", - "create.hint.empty_bearing.title": "Aktualizuj łożysko", - "create.hint.empty_bearing": "_Kliknij_ na łożysko _PPM_ pustą ręką, aby _przyczepić_ do niego strukturę zbudowaną z przodu.", - "create.hint.full_deployer.title": "Nadmiar przedmiotów w aplikatorze", - "create.hint.full_deployer": "Wygląda na to, że ten _aplikator_ zawiera _nadmiar_ _przedmiotów_, które muszą zostać _wyciągnięte_. Użyj _leji_, _lejków_ lub innych sposobów, aby uwolnić od przepełnienia.", + "create.tooltip.chute.fans_pull_up": "Wiatraki ciągną od góry", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "Wygląda na to, że żadne _cele_ nie zostały przypisane do tego _mechanicznego_ _ramienia_. Wybierz taśmociągi, składnice, lejki i inne bloki _klikając_ na nie _PPM_, trzymając w _ręce_ _mechaniczne_ _ramię_", + "create.hint.empty_bearing.title": "Aktualizuj łożysko", + "create.hint.empty_bearing": "_Kliknij_ na łożysko _PPM_ pustą ręką, aby _przyczepić_ do niego strukturę zbudowaną z przodu.", + "create.hint.full_deployer.title": "Nadmiar przedmiotów w aplikatorze", + "create.hint.full_deployer": "Wygląda na to, że ten _aplikator_ zawiera _nadmiar_ _przedmiotów_, które muszą zostać _wyciągnięte_. Użyj _leji_, _lejków_ lub innych sposobów, aby uwolnić od przepełnienia.", "create.gui.config.overlay1": "Cześć :)", "create.gui.config.overlay2": "To jest przykładowa nakładka", @@ -2119,4 +2124,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 3f00b608d..bf79ef1eb 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 1640", - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "UNLOCALIZED: Acacia Window", - "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", - "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", - "block.create.adjustable_crate": "adjustable_crate", - "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", - "block.create.adjustable_repeater": "Repetidor Flex", - "block.create.analog_lever": "UNLOCALIZED: Analog Lever", + "_": "Missing Localizations: 1655", + "_": "->------------------------] Game Elements [------------------------<-", + "block.create.acacia_window": "UNLOCALIZED: Acacia Window", + "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", + "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", + "block.create.adjustable_crate": "adjustable_crate", + "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", + "block.create.adjustable_repeater": "Repetidor Flex", + "block.create.analog_lever": "UNLOCALIZED: Analog Lever", "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", "block.create.andesite_bricks": "Tijolos de Andesite", "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", @@ -404,26 +402,24 @@ "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", - "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", - "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", - "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", - "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", - "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", - "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", - "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", - "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", - - "entity.create.contraption": "UNLOCALIZED: Contraption", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", - "entity.create.seat": "UNLOCALIZED: Seat", - "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", - "entity.create.super_glue": "UNLOCALIZED: Super Glue", - - "fluid.create.milk": "UNLOCALIZED: Milk", - "fluid.create.potion": "UNLOCALIZED: Potion", - "fluid.create.tea": "UNLOCALIZED: Builder's Tea", - - "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", + "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", + "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", + "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.seat": "UNLOCALIZED: Seat", + "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", + "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.milk": "UNLOCALIZED: Milk", + "fluid.create.potion": "UNLOCALIZED: Potion", + "fluid.create.tea": "UNLOCALIZED: Builder's Tea", + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate", "item.create.belt_connector": "Esteira Mecânica", @@ -434,26 +430,27 @@ "item.create.brass_nugget": "UNLOCALIZED: Brass Nugget", "item.create.brass_sheet": "UNLOCALIZED: Brass Sheet", "item.create.builders_tea": "UNLOCALIZED: Builder's Tea", - "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", - "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", - "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", - "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", - "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", - "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", - "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", - "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", - "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", - "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", - "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", - "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", - "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", - "item.create.crushed_lead_ore": "UNLOCALIZED: Crushed Lead Ore", - "item.create.crushed_nickel_ore": "UNLOCALIZED: Crushed Nickel Ore", - "item.create.crushed_osmium_ore": "UNLOCALIZED: Crushed Osmium Ore", - "item.create.crushed_platinum_ore": "UNLOCALIZED: Crushed Platinum Ore", - "item.create.crushed_quicksilver_ore": "UNLOCALIZED: Crushed Quicksilver Ore", + "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", + "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", + "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", + "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", + "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", + "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", + "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", + "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", + "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", + "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", + "item.create.crushed_lead_ore": "UNLOCALIZED: Crushed Lead Ore", + "item.create.crushed_nickel_ore": "UNLOCALIZED: Crushed Nickel Ore", + "item.create.crushed_osmium_ore": "UNLOCALIZED: Crushed Osmium Ore", + "item.create.crushed_platinum_ore": "UNLOCALIZED: Crushed Platinum Ore", + "item.create.crushed_quicksilver_ore": "UNLOCALIZED: Crushed Quicksilver Ore", "item.create.crushed_silver_ore": "UNLOCALIZED: Crushed Silver Ore", "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", @@ -662,26 +659,29 @@ "itemGroup.create.base": "UNLOCALIZED: Create", "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", - - "death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer", - "death.attack.create.fan_fire": "%1$s foi queimado por ar quente", - "death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava", - "death.attack.create.mechanical_drill": "%1$s foi empalado pela Furadeira Mecânica", - "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", - "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", - - "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", - "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", - - "create.recipe.crushing": "Moendo", - "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", - "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", - "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", - "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", - "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", - "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", - "create.recipe.pressing": "Prensa Mecânica", + "death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer", + "death.attack.create.fan_fire": "%1$s foi queimado por ar quente", + "death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava", + "death.attack.create.mechanical_drill": "%1$s foi empalado pela Furadeira Mecânica", + "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + "create.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "create.recipe.crushing": "Moendo", + "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.pressing": "Prensa Mecânica", "create.recipe.mixing": "UNLOCALIZED: Mixing", "create.recipe.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", @@ -1102,24 +1102,29 @@ "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", - "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", - "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", - "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", - "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", - "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", + "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 ea60579ad..fc07035b7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 568", - - "_": "->------------------------] 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": "Аналоговый рычаг", + "_": "Missing Localizations: 583", + "_": "->------------------------] 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": "Плита из андезитового кирпича", @@ -404,26 +402,24 @@ "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": "UNLOCALIZED: 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": "Андезитовый сплав", + "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.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.gantry_contraption": "UNLOCALIZED: 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": "Механический ремень", @@ -434,26 +430,27 @@ "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_backtank": "UNLOCALIZED: Copper Backtank", - "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.chest_minecart_contraption": "Сундуко-вагонеточная штуковина", + "item.create.chocolate_bucket": "Ведро шоколада", + "item.create.chocolate_glazed_berries": "Ягоды в шоколадной глазури", + "item.create.chromatic_compound": "Хроматический компаунд", + "item.create.cinder_flour": "Незераковая пыль", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "Медный слиток", + "item.create.copper_nugget": "Кусочек меди", + "item.create.copper_sheet": "Медный лист", + "item.create.crafter_slot_cover": "Крышка на слот крафтера", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "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": "Дроблёная урановая руда", @@ -662,26 +659,29 @@ "itemGroup.create.base": "Create: Механизмы", "itemGroup.create.palettes": "Create: Декор", - - "death.attack.create.crush": "%1$s был передроблен", - "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", - "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", - "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", - "death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой", - "death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой", - - "create.block.deployer.damage_source_name": "автономным активатором", - "create.block.cart_assembler.invalid": "Поместите сборщик вагонеток на блок рельс", - - "create.recipe.crushing": "Измельчение", - "create.recipe.milling": "Помол", - "create.recipe.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": "Прессование", + "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.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "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.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка", @@ -1102,24 +1102,29 @@ "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.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": "Нет целей", - "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.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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": "Это образец оверлея", @@ -1596,27 +1601,24 @@ "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.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 exactly 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", @@ -2119,4 +2121,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 afa6e0de7..62b0f2129 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 54", - - "_": "->------------------------] 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": "模拟拉杆", + "_": "Missing Localizations: 69", + "_": "->------------------------] 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": "安山岩砖台阶", @@ -404,26 +402,24 @@ "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": "安山合金", + "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.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "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": "传送带", @@ -434,26 +430,27 @@ "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_backtank": "UNLOCALIZED: Copper Backtank", - "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.chest_minecart_contraption": "装配过的动力矿车", + "item.create.chocolate_bucket": "巧克力桶", + "item.create.chocolate_glazed_berries": "巧克力包层浆果", + "item.create.chromatic_compound": "异彩化合物", + "item.create.cinder_flour": "下界面粉", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "铜锭", + "item.create.copper_nugget": "铜粒", + "item.create.copper_sheet": "铜板", + "item.create.crafter_slot_cover": "合成器盖板", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "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": "粉碎铀矿石", @@ -662,26 +659,29 @@ "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": "金属压片", + "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.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "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.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "自动搅拌", @@ -1102,24 +1102,29 @@ "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.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": "没有目标", - "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.tooltip.chute.fans_pull_up": "鼓风机从上方进行吸引", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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": "Hi :)", "create.gui.config.overlay2": "这是一个实例层", @@ -2119,4 +2124,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} 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 2c4a92d15..02ba7cc45 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,15 +1,13 @@ { - "_": "Missing Localizations: 47", - - "_": "->------------------------] 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": "可調式拉桿", + "_": "Missing Localizations: 62", + "_": "->------------------------] 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": "安山岩半磚", @@ -404,26 +402,24 @@ "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": "安山合金", + "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.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "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": "輸送帶", @@ -434,26 +430,27 @@ "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_backtank": "UNLOCALIZED: Copper Backtank", - "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.chest_minecart_contraption": "裝修過的機械礦車", + "item.create.chocolate_bucket": "巧克力桶", + "item.create.chocolate_glazed_berries": "巧克力甜莓", + "item.create.chromatic_compound": "異彩化合物", + "item.create.cinder_flour": "地獄麵粉", + "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_ingot": "銅錠", + "item.create.copper_nugget": "銅粒", + "item.create.copper_sheet": "銅板", + "item.create.crafter_slot_cover": "合成器蓋板", + "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "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": "碎狀鈾礦石", @@ -662,26 +659,29 @@ "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": "金屬壓片", + "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.menu.return": "UNLOCALIZED: Return to Menu", + "create.menu.configure": "UNLOCALIZED: Configure...", + "create.menu.getting_started": "UNLOCALIZED: Getting Started", + "create.menu.project_page": "UNLOCALIZED: Project Page", + "create.menu.report_bugs": "UNLOCALIZED: Report Issues", + "create.menu.support": "UNLOCALIZED: Support Us", + "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.deploying": "UNLOCALIZED: Deploying", "create.recipe.automatic_shapeless": "自動攪拌", @@ -1102,24 +1102,29 @@ "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.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": "沒有目標", - "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.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引", + "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.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", + "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", + "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "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": "這是一個實例層", @@ -2119,4 +2124,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} diff --git a/src/generated/resources/assets/create/models/item/crafting_blueprint.json b/src/generated/resources/assets/create/models/item/crafting_blueprint.json new file mode 100644 index 000000000..94ec8d07a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/crafting_blueprint.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/crafting_blueprint" + } +} \ No newline at end of file diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java index 02408eb68..d07779765 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java @@ -71,7 +71,7 @@ public class InstancedRenderDispatcher { Minecraft mc = Minecraft.getInstance(); ClientWorld world = mc.world; - Entity renderViewEntity = mc.renderViewEntity; + Entity renderViewEntity = mc.renderViewEntity != null ? mc.renderViewEntity : mc.player; if (renderViewEntity == null) return; diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 57a0aa28f..25d9e0ddb 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -93,20 +93,22 @@ public class AllBlockPartials { SPOUT_TOP = get("spout/top"), SPOUT_MIDDLE = get("spout/middle"), SPOUT_BOTTOM = get("spout/bottom"), - SPEED_CONTROLLER_BRACKET = get("rotation_speed_controller/bracket"), + SPEED_CONTROLLER_BRACKET = get("rotation_speed_controller/bracket"), - GOGGLES = get("goggles"), + GOGGLES = get("goggles"), - EJECTOR_TOP = get("weighted_ejector/top"), + EJECTOR_TOP = get("weighted_ejector/top"), - COPPER_BACKTANK_SHAFT = get("copper_backtank/block_shaft_input"), - COPPER_BACKTANK_COGS = get("copper_backtank/block_cogs"), + COPPER_BACKTANK_SHAFT = get("copper_backtank/block_shaft_input"), + COPPER_BACKTANK_COGS = get("copper_backtank/block_cogs"), - COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), - COUPLING_RING = getEntity("minecart_coupling/ring"), - COUPLING_CONNECTOR = getEntity("minecart_coupling/connector") + CRAFTING_BLUEPRINT_1x1 = getEntity("crafting_blueprint_small"), + CRAFTING_BLUEPRINT_2x2 = getEntity("crafting_blueprint_medium"), + CRAFTING_BLUEPRINT_3x3 = getEntity("crafting_blueprint_large"), - ; + COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), + COUPLING_RING = getEntity("minecart_coupling/ring"), + COUPLING_CONNECTOR = getEntity("minecart_coupling/connector"); public static final Map> PIPE_ATTACHMENTS = new HashMap<>(); public static final Map BLAZES = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index b1ba6e3ff..c175c3c66 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -156,6 +156,7 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkGenerato import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchBlock; import com.simibubi.create.content.schematics.block.SchematicTableBlock; import com.simibubi.create.content.schematics.block.SchematicannonBlock; +import com.simibubi.create.foundation.block.DyedBlockList; import com.simibubi.create.foundation.block.ItemUseOverrides; import com.simibubi.create.foundation.config.StressConfigDefaults; import com.simibubi.create.foundation.data.AssetLookup; @@ -165,6 +166,7 @@ import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.ModelGen; import com.simibubi.create.foundation.data.SharedProperties; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.utility.ColorHandlers; import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.worldgen.OxidizingBlock; import com.tterrag.registrate.providers.RegistrateRecipeProvider; @@ -626,33 +628,29 @@ public class AllBlocks { .transform(BuilderTransformers.valveHandle(null)) .register(); - public static final BlockEntry[] DYED_VALVE_HANDLES = new BlockEntry[DyeColor.values().length]; - - static { - for (DyeColor colour : DyeColor.values()) { - String colourName = colour.getString(); - DYED_VALVE_HANDLES[colour.ordinal()] = REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed) - .transform(BuilderTransformers.valveHandle(colour)) - .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get()) - .patternLine("#") - .patternLine("-") - .key('#', DyeHelper.getTagOfDye(colour)) - .key('-', AllItemTags.VALVE_HANDLES.tag) - .addCriterion("has_valve", RegistrateRecipeProvider.hasItem(AllItemTags.VALVE_HANDLES.tag)) - .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle"))) - .register(); - } - } + public static final DyedBlockList DYED_VALVE_HANDLES = new DyedBlockList<>(colour -> { + String colourName = colour.getString(); + return REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed) + .transform(BuilderTransformers.valveHandle(colour)) + .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get()) + .patternLine("#") + .patternLine("-") + .key('#', DyeHelper.getTagOfDye(colour)) + .key('-', AllItemTags.VALVE_HANDLES.tag) + .addCriterion("has_valve", RegistrateRecipeProvider.hasItem(AllItemTags.VALVE_HANDLES.tag)) + .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle"))) + .register(); + }); public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular) - .initialProperties(SharedProperties::softMetal) - .properties(AbstractBlock.Properties::nonOpaque) - .blockstate(new FluidTankGenerator()::generate) - .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::standard)) - .addLayer(() -> RenderType::getCutoutMipped) - .item(FluidTankItem::new) - .model(AssetLookup.customBlockItemModel("_", "block_single_window")) - .build() + .initialProperties(SharedProperties::softMetal) + .properties(AbstractBlock.Properties::nonOpaque) + .blockstate(new FluidTankGenerator()::generate) + .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::standard)) + .addLayer(() -> RenderType::getCutoutMipped) + .item(FluidTankItem::new) + .model(AssetLookup.customBlockItemModel("_", "block_single_window")) + .build() .register(); public static final BlockEntry CREATIVE_FLUID_TANK = @@ -838,11 +836,11 @@ public class AllBlocks { .register(); public static final BlockEntry CONTROLLER_RAIL = - REGISTRATE.block("controller_rail", ControllerRailBlock::new) - .initialProperties(() -> Blocks.POWERED_RAIL) - .blockstate(new ControllerRailGenerator()::generate) - .addLayer(() -> RenderType::getCutoutMipped) - .onRegister(CreateRegistrate.blockColors(() -> AllColorHandlers::getRedstonePower)) + REGISTRATE.block("controller_rail", ControllerRailBlock::new) + .initialProperties(() -> Blocks.POWERED_RAIL) + .blockstate(new ControllerRailGenerator()::generate) + .addLayer(() -> RenderType::getCutoutMipped) + .color(() -> ColorHandlers::getRedstonePower) .tag(BlockTags.RAILS) .item() .model((c, p) -> p.generated(c, Create.asResource("block/" + c.getName()))) @@ -951,105 +949,93 @@ public class AllBlocks { .addLayer(() -> RenderType::getCutoutMipped) .item() .transform(customItemModel()) - .register(); + .register(); public static final BlockEntry MECHANICAL_PLOUGH = - REGISTRATE.block("mechanical_plough", PloughBlock::new) - .initialProperties(SharedProperties::stone) - .onRegister(addMovementBehaviour(new PloughMovementBehaviour())) - .blockstate(BlockStateGen.horizontalBlockProvider(false)) - .simpleItem() - .register(); + REGISTRATE.block("mechanical_plough", PloughBlock::new) + .initialProperties(SharedProperties::stone) + .onRegister(addMovementBehaviour(new PloughMovementBehaviour())) + .blockstate(BlockStateGen.horizontalBlockProvider(false)) + .simpleItem() + .register(); - public static final BlockEntry[] SEATS = new BlockEntry[DyeColor.values().length]; - - static { - // SEATS - for (DyeColor colour : DyeColor.values()) { - String colourName = colour.getString(); - SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); - SEATS[colour.ordinal()] = - REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED)) - .initialProperties(SharedProperties::wooden) - .onRegister(addMovementBehaviour(movementBehaviour)) - .blockstate((c, p) -> { - p.simpleBlock(c.get(), p.models() + public static final DyedBlockList SEATS = new DyedBlockList<>(colour -> { + String colourName = colour.getString(); + SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); + return REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED)) + .initialProperties(SharedProperties::wooden) + .onRegister(addMovementBehaviour(movementBehaviour)) + .blockstate((c, p) -> { + p.simpleBlock(c.get(), p.models() .withExistingParent(colourName + "_seat", p.modLoc("block/seat")) .texture("1", p.modLoc("block/seat/top_" + colourName)) .texture("2", p.modLoc("block/seat/side_" + colourName))); - }) - .recipe((c, p) -> { - ShapedRecipeBuilder.shapedRecipe(c.get()) + }) + .recipe((c, p) -> { + ShapedRecipeBuilder.shapedRecipe(c.get()) .patternLine("#") .patternLine("-") .key('#', DyeHelper.getWoolOfDye(colour)) .key('-', ItemTags.WOODEN_SLABS) .addCriterion("has_wool", RegistrateRecipeProvider.hasItem(ItemTags.WOOL)) .build(p, Create.asResource("crafting/kinetics/" + c.getName())); - ShapedRecipeBuilder.shapedRecipe(c.get()) + ShapedRecipeBuilder.shapedRecipe(c.get()) .patternLine("#") .patternLine("-") .key('#', DyeHelper.getTagOfDye(colour)) .key('-', AllItemTags.SEATS.tag) .addCriterion("has_seat", RegistrateRecipeProvider.hasItem(AllItemTags.SEATS.tag)) .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); - }) - .onRegisterAfter(Item.class, v -> TooltipHelper.referTo(v, "block.create.seat")) - .tag(AllBlockTags.SEATS.tag) - .item() - .tag(AllItemTags.SEATS.tag) - .build() - .register(); - } - } + }) + .onRegisterAfter(Item.class, v -> TooltipHelper.referTo(v, "block.create.seat")) + .tag(AllBlockTags.SEATS.tag) + .item() + .tag(AllItemTags.SEATS.tag) + .build() + .register(); + }); public static final BlockEntry SAIL_FRAME = REGISTRATE.block("sail_frame", p -> SailBlock.frame(p)) - .initialProperties(SharedProperties::wooden) - .properties(Block.Properties::nonOpaque) - .blockstate(BlockStateGen.directionalBlockProvider(false)) - .tag(AllBlockTags.WINDMILL_SAILS.tag) - .tag(AllBlockTags.FAN_TRANSPARENT.tag) - .simpleItem() - .register(); - - public static final BlockEntry[] DYED_SAILS = new BlockEntry[DyeColor.values().length]; + .initialProperties(SharedProperties::wooden) + .properties(Block.Properties::nonOpaque) + .blockstate(BlockStateGen.directionalBlockProvider(false)) + .tag(AllBlockTags.WINDMILL_SAILS.tag) + .tag(AllBlockTags.FAN_TRANSPARENT.tag) + .simpleItem() + .register(); public static final BlockEntry SAIL = REGISTRATE.block("white_sail", p -> SailBlock.withCanvas(p)) - .initialProperties(SharedProperties::wooden) - .properties(Block.Properties::nonOpaque) - .blockstate(BlockStateGen.directionalBlockProvider(false)) - .tag(AllBlockTags.WINDMILL_SAILS.tag) - .simpleItem() - .register(); + .initialProperties(SharedProperties::wooden) + .properties(Block.Properties::nonOpaque) + .blockstate(BlockStateGen.directionalBlockProvider(false)) + .tag(AllBlockTags.WINDMILL_SAILS.tag) + .simpleItem() + .register(); - static { - // DYED SAILS - for (DyeColor colour : DyeColor.values()) { - if (colour == DyeColor.WHITE) { - DYED_SAILS[colour.ordinal()] = SAIL; - continue; - } - String colourName = colour.getString(); - DYED_SAILS[colour.ordinal()] = REGISTRATE.block(colourName + "_sail", p -> SailBlock.withCanvas(p)) + public static final DyedBlockList DYED_SAILS = new DyedBlockList<>(colour -> { + if (colour == DyeColor.WHITE) { + return SAIL; + } + String colourName = colour.getString(); + return REGISTRATE.block(colourName + "_sail", p -> SailBlock.withCanvas(p)) .properties(Block.Properties::nonOpaque) .initialProperties(SharedProperties::wooden) .blockstate((c, p) -> p.directionalBlock(c.get(), p.models() - .withExistingParent(colourName + "_sail", p.modLoc("block/white_sail")) - .texture("0", p.modLoc("block/sail/canvas_" + colourName)))) + .withExistingParent(colourName + "_sail", p.modLoc("block/white_sail")) + .texture("0", p.modLoc("block/sail/canvas_" + colourName)))) .tag(AllBlockTags.WINDMILL_SAILS.tag) .tag(AllBlockTags.SAILS.tag) .loot((p, b) -> p.registerDropping(b, SAIL.get())) .register(); - } - } + }); public static final BlockEntry ANDESITE_CASING = REGISTRATE.block("andesite_casing", CasingBlock::new) - .transform(BuilderTransformers.casing(AllSpriteShifts.ANDESITE_CASING)) - .register(); + .transform(BuilderTransformers.casing(AllSpriteShifts.ANDESITE_CASING)) + .register(); public static final BlockEntry BRASS_CASING = REGISTRATE.block("brass_casing", CasingBlock::new) - .transform(BuilderTransformers.casing(AllSpriteShifts.BRASS_CASING)) - .register(); + .transform(BuilderTransformers.casing(AllSpriteShifts.BRASS_CASING)) + .register(); public static final BlockEntry COPPER_CASING = REGISTRATE.block("copper_casing", CasingBlock::new) .transform(BuilderTransformers.casing(AllSpriteShifts.COPPER_CASING)) diff --git a/src/main/java/com/simibubi/create/AllColorHandlers.java b/src/main/java/com/simibubi/create/AllColorHandlers.java index 0b7672fa0..e69de29bb 100644 --- a/src/main/java/com/simibubi/create/AllColorHandlers.java +++ b/src/main/java/com/simibubi/create/AllColorHandlers.java @@ -1,64 +0,0 @@ -package com.simibubi.create; - -import java.util.HashMap; -import java.util.Map; - -import net.minecraft.block.Block; -import net.minecraft.block.RedstoneWireBlock; -import net.minecraft.client.renderer.color.BlockColors; -import net.minecraft.client.renderer.color.IBlockColor; -import net.minecraft.client.renderer.color.IItemColor; -import net.minecraft.client.renderer.color.ItemColors; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.util.IItemProvider; -import net.minecraft.world.GrassColors; -import net.minecraft.world.biome.BiomeColors; -import net.minecraftforge.client.event.ColorHandlerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -public class AllColorHandlers { - - private final Map coloredBlocks = new HashMap<>(); - private final Map coloredItems = new HashMap<>(); - - // - - public static IBlockColor getGrassyBlock() { - return (state, world, pos, layer) -> pos != null && world != null ? BiomeColors.getGrassColor(world, pos) - : GrassColors.get(0.5D, 1.0D); - } - - public static IItemColor getGrassyItem() { - return (stack, layer) -> GrassColors.get(0.5D, 1.0D); - } - - public static IBlockColor getRedstonePower() { - return (state, world, pos, layer) -> RedstoneWireBlock - .getWireColor(pos != null && world != null ? state.get(BlockStateProperties.POWER_0_15) : 0); - } - - // - - public void register(Block block, IBlockColor color) { - coloredBlocks.put(block, color); - } - - public void register(IItemProvider item, IItemColor color) { - coloredItems.put(item, color); - } - - // - - @SubscribeEvent - public void registerBlockColors(ColorHandlerEvent.Block event) { - BlockColors blockColors = event.getBlockColors(); - coloredBlocks.forEach((block, color) -> blockColors.register(color, block)); - } - - @SubscribeEvent - public void registerItemColors(ColorHandlerEvent.Item event) { - ItemColors itemColors = event.getItemColors(); - coloredItems.forEach((item, color) -> itemColors.register(color, item)); - } - -} diff --git a/src/main/java/com/simibubi/create/AllContainerTypes.java b/src/main/java/com/simibubi/create/AllContainerTypes.java index 4a5db0f54..05e81923f 100644 --- a/src/main/java/com/simibubi/create/AllContainerTypes.java +++ b/src/main/java/com/simibubi/create/AllContainerTypes.java @@ -1,5 +1,7 @@ package com.simibubi.create; +import com.simibubi.create.content.curiosities.tools.BlueprintContainer; +import com.simibubi.create.content.curiosities.tools.BlueprintScreen; 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; @@ -30,21 +32,25 @@ public class AllContainerTypes { register("schematicannon", SchematicannonContainer::new, () -> SchematicannonScreen::new); public static final ContainerEntry FLEXCRATE = - register("flexcrate", AdjustableCrateContainer::new, () -> AdjustableCrateScreen::new); + register("flexcrate", AdjustableCrateContainer::new, () -> AdjustableCrateScreen::new); public static final ContainerEntry FILTER = - register("filter", FilterContainer::new, () -> FilterScreen::new); + register("filter", FilterContainer::new, () -> FilterScreen::new); public static final ContainerEntry ATTRIBUTE_FILTER = - register("attribute_filter", AttributeFilterContainer::new, () -> AttributeFilterScreen::new); + register("attribute_filter", AttributeFilterContainer::new, () -> AttributeFilterScreen::new); + + public static final ContainerEntry CRAFTING_BLUEPRINT = + register("crafting_blueprint", BlueprintContainer::new, () -> BlueprintScreen::new); public static final ContainerEntry LINKED_CONTROLLER = - register("linked_controller", LinkedControllerContainer::new, () -> LinkedControllerScreen::new); + 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(); } - public static void register() {} + public static void register() { + } } diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 44e39b2a7..ea56c02f9 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -9,6 +9,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Ori import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer; +import com.simibubi.create.content.curiosities.tools.BlueprintEntity; +import com.simibubi.create.content.curiosities.tools.BlueprintRenderer; import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.EntityEntry; import com.tterrag.registrate.util.nullness.NonNullConsumer; @@ -35,6 +37,11 @@ public class AllEntityTypes { public static final EntityEntry SUPER_GLUE = register("super_glue", SuperGlueEntity::new, () -> SuperGlueRenderer::new, EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, SuperGlueEntity::build); + + public static final EntityEntry CRAFTING_BLUEPRINT = + register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new, + EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, BlueprintEntity::build); + public static final EntityEntry SEAT = register("seat", SeatEntity::new, () -> SeatEntity.Render::new, EntityClassification.MISC, 0, Integer.MAX_VALUE, false, true, SeatEntity::build); diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 82a7efe6b..e926eaa33 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -35,6 +35,7 @@ import com.simibubi.create.content.curiosities.armor.DivingBootsItem; import com.simibubi.create.content.curiosities.armor.DivingHelmetItem; import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem; import com.simibubi.create.content.curiosities.symmetry.client.SymmetryWandModel; +import com.simibubi.create.content.curiosities.tools.BlueprintItem; import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.content.curiosities.tools.ExtendoGripModel; import com.simibubi.create.content.curiosities.tools.SandPaperItem; @@ -125,10 +126,10 @@ public class AllItems { BRASS_INGOT = taggedIngredient("brass_ingot", forgeItemTag("ingots/brass"), CREATE_INGOTS.tag); public static final ItemEntry CHROMATIC_COMPOUND = - REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new) - .properties(p -> p.rarity(Rarity.UNCOMMON)) - .model(AssetLookup.existingItemModel()) - .onRegister(CreateRegistrate.itemColors(() -> ChromaticCompoundColor::new)) + REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new) + .properties(p -> p.rarity(Rarity.UNCOMMON)) + .model(AssetLookup.existingItemModel()) + .color(() -> ChromaticCompoundColor::new) .register(); public static final ItemEntry SHADOW_STEEL = REGISTRATE.item("shadow_steel", ShadowSteelItem::new) @@ -186,25 +187,29 @@ public class AllItems { public static final ItemEntry GOGGLES = REGISTRATE.item("goggles", GogglesItem::new) .properties(p -> p.maxStackSize(1)) - .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) - .lang("Engineer's Goggles") - .register(); - - public static final ItemEntry SUPER_GLUE = REGISTRATE.item("super_glue", SuperGlueItem::new) - .register(); - - public static final ItemEntry MINECART_COUPLING = - REGISTRATE.item("minecart_coupling", MinecartCouplingItem::new) + .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) + .lang("Engineer's Goggles") .register(); + public static final ItemEntry SUPER_GLUE = REGISTRATE.item("super_glue", SuperGlueItem::new) + .register(); + + public static final ItemEntry MINECART_COUPLING = + REGISTRATE.item("minecart_coupling", MinecartCouplingItem::new) + .register(); + + public static final ItemEntry CRAFTING_BLUEPRINT = + REGISTRATE.item("crafting_blueprint", BlueprintItem::new) + .register(); + public static final ItemEntry SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) - .register(); + .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) + .register(); public static final ItemEntry RED_SAND_PAPER = REGISTRATE.item("red_sand_paper", SandPaperItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) - .onRegister(s -> TooltipHelper.referTo(s, SAND_PAPER)) - .register(); + .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) + .onRegister(s -> TooltipHelper.referTo(s, SAND_PAPER)) + .register(); public static final ItemEntry WRENCH = REGISTRATE.item("wrench", WrenchItem::new) .properties(p -> p.maxStackSize(1)) @@ -222,7 +227,7 @@ public class AllItems { .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)) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index cf360ba92..ef6108ebb 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -250,7 +250,7 @@ public class AllTileEntities { .tileEntity("hand_crank", HandCrankTileEntity::new) .instance(() -> HandCrankInstance::new) .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE) - .validBlocks(AllBlocks.DYED_VALVE_HANDLES) + .validBlocks(AllBlocks.DYED_VALVE_HANDLES.toArray()) .renderer(() -> HandCrankRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 48e0b047a..d86dea882 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -54,7 +54,7 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.3.1c"; + public static final String VERSION = "0.3.2"; public static final Logger LOGGER = LogManager.getLogger(); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index ad6a105b0..72d549e8d 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -21,8 +21,8 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.item.CustomItemModels; -import com.simibubi.create.foundation.item.CustomRenderedItems; +import com.simibubi.create.foundation.item.render.CustomItemModels; +import com.simibubi.create.foundation.item.render.CustomRenderedItems; import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.render.SuperByteBufferCache; @@ -66,12 +66,10 @@ public class CreateClient { private static CustomBlockModels customBlockModels; private static CustomItemModels customItemModels; private static CustomRenderedItems customRenderedItems; - private static AllColorHandlers colorHandlers; private static CasingConnectivity casingConnectivity; public static void addClientListeners(IEventBus modEventBus) { modEventBus.addListener(CreateClient::clientInit); - modEventBus.register(getColorHandler()); modEventBus.addListener(CreateClient::onTextureStitch); modEventBus.addListener(CreateClient::onModelRegistry); modEventBus.addListener(CreateClient::onModelBake); @@ -186,12 +184,6 @@ public class CreateClient { return customBlockModels; } - public static AllColorHandlers getColorHandler() { - if (colorHandlers == null) - colorHandlers = new AllColorHandlers(); - return colorHandlers; - } - public static CasingConnectivity getCasingConnectivity() { if (casingConnectivity == null) casingConnectivity = new CasingConnectivity(); diff --git a/src/main/java/com/simibubi/create/compat/jei/BlueprintTransferHandler.java b/src/main/java/com/simibubi/create/compat/jei/BlueprintTransferHandler.java new file mode 100644 index 000000000..300575d36 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/jei/BlueprintTransferHandler.java @@ -0,0 +1,31 @@ +package com.simibubi.create.compat.jei; + +import com.simibubi.create.content.curiosities.tools.BlueprintAssignCompleteRecipePacket; +import com.simibubi.create.content.curiosities.tools.BlueprintContainer; +import com.simibubi.create.foundation.networking.AllPackets; + +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandler; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.crafting.IRecipe; + +public class BlueprintTransferHandler implements IRecipeTransferHandler { + + @Override + public Class getContainerClass() { + return BlueprintContainer.class; + } + + @Override + public IRecipeTransferError transferRecipe(BlueprintContainer container, Object recipe, IRecipeLayout recipeLayout, + PlayerEntity player, boolean maxTransfer, boolean doTransfer) { + if (!(recipe instanceof IRecipe)) + return null; + IRecipe iRecipe = (IRecipe) recipe; + // Continued server-side in BlueprintItem.assignCompleteRecipe() + AllPackets.channel.sendToServer(new BlueprintAssignCompleteRecipePacket(iRecipe.getId())); + return null; + } + +} 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 7cbb79a56..1957c7e89 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -39,6 +39,7 @@ import com.simibubi.create.content.contraptions.components.press.MechanicalPress import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.processing.BasinRecipe; +import com.simibubi.create.content.curiosities.tools.BlueprintScreen; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen; import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; @@ -51,10 +52,12 @@ import com.simibubi.create.foundation.config.ConfigBase.ConfigBool; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; +import mezz.jei.api.constants.VanillaRecipeCategoryUid; import mezz.jei.api.registration.IGuiHandlerRegistration; import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeCategoryRegistration; import mezz.jei.api.registration.IRecipeRegistration; +import mezz.jei.api.registration.IRecipeTransferRegistration; import mezz.jei.api.runtime.IIngredientManager; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; @@ -84,16 +87,16 @@ public class CreateJEI implements IModPlugin { private final List> allCategories = new ArrayList<>(); private final CreateRecipeCategory - milling = register("milling", MillingCategory::new).recipes(AllRecipeTypes.MILLING) + milling = register("milling", MillingCategory::new).recipes(AllRecipeTypes.MILLING) .catalyst(AllBlocks.MILLSTONE::get) .build(), - crushing = register("crushing", CrushingCategory::new).recipes(AllRecipeTypes.CRUSHING) + crushing = register("crushing", CrushingCategory::new).recipes(AllRecipeTypes.CRUSHING) .recipesExcluding(AllRecipeTypes.MILLING::getType, AllRecipeTypes.CRUSHING::getType) .catalyst(AllBlocks.CRUSHING_WHEEL::get) .build(), - pressing = register("pressing", PressingCategory::new).recipes(AllRecipeTypes.PRESSING) + pressing = register("pressing", PressingCategory::new).recipes(AllRecipeTypes.PRESSING) .catalyst(AllBlocks.MECHANICAL_PRESS::get) .build(), @@ -167,9 +170,10 @@ public class CreateJEI implements IModPlugin { .catalyst(AllItems.SAND_PAPER::get) .catalyst(AllItems.RED_SAND_PAPER::get) .build(), - + deploying = register("deploying", DeployingCategory::new) - .recipeList(() -> DeployerApplicationRecipe.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.type))) + .recipeList( + () -> DeployerApplicationRecipe.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.type))) .recipes(AllRecipeTypes.DEPLOYING) .catalyst(AllBlocks.DEPLOYER::get) .catalyst(AllBlocks.DEPOT::get) @@ -203,16 +207,19 @@ public class CreateJEI implements IModPlugin { mechanicalCrafting = register("mechanical_crafting", MechanicalCraftingCategory::new).recipes(AllRecipeTypes.MECHANICAL_CRAFTING) - .catalyst(AllBlocks.MECHANICAL_CRAFTER::get) - .build() - - ; + .catalyst(AllBlocks.MECHANICAL_CRAFTER::get) + .build(); private > CategoryBuilder register(String name, - Supplier> supplier) { + Supplier> supplier) { return new CategoryBuilder(name, supplier); } + @Override + public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { + registration.addRecipeTransferHandler(new BlueprintTransferHandler(), VanillaRecipeCategoryUid.CRAFTING); + } + @Override public void registerCategories(IRecipeCategoryRegistration registration) { allCategories.forEach(registration::addRecipeCategories); @@ -238,7 +245,8 @@ public class CreateJEI implements IModPlugin { registration.addGuiContainerHandler(SchematicTableScreen.class, slotMover); registration.addGuiContainerHandler(FilterScreen.class, slotMover); registration.addGuiContainerHandler(AttributeFilterScreen.class, slotMover); - registration.addGhostIngredientHandler(AbstractFilterScreen.class, new FilterGhostIngredientHandler()); + registration.addGhostIngredientHandler(AbstractFilterScreen.class, new GhostIngredientHandler()); + registration.addGhostIngredientHandler(BlueprintScreen.class, new GhostIngredientHandler()); } private class CategoryBuilder> { @@ -278,14 +286,14 @@ public class CreateJEI implements IModPlugin { return recipeList(list, null); } - public CategoryBuilder recipeList(Supplier>> list, Function, T> converter) { + public CategoryBuilder recipeList(Supplier>> list, + Function, T> converter) { recipeListConsumers.add(recipes -> { List> toAdd = list.get(); if (converter != null) - toAdd = toAdd - .stream() - .map(converter) - .collect(Collectors.toList()); + toAdd = toAdd.stream() + .map(converter) + .collect(Collectors.toList()); recipes.addAll(toAdd); }); return this; diff --git a/src/main/java/com/simibubi/create/compat/jei/FilterGhostIngredientHandler.java b/src/main/java/com/simibubi/create/compat/jei/GhostIngredientHandler.java similarity index 59% rename from src/main/java/com/simibubi/create/compat/jei/FilterGhostIngredientHandler.java rename to src/main/java/com/simibubi/create/compat/jei/GhostIngredientHandler.java index c5ee188cd..7a1644dda 100644 --- a/src/main/java/com/simibubi/create/compat/jei/FilterGhostIngredientHandler.java +++ b/src/main/java/com/simibubi/create/compat/jei/GhostIngredientHandler.java @@ -5,12 +5,10 @@ import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; -import org.apache.logging.log4j.LogManager; - -import com.simibubi.create.content.logistics.item.filter.AbstractFilterContainer; -import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; -import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; +import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.GhostItemContainer; +import com.simibubi.create.foundation.gui.GhostItemSubmitPacket; import com.simibubi.create.foundation.networking.AllPackets; import mcp.MethodsReturnNonnullByDefault; @@ -18,21 +16,20 @@ import mezz.jei.api.gui.handlers.IGhostIngredientHandler; import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class FilterGhostIngredientHandler - implements IGhostIngredientHandler> { +public class GhostIngredientHandler> + implements IGhostIngredientHandler> { @Override - public List> getTargets(AbstractFilterScreen gui, I ingredient, boolean doStart) { + public List> getTargets(AbstractSimiContainerScreen gui, I ingredient, boolean doStart) { List> targets = new ArrayList<>(); boolean isAttributeFilter = gui instanceof AttributeFilterScreen; if (ingredient instanceof ItemStack) { for (int i = 36; i < gui.getContainer().inventorySlots.size(); i++) { - targets.add(new FilterGhostTarget<>(gui, i - 36, isAttributeFilter)); + targets.add(new GhostTarget<>(gui, i - 36, isAttributeFilter)); // Only accept items in 1st slot. 2nd is used for functionality, don't wanna override that one if (isAttributeFilter) @@ -44,7 +41,8 @@ public class FilterGhostIngredientHandler } @Override - public void onComplete() {} + public void onComplete() { + } @Override public boolean shouldHighlightTargets() { @@ -52,14 +50,14 @@ public class FilterGhostIngredientHandler return true; } - private static class FilterGhostTarget implements Target { + private static class GhostTarget> implements Target { private final Rectangle2d area; - private final AbstractFilterScreen gui; + private final AbstractSimiContainerScreen gui; private final int slotIndex; private final boolean isAttributeFilter; - public FilterGhostTarget(AbstractFilterScreen gui, int slotIndex, boolean isAttributeFilter) { + public GhostTarget(AbstractSimiContainerScreen gui, int slotIndex, boolean isAttributeFilter) { this.gui = gui; this.slotIndex = slotIndex; this.isAttributeFilter = isAttributeFilter; @@ -75,19 +73,14 @@ public class FilterGhostIngredientHandler @Override public void accept(I ingredient) { ItemStack stack = ((ItemStack) ingredient).copy(); - LogManager.getLogger() - .info(stack); stack.setCount(1); - gui.getContainer().filterInventory.setStackInSlot(slotIndex, stack); + gui.getContainer().ghostInventory.setStackInSlot(slotIndex, stack); if (isAttributeFilter) return; // sync new filter contents with server - CompoundNBT data = new CompoundNBT(); - data.putInt("Slot", slotIndex); - data.put("Item", stack.serializeNBT()); - AllPackets.channel.sendToServer(new FilterScreenPacket(FilterScreenPacket.Option.UPDATE_FILTER_ITEM, data)); + AllPackets.channel.sendToServer(new GhostItemSubmitPacket(stack, slotIndex)); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index c1404ccb4..0aed0b128 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -16,6 +16,7 @@ import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.CocoaBlock; @@ -151,24 +152,28 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { } private BlockState cutCrop(World world, BlockPos pos, BlockState state) { - if (state.getBlock() instanceof CropsBlock) { - CropsBlock crop = (CropsBlock) state.getBlock(); + Block block = state.getBlock(); + if (block instanceof CropsBlock) { + CropsBlock crop = (CropsBlock) block; return crop.withAge(0); } - if (state.getBlock() == Blocks.SUGAR_CANE || state.getBlock() == Blocks.KELP) { + if (block == Blocks.SWEET_BERRY_BUSH) { + return state.with(BlockStateProperties.AGE_0_3, Integer.valueOf(1)); + } + if (block == Blocks.SUGAR_CANE || block == Blocks.KELP) { if (state.getFluidState() - .isEmpty()) + .isEmpty()) return Blocks.AIR.getDefaultState(); return state.getFluidState() - .getBlockState(); + .getBlockState(); } if (state.getCollisionShape(world, pos) - .isEmpty() || state.getBlock() instanceof CocoaBlock) { + .isEmpty() || block instanceof CocoaBlock) { for (Property property : state.getProperties()) { if (!(property instanceof IntegerProperty)) continue; if (!property.getName() - .equals(BlockStateProperties.AGE_0_1.getName())) + .equals(BlockStateProperties.AGE_0_1.getName())) continue; return state.with((IntegerProperty) property, Integer.valueOf(0)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java index 3cccce364..bd2f0001c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java @@ -96,12 +96,12 @@ public class SeatBlock extends Block { ItemStack heldItem = player.getHeldItem(hand); for (DyeColor color : DyeColor.values()) { if (!heldItem.getItem() - .isIn(DyeHelper.getTagOfDye(color))) + .isIn(DyeHelper.getTagOfDye(color))) continue; if (world.isRemote) return ActionResultType.SUCCESS; - BlockState newState = AllBlocks.SEATS[color.ordinal()].getDefaultState(); + BlockState newState = AllBlocks.SEATS.get(color).getDefaultState(); if (newState != state) world.setBlockState(pos, newState); return ActionResultType.SUCCESS; @@ -148,5 +148,5 @@ public class SeatBlock extends Block { public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java index 5948a5adf..9b3aefbd8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java @@ -66,10 +66,24 @@ public class CuckooClockTileEntity extends KineticTileEntity { if (getSpeed() == 0) return; - int dayTime = (int) (world.getDayTime() % 24000); + + boolean isNatural = world.getDimension().isNatural(); + int dayTime = (int) ((world.getDayTime() * (isNatural ? 1 : 24)) % 24000); int hours = (dayTime / 1000 + 6) % 24; int minutes = (dayTime % 1000) * 60 / 1000; + if (!isNatural) { + if (world.isRemote) { + moveHands(hours, minutes); + + if (AnimationTickHolder.getTicks() % 6 == 0) + playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 2f); + else if (AnimationTickHolder.getTicks() % 3 == 0) + playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 1.5f); + } + return; + } + if (!world.isRemote) { if (animationType == Animation.NONE) { if (hours == 12 && minutes < 5) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java index 46c60ab96..8b0b71e91 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java @@ -48,7 +48,7 @@ public class ValveHandleBlock extends HandCrankBlock { if (worldIn.isRemote) return ActionResultType.SUCCESS; - BlockState newState = AllBlocks.DYED_VALVE_HANDLES[color.ordinal()] + BlockState newState = AllBlocks.DYED_VALVE_HANDLES.get(color) .getDefaultState() .with(FACING, state.get(FACING)); if (newState != state) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java index 127ed6923..34e587985 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java @@ -92,34 +92,29 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE if (AllBlocks.CRUSHING_WHEEL.has(otherState)) { controllerShouldExist = true; - try { - CrushingWheelTileEntity te = getTileEntity(world, pos); - CrushingWheelTileEntity otherTe = getTileEntity(world, otherWheelPos); + CrushingWheelTileEntity te = getTileEntity(world, pos); + CrushingWheelTileEntity otherTe = getTileEntity(world, otherWheelPos); - if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0) - && te.getSpeed() != 0) { - Axis wheelAxis = state.get(AXIS); - Axis sideAxis = side.getAxis(); - int controllerADO = Math.round(Math.signum(te.getSpeed())) * side.getAxisDirection().getOffset(); - Vector3d controllerDirVec = new Vector3d(wheelAxis == Axis.X ? 1 : 0 - , wheelAxis == Axis.Y ? 1 : 0 - , wheelAxis == Axis.Z ? 1 : 0) - .crossProduct(new Vector3d(sideAxis == Axis.X ? 1 : 0 - , sideAxis == Axis.Y ? 1 : 0 - , sideAxis == Axis.Z ? 1 : 0)); + if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0) + && te.getSpeed() != 0) { + Axis wheelAxis = state.get(AXIS); + Axis sideAxis = side.getAxis(); + int controllerADO = Math.round(Math.signum(te.getSpeed())) * side.getAxisDirection().getOffset(); + Vector3d controllerDirVec = new Vector3d(wheelAxis == Axis.X ? 1 : 0 + , wheelAxis == Axis.Y ? 1 : 0 + , wheelAxis == Axis.Z ? 1 : 0) + .crossProduct(new Vector3d(sideAxis == Axis.X ? 1 : 0 + , sideAxis == Axis.Y ? 1 : 0 + , sideAxis == Axis.Z ? 1 : 0)); - controllerNewDirection = Direction.getFacingFromVector(controllerDirVec.x * controllerADO - , controllerDirVec.y * controllerADO - , controllerDirVec.z * controllerADO); + controllerNewDirection = Direction.getFacingFromVector(controllerDirVec.x * controllerADO + , controllerDirVec.y * controllerADO + , controllerDirVec.z * controllerADO); - controllerShouldBeValid = true; - } - if (otherState.get(AXIS) != state.get(AXIS)) - controllerShouldExist = false; - - } catch (TileEntityException e) { - controllerShouldExist = false; + controllerShouldBeValid = true; } + if (otherState.get(AXIS) != state.get(AXIS)) + controllerShouldExist = false; } if (!controllerShouldExist) { @@ -149,27 +144,25 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE @Override public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { - try { - CrushingWheelTileEntity te = getTileEntity(worldIn, pos); - if (entityIn.getY() < pos.getY() + 1.25f || !entityIn.isOnGround()) - return; + if (entityIn.getY() < pos.getY() + 1.25f || !entityIn.isOnGround()) + return; - double x = 0; - double z = 0; + float speed = getTileEntityOptional(worldIn, pos).map(CrushingWheelTileEntity::getSpeed) + .orElse(0f); - if (state.get(AXIS) == Axis.X) { - z = te.getSpeed() / 20f; - x += (pos.getX() + .5f - entityIn.getX()) * .1f; - } - if (state.get(AXIS) == Axis.Z) { - x = te.getSpeed() / -20f; - z += (pos.getZ() + .5f - entityIn.getZ()) * .1f; - } - entityIn.setMotion(entityIn.getMotion() - .add(x, 0, z)); + double x = 0; + double z = 0; - } catch (TileEntityException e) { + if (state.get(AXIS) == Axis.X) { + z = speed / 20f; + x += (pos.getX() + .5f - entityIn.getX()) * .1f; } + if (state.get(AXIS) == Axis.Z) { + x = speed / -20f; + z += (pos.getZ() + .5f - entityIn.getZ()) * .1f; + } + entityIn.setMotion(entityIn.getMotion() + .add(x, 0, z)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java index e1175feba..944b8e073 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java @@ -91,28 +91,28 @@ public class CrushingWheelControllerBlock extends DirectionalBlock }); } - public void checkEntityForProcessing(World worldIn, BlockPos pos, Entity entityIn){ - try { - CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); - if (te.crushingspeed == 0) - return; - if (entityIn instanceof ItemEntity) - ((ItemEntity) entityIn).setPickupDelay(10); - CompoundNBT data = entityIn.getPersistentData(); - if (data.contains("BypassCrushingWheel")) { - if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) - return; - } - if (te.isOccupied()) - return; - boolean isPlayer = entityIn instanceof PlayerEntity; - if (isPlayer && ((PlayerEntity) entityIn).isCreative()) - return; - if (isPlayer && entityIn.world.getDifficulty() == Difficulty.PEACEFUL) + public void checkEntityForProcessing(World worldIn, BlockPos pos, Entity entityIn) { + CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); + if (te == null) + return; + if (te.crushingspeed == 0) + return; + if (entityIn instanceof ItemEntity) + ((ItemEntity) entityIn).setPickupDelay(10); + CompoundNBT data = entityIn.getPersistentData(); + if (data.contains("BypassCrushingWheel")) { + if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) return; + } + if (te.isOccupied()) + return; + boolean isPlayer = entityIn instanceof PlayerEntity; + if (isPlayer && ((PlayerEntity) entityIn).isCreative()) + return; + if (isPlayer && entityIn.world.getDifficulty() == Difficulty.PEACEFUL) + return; - te.startCrushing(entityIn); - } catch (TileEntityException e) {} + te.startCrushing(entityIn); } @Override @@ -167,26 +167,26 @@ public class CrushingWheelControllerBlock extends DirectionalBlock @Override public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + VoxelShape standardShape = AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING)); + if (!state.get(VALID)) - return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING)); + return standardShape; Entity entity = context.getEntity(); - if (entity != null) { + if (entity == null) + return standardShape; - CompoundNBT data = entity.getPersistentData(); - if (data.contains("BypassCrushingWheel")) { - if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) - if (state.get(FACING) != Direction.UP) //Allow output items to land on top of the block rather than falling back through. - return VoxelShapes.empty(); - } - - try { - CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); - if (te.processingEntity == entity) + CompoundNBT data = entity.getPersistentData(); + if (data.contains("BypassCrushingWheel")) + if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) + if (state.get(FACING) != Direction.UP) // Allow output items to land on top of the block rather than falling back through. return VoxelShapes.empty(); - } catch (TileEntityException e) {} - } - return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING)); + + CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); + if (te != null && te.processingEntity == entity) + return VoxelShapes.empty(); + + return standardShape; } @Override @@ -202,7 +202,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock public Class getTileEntityClass() { return CrushingWheelControllerTileEntity.class; } - + @Override public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java index b00cdc9fd..66acd7430 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java @@ -274,7 +274,7 @@ public class DeployerHandler { // Use on block if (useBlock != DENY && flag1 - && safeOnUse(clickedState, world, clickedPos, player, hand, result) == ActionResultType.SUCCESS) + && safeOnUse(clickedState, world, clickedPos, player, hand, result).isAccepted()) return; if (stack.isEmpty()) return; @@ -299,7 +299,7 @@ public class DeployerHandler { // 'Inert' item use behaviour & block placement ActionResultType onItemUse = stack.onItemUse(itemusecontext); - if (onItemUse == ActionResultType.SUCCESS) + if (onItemUse.isAccepted()) return; if (item == Items.ENDER_PEARL) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java index bad0b74f5..dcfb06eb1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java @@ -99,13 +99,10 @@ public class MillstoneBlock extends KineticBlock implements ITE getTileEntityClass() { return MillstoneTileEntity.class; } - + @Override public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java index 02ce47715..fb49312d3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.processing.ProcessingInventory; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; import com.simibubi.create.content.logistics.block.inventories.BottomlessItemHandler; import com.simibubi.create.foundation.utility.NBTHelper; @@ -44,7 +45,8 @@ public class MountedStorage { return true; LazyOptional capability = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); - return capability.orElse(null) instanceof ItemStackHandler; + IItemHandler handler = capability.orElse(null); + return handler instanceof ItemStackHandler && !(handler instanceof ProcessingInventory); } public MountedStorage(TileEntity te) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java index 8b1abf741..4d60ec775 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java @@ -177,21 +177,23 @@ public class ClockworkBearingTileEntity extends KineticTileEntity } protected float getHourTarget(boolean cycle24) { - int dayTime = (int) (world.getDayTime() % 24000); + boolean isNatural = world.getDimension().isNatural(); + int dayTime = (int) ((world.getDayTime() * (isNatural ? 1 : 24)) % 24000); int hours = (dayTime / 1000 + 6) % 24; int offset = getBlockState().get(ClockworkBearingBlock.FACING) - .getAxisDirection() - .getOffset(); + .getAxisDirection() + .getOffset(); float hourTarget = (float) (offset * -360 / (cycle24 ? 24f : 12f) * (hours % (cycle24 ? 24 : 12))); return hourTarget; } protected float getMinuteTarget() { - int dayTime = (int) (world.getDayTime() % 24000); + boolean isNatural = world.getDimension().isNatural(); + int dayTime = (int) ((world.getDayTime() * (isNatural ? 1 : 24)) % 24000); int minutes = (dayTime % 1000) * 60 / 1000; int offset = getBlockState().get(ClockworkBearingBlock.FACING) - .getAxisDirection() - .getOffset(); + .getAxisDirection() + .getOffset(); float minuteTarget = (float) (offset * -360 / 60f * (minutes)); return minuteTarget; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index 73e80c2e3..b4cfaea85 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -97,7 +97,7 @@ public class SailBlock extends ProperDirectionalBlock { protected void applyDye(BlockState state, World world, BlockPos pos, @Nullable DyeColor color) { BlockState newState = - (color == null ? AllBlocks.SAIL_FRAME : AllBlocks.DYED_SAILS[color.ordinal()]).getDefaultState() + (color == null ? AllBlocks.SAIL_FRAME : AllBlocks.DYED_SAILS.get(color)).getDefaultState() .with(FACING, state.get(FACING)); // Dye the block itself diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 0be88fe66..54ec8d2a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -182,16 +182,18 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat public boolean onValidSurface() { BlockPos pos = hangingPosition; BlockPos pos2 = hangingPosition.offset(getFacingDirection().getOpposite()); + if (pos2.getY() >= 256) + return false; if (!world.isAreaLoaded(pos, 0) || !world.isAreaLoaded(pos2, 0)) return true; if (!isValidFace(world, pos2, getFacingDirection()) - && !isValidFace(world, pos, getFacingDirection().getOpposite())) + && !isValidFace(world, pos, getFacingDirection().getOpposite())) return false; if (isSideSticky(world, pos2, getFacingDirection()) - || isSideSticky(world, pos, getFacingDirection().getOpposite())) + || isSideSticky(world, pos, getFacingDirection().getOpposite())) return false; return world.getEntitiesInAABBexcluding(this, getBoundingBox(), e -> e instanceof SuperGlueEntity) - .isEmpty(); + .isEmpty(); } public static boolean isValidFace(World world, BlockPos pos, Direction direction) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java index 62c811bf8..1245feb7e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java @@ -2,8 +2,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mo import java.util.ArrayList; import java.util.List; -import java.util.Optional; -import java.util.UUID; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -11,21 +9,12 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; -import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; -import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler; -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.content.contraptions.components.tracks.ControllerRailBlock; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.AbstractRailBlock; import net.minecraft.block.Block; @@ -41,7 +30,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.loot.LootContext; import net.minecraft.loot.LootParameters; -import net.minecraft.nbt.CompoundNBT; import net.minecraft.pathfinding.PathType; import net.minecraft.state.BooleanProperty; import net.minecraft.state.EnumProperty; @@ -60,17 +48,14 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.math.vector.Vector3i; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -import net.minecraftforge.common.util.LazyOptional; public class CartAssemblerBlock extends AbstractRailBlock implements ITE, IWrenchable, ISpecialBlockItemRequirement { @@ -138,42 +123,7 @@ public class CartAssemblerBlock extends AbstractRailBlock if (world.isRemote) return; - withTileEntityDo(world, pos, te -> { - if (!te.isMinecartUpdateValid()) - return; - - CartAssemblerAction action = getActionForCart(state, cart); - if (action.shouldAssemble()) - assemble(world, pos, cart); - if (action.shouldDisassemble()) - disassemble(world, pos, cart); - if (action == CartAssemblerAction.ASSEMBLE_ACCELERATE) { - Direction facing = cart.getAdjustedHorizontalFacing(); - - RailShape railShape = state.get(RAIL_SHAPE); - for (Direction d : Iterate.directionsInAxis(railShape == RailShape.EAST_WEST ? Axis.X : Axis.Z)) - if (world.getBlockState(pos.offset(d)) - .isNormalCube(world, pos.offset(d))) - facing = d.getOpposite(); - - float speed = getRailMaxSpeed(state, world, pos, cart); - cart.setMotion(facing.getXOffset() * speed, facing.getYOffset() * speed, facing.getZOffset() * speed); - } - if (action == CartAssemblerAction.ASSEMBLE_ACCELERATE_DIRECTIONAL) { - Vector3i accelerationVector = ControllerRailBlock.getAccelerationVector( - AllBlocks.CONTROLLER_RAIL.getDefaultState() - .with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE)) - .with(ControllerRailBlock.BACKWARDS, state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS)); - float speed = getRailMaxSpeed(state, world, pos, cart); - cart.setMotion(Vector3d.of(accelerationVector).scale(speed)); - } - if (action == CartAssemblerAction.DISASSEMBLE_BRAKE) { - Vector3d diff = VecHelper.getCenterOf(pos) - .subtract(cart.getPositionVec()); - cart.setMotion(diff.x / 16f, 0, diff.z / 16f); - } - - }); + withTileEntityDo(world, pos, te -> te.assembleNextTick(cart)); } public enum CartAssemblerAction { @@ -245,124 +195,6 @@ public class CartAssemblerBlock extends AbstractRailBlock return ActionResultType.PASS; } - protected void assemble(World world, BlockPos pos, AbstractMinecartEntity cart) { - if (!cart.getPassengers() - .isEmpty()) - return; - - LazyOptional optional = - cart.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); - if (optional.isPresent() && optional.orElse(null) - .isCoupledThroughContraption()) - return; - - Optional assembler = getTileEntityOptional(world, pos); - CartMovementMode mode = assembler.map(te -> CartMovementMode.values()[te.movementMode.value]) - .orElse(CartMovementMode.ROTATE); - - MountedContraption contraption = new MountedContraption(mode); - try { - if (!contraption.assemble(world, pos)) - return; - - assembler.ifPresent(te -> { - te.lastException = null; - te.sendData(); - }); - } catch (AssemblyException e) { - assembler.ifPresent(te -> { - te.lastException = e; - te.sendData(); - }); - return; - } - - boolean couplingFound = contraption.connectedCart != null; - Optional initialOrientation = cart.getMotion() - .length() < 1 / 512f ? Optional.empty() : Optional.of(cart.getAdjustedHorizontalFacing()); - - if (couplingFound) { - cart.setPosition(pos.getX() + .5f, pos.getY(), pos.getZ() + .5f); - if (!CouplingHandler.tryToCoupleCarts(null, world, cart.getEntityId(), - contraption.connectedCart.getEntityId())) - return; - } - - contraption.removeBlocksFromWorld(world, BlockPos.ZERO); - contraption.startMoving(world); - contraption.expandBoundsAroundAxis(Axis.Y); - - if (couplingFound) { - Vector3d diff = contraption.connectedCart.getPositionVec() - .subtract(cart.getPositionVec()); - initialOrientation = Optional.of(Direction.fromAngle(MathHelper.atan2(diff.z, diff.x) * 180 / Math.PI)); - } - - OrientedContraptionEntity entity = OrientedContraptionEntity.create(world, contraption, initialOrientation); - if (couplingFound) - entity.setCouplingId(cart.getUniqueID()); - entity.setPosition(pos.getX(), pos.getY(), pos.getZ()); - world.addEntity(entity); - entity.startRiding(cart); - - if (cart instanceof FurnaceMinecartEntity) { - CompoundNBT nbt = cart.serializeNBT(); - nbt.putDouble("PushZ", 0); - nbt.putDouble("PushX", 0); - cart.deserializeNBT(nbt); - } - } - - protected void disassemble(World world, BlockPos pos, AbstractMinecartEntity cart) { - if (cart.getPassengers() - .isEmpty()) - return; - Entity entity = cart.getPassengers() - .get(0); - if (!(entity instanceof OrientedContraptionEntity)) - return; - OrientedContraptionEntity contraption = (OrientedContraptionEntity) entity; - UUID couplingId = contraption.getCouplingId(); - - if (couplingId == null) { - disassembleCart(cart); - return; - } - - Couple coupledCarts = contraption.getCoupledCartsIfPresent(); - if (coupledCarts == null) - return; - - // Make sure connected cart is present and being disassembled - for (boolean current : Iterate.trueAndFalse) { - MinecartController minecartController = coupledCarts.get(current); - if (minecartController.cart() == cart) - continue; - BlockPos otherPos = minecartController.cart() - .getBlockPos(); - BlockState blockState = world.getBlockState(otherPos); - if (!AllBlocks.CART_ASSEMBLER.has(blockState)) - return; - if (!getActionForCart(blockState, minecartController.cart()).shouldDisassemble()) - return; - } - - for (boolean current : Iterate.trueAndFalse) - coupledCarts.get(current) - .removeConnection(current); - disassembleCart(cart); - } - - protected void disassembleCart(AbstractMinecartEntity cart) { - cart.removePassengers(); - if (cart instanceof FurnaceMinecartEntity) { - CompoundNBT nbt = cart.serializeNBT(); - nbt.putDouble("PushZ", cart.getMotion().x); - nbt.putDouble("PushX", cart.getMotion().z); - cart.deserializeNBT(nbt); - } - } - @Override public void neighborChanged(@Nonnull BlockState state, @Nonnull World worldIn, @Nonnull BlockPos pos, @Nonnull Block blockIn, @Nonnull BlockPos fromPos, boolean isMoving) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java index 63a942b25..ef76efaaa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java @@ -1,9 +1,17 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mounted; import java.util.List; +import java.util.Optional; +import java.util.UUID; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; +import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler; +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.content.contraptions.components.tracks.ControllerRailBlock; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -11,15 +19,26 @@ import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxT import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.item.minecart.FurnaceMinecartEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.RailShape; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.vector.Vector3i; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplayAssemblyExceptions { private static final int assemblyCooldown = 8; @@ -28,6 +47,8 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay private int ticksSinceMinecartUpdate; protected AssemblyException lastException; + protected AbstractMinecartEntity cartToAssemble; + public CartAssemblerTileEntity(TileEntityType type) { super(type); ticksSinceMinecartUpdate = assemblyCooldown; @@ -39,12 +60,172 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay if (ticksSinceMinecartUpdate < assemblyCooldown) { ticksSinceMinecartUpdate++; } + + tryAssemble(cartToAssemble); + cartToAssemble = null; + } + + public void tryAssemble(AbstractMinecartEntity cart) { + if (cart == null) + return; + + if (!isMinecartUpdateValid()) + return; + resetTicksSinceMinecartUpdate(); + + BlockState state = world.getBlockState(pos); + if (!AllBlocks.CART_ASSEMBLER.has(state)) + return; + CartAssemblerBlock block = (CartAssemblerBlock) state.getBlock(); + + CartAssemblerBlock.CartAssemblerAction action = CartAssemblerBlock.getActionForCart(state, cart); + if (action.shouldAssemble()) + assemble(world, pos, cart); + if (action.shouldDisassemble()) + disassemble(world, pos, cart); + if (action == CartAssemblerBlock.CartAssemblerAction.ASSEMBLE_ACCELERATE) { + Direction facing = cart.getAdjustedHorizontalFacing(); + + RailShape railShape = state.get(CartAssemblerBlock.RAIL_SHAPE); + for (Direction d : Iterate.directionsInAxis(railShape == RailShape.EAST_WEST ? Axis.X : Axis.Z)) + if (world.getBlockState(pos.offset(d)) + .isNormalCube(world, pos.offset(d))) + facing = d.getOpposite(); + + float speed = block.getRailMaxSpeed(state, world, pos, cart); + cart.setMotion(facing.getXOffset() * speed, facing.getYOffset() * speed, facing.getZOffset() * speed); + } + if (action == CartAssemblerBlock.CartAssemblerAction.ASSEMBLE_ACCELERATE_DIRECTIONAL) { + Vector3i accelerationVector = ControllerRailBlock.getAccelerationVector( + AllBlocks.CONTROLLER_RAIL.getDefaultState() + .with(ControllerRailBlock.SHAPE, state.get(CartAssemblerBlock.RAIL_SHAPE)) + .with(ControllerRailBlock.BACKWARDS, state.get(CartAssemblerBlock.RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS)); + float speed = block.getRailMaxSpeed(state, world, pos, cart); + cart.setMotion(Vector3d.of(accelerationVector).scale(speed)); + } + if (action == CartAssemblerBlock.CartAssemblerAction.DISASSEMBLE_BRAKE) { + Vector3d diff = VecHelper.getCenterOf(pos) + .subtract(cart.getPositionVec()); + cart.setMotion(diff.x / 16f, 0, diff.z / 16f); + } + } + + protected void assemble(World world, BlockPos pos, AbstractMinecartEntity cart) { + if (!cart.getPassengers() + .isEmpty()) + return; + + LazyOptional optional = + cart.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); + if (optional.isPresent() && optional.orElse(null) + .isCoupledThroughContraption()) + return; + + CartMovementMode mode = CartMovementMode.values()[movementMode.value]; + + MountedContraption contraption = new MountedContraption(mode); + try { + if (!contraption.assemble(world, pos)) + return; + + lastException = null; + sendData(); + } catch (AssemblyException e) { + lastException = e; + sendData(); + return; + } + + boolean couplingFound = contraption.connectedCart != null; + Optional initialOrientation = cart.getMotion() + .length() < 1 / 512f ? Optional.empty() : Optional.of(cart.getAdjustedHorizontalFacing()); + + if (couplingFound) { + cart.setPosition(pos.getX() + .5f, pos.getY(), pos.getZ() + .5f); + if (!CouplingHandler.tryToCoupleCarts(null, world, cart.getEntityId(), + contraption.connectedCart.getEntityId())) + return; + } + + contraption.removeBlocksFromWorld(world, BlockPos.ZERO); + contraption.startMoving(world); + contraption.expandBoundsAroundAxis(Axis.Y); + + if (couplingFound) { + Vector3d diff = contraption.connectedCart.getPositionVec() + .subtract(cart.getPositionVec()); + initialOrientation = Optional.of(Direction.fromAngle(MathHelper.atan2(diff.z, diff.x) * 180 / Math.PI)); + } + + OrientedContraptionEntity entity = OrientedContraptionEntity.create(world, contraption, initialOrientation); + if (couplingFound) + entity.setCouplingId(cart.getUniqueID()); + entity.setPosition(pos.getX(), pos.getY(), pos.getZ()); + world.addEntity(entity); + entity.startRiding(cart); + + if (cart instanceof FurnaceMinecartEntity) { + CompoundNBT nbt = cart.serializeNBT(); + nbt.putDouble("PushZ", 0); + nbt.putDouble("PushX", 0); + cart.deserializeNBT(nbt); + } + } + + protected void disassemble(World world, BlockPos pos, AbstractMinecartEntity cart) { + if (cart.getPassengers() + .isEmpty()) + return; + Entity entity = cart.getPassengers() + .get(0); + if (!(entity instanceof OrientedContraptionEntity)) + return; + OrientedContraptionEntity contraption = (OrientedContraptionEntity) entity; + UUID couplingId = contraption.getCouplingId(); + + if (couplingId == null) { + disassembleCart(cart); + return; + } + + Couple coupledCarts = contraption.getCoupledCartsIfPresent(); + if (coupledCarts == null) + return; + + // Make sure connected cart is present and being disassembled + for (boolean current : Iterate.trueAndFalse) { + MinecartController minecartController = coupledCarts.get(current); + if (minecartController.cart() == cart) + continue; + BlockPos otherPos = minecartController.cart() + .getBlockPos(); + BlockState blockState = world.getBlockState(otherPos); + if (!AllBlocks.CART_ASSEMBLER.has(blockState)) + return; + if (!CartAssemblerBlock.getActionForCart(blockState, minecartController.cart()).shouldDisassemble()) + return; + } + + for (boolean current : Iterate.trueAndFalse) + coupledCarts.get(current) + .removeConnection(current); + disassembleCart(cart); + } + + protected void disassembleCart(AbstractMinecartEntity cart) { + cart.removePassengers(); + if (cart instanceof FurnaceMinecartEntity) { + CompoundNBT nbt = cart.serializeNBT(); + nbt.putDouble("PushZ", cart.getMotion().x); + nbt.putDouble("PushX", cart.getMotion().z); + cart.deserializeNBT(nbt); + } } @Override public void addBehaviours(List behaviours) { movementMode = new ScrollOptionBehaviour<>(CartMovementMode.class, - Lang.translate("contraptions.cart_movement_mode"), this, getMovementModeSlot()); + Lang.translate("contraptions.cart_movement_mode"), this, getMovementModeSlot()); movementMode.requiresWrench(); behaviours.add(movementMode); } @@ -71,7 +252,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay } private class CartAssemblerValueBoxTransform extends CenteredSideValueBoxTransform { - + public CartAssemblerValueBoxTransform() { super((state, d) -> { if (d.getAxis() @@ -83,15 +264,15 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay return (d.getAxis() == Axis.X) == (railShape == RailShape.NORTH_SOUTH); }); } - + @Override protected Vector3d getSouthLocation() { return VecHelper.voxelSpace(8, 8, 18); } - + } - - public static enum CartMovementMode implements INamedIconOptions { + + public enum CartMovementMode implements INamedIconOptions { ROTATE(AllIcons.I_CART_ROTATE), ROTATE_PAUSED(AllIcons.I_CART_ROTATE_PAUSED), @@ -102,7 +283,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay private String translationKey; private AllIcons icon; - private CartMovementMode(AllIcons icon) { + CartMovementMode(AllIcons icon) { this.icon = icon; translationKey = "contraptions.cart_movement_mode." + Lang.asId(name()); } @@ -122,6 +303,11 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay ticksSinceMinecartUpdate = 0; } + public void assembleNextTick(AbstractMinecartEntity cart) { + if (cartToAssemble == null) + cartToAssemble = cart; + } + public boolean isMinecartUpdateValid() { return ticksSinceMinecartUpdate >= assemblyCooldown; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java index b91ade7c4..5b9e93781 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java @@ -36,8 +36,7 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE { if (!heldItem.isEmpty()) { te.internalTank.allowInsertion(); ActionResultType tryExchange = tryExchange(worldIn, player, handIn, heldItem, te); @@ -45,7 +44,7 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE, IWrenchab BlockRayTraceResult hit) { ItemStack heldItem = player.getHeldItem(handIn); - try { - BasinTileEntity te = getTileEntity(worldIn, pos); + return onTileEntityUse(worldIn, pos, te -> { if (!heldItem.isEmpty()) { if (FluidHelper.tryEmptyItemIntoTE(worldIn, player, handIn, heldItem, te)) return ActionResultType.SUCCESS; @@ -101,7 +100,7 @@ public class BasinBlock extends Block implements ITE, IWrenchab return ActionResultType.SUCCESS; if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem) - || GenericItemFilling.canItemBeFilled(worldIn, heldItem)) + || GenericItemFilling.canItemBeFilled(worldIn, heldItem)) return ActionResultType.SUCCESS; if (heldItem.getItem() .equals(Items.SPONGE) @@ -128,10 +127,8 @@ public class BasinBlock extends Block implements ITE, IWrenchab worldIn.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .2f, 1f + Create.RANDOM.nextFloat()); te.onEmptied(); - } catch (TileEntityException e) { - } - - return ActionResultType.SUCCESS; + return ActionResultType.SUCCESS; + }); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index 46b4bec3f..fa974ea2b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -102,11 +102,8 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { if (context.getEntity() == null) return shape; - BeltTileEntity belt = getTileEntity(worldIn, pos); - BeltTileEntity controller = belt.getControllerTE(); - + BeltTileEntity controller = te.getControllerTE(); if (controller == null) return shape; - if (controller.passengers == null || !controller.passengers.containsKey(context.getEntity())) { + if (controller.passengers == null || !controller.passengers.containsKey(context.getEntity())) return BeltShapes.getCollisionShape(state); - } + return shape; - } catch (TileEntityException e) { - } - return shape; + }).orElse(shape); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index bde917413..7b9e15cda 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.contraptions.wrench; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; -import com.simibubi.create.foundation.item.PartialItemModelRenderer; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler; import com.simibubi.create.foundation.utility.AnimationTickHolder; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchModel.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchModel.java index 081449d68..7d58c0514 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchModel.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.wrench; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java index fb23177aa..9ef60eaa1 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java @@ -7,6 +7,8 @@ import java.util.Map; import javax.annotation.Nonnull; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.curiosities.symmetry.mirror.CrossPlaneMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror; @@ -225,12 +227,21 @@ public class SymmetryWandItem extends Item { BlockState toReplace = world.getBlockState(position); if (!toReplace.getMaterial() - .isReplaceable()) + .isReplaceable()) continue; if (toReplace.getBlockHardness(world, position) == -1) continue; - if (BlockHelper.findAndRemoveInInventory(blockState, player, 1) == 0) - continue; + + if (AllBlocks.CART_ASSEMBLER.has(blockState)) { + BlockState railBlock = CartAssemblerBlock.getRailBlock(blockState); + if (BlockHelper.findAndRemoveInInventory(railBlock, player, 1) == 0) + continue; + if (BlockHelper.findAndRemoveInInventory(blockState, player, 1) == 0) + blockState = railBlock; + } else { + if (BlockHelper.findAndRemoveInInventory(blockState, player, 1) == 0) + continue; + } BlockSnapshot blocksnapshot = BlockSnapshot.create(world.getRegistryKey(), world, position); FluidState ifluidstate = world.getFluidState(position); diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java index 51cd757ba..0c0461daf 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.curiosities.symmetry.client; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; -import com.simibubi.create.foundation.item.PartialItemModelRenderer; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandModel.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandModel.java index ce5796427..f361c3c9f 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandModel.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandModel.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.curiosities.symmetry.client; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintAssignCompleteRecipePacket.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintAssignCompleteRecipePacket.java new file mode 100644 index 000000000..2e9a2349a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintAssignCompleteRecipePacket.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.curiosities.tools; + +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.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class BlueprintAssignCompleteRecipePacket extends SimplePacketBase { + + private ResourceLocation recipeID; + + public BlueprintAssignCompleteRecipePacket(ResourceLocation recipeID) { + this.recipeID = recipeID; + } + + public BlueprintAssignCompleteRecipePacket(PacketBuffer buffer) { + recipeID = buffer.readResourceLocation(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeResourceLocation(recipeID); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity player = context.get() + .getSender(); + if (player == null) + return; + if (player.openContainer instanceof BlueprintContainer) { + BlueprintContainer c = (BlueprintContainer) player.openContainer; + player.getServerWorld() + .getRecipeManager() + .getRecipe(recipeID) + .ifPresent(r -> BlueprintItem.assignCompleteRecipe(c.ghostInventory, r)); + } + }); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintContainer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintContainer.java new file mode 100644 index 000000000..51a894d9f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintContainer.java @@ -0,0 +1,173 @@ +package com.simibubi.create.content.curiosities.tools; + +import java.util.Optional; + +import com.simibubi.create.AllContainerTypes; +import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; +import com.simibubi.create.foundation.gui.GhostItemContainer; +import com.simibubi.create.foundation.gui.IClearableContainer; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.SSetSlotPacket; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class BlueprintContainer extends GhostItemContainer implements IClearableContainer { + + public BlueprintContainer(ContainerType type, int id, PlayerInventory inv, PacketBuffer extraData) { + super(type, id, inv, extraData); + } + + public BlueprintContainer(ContainerType type, int id, PlayerInventory inv, BlueprintSection section) { + super(type, id, inv, section); + } + + public static BlueprintContainer create(int id, PlayerInventory inv, BlueprintSection section) { + return new BlueprintContainer(AllContainerTypes.CRAFTING_BLUEPRINT.get(), id, inv, section); + } + + @Override + protected boolean allowRepeats() { + return true; + } + + @Override + protected void addSlots() { + addPlayerSlots(33, 137); + + int x = 29; + int y = 21; + int index = 0; + for (int row = 0; row < 3; ++row) + for (int col = 0; col < 3; ++col) + this.addSlot(new BlueprintCraftSlot(ghostInventory, index++, x + col * 18, y + row * 18)); + + addSlot(new BlueprintCraftSlot(ghostInventory, index++, 123, 40)); + addSlot(new SlotItemHandler(ghostInventory, index++, 135, 57)); + } + + public void onCraftMatrixChanged() { + if (contentHolder.getBlueprintWorld().isRemote) + return; + + ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) player; + CraftingInventory craftingInventory = new BlueprintCraftingInventory(this, ghostInventory); + Optional optional = player.getServer() + .getRecipeManager() + .getRecipe(IRecipeType.CRAFTING, craftingInventory, player.getEntityWorld()); + + if (!optional.isPresent()) { + if (ghostInventory.getStackInSlot(9) + .isEmpty()) + return; + if (!contentHolder.inferredIcon) + return; + + ghostInventory.setStackInSlot(9, ItemStack.EMPTY); + serverplayerentity.connection.sendPacket(new SSetSlotPacket(windowId, 36 + 9, ItemStack.EMPTY)); + contentHolder.inferredIcon = false; + return; + } + + ICraftingRecipe icraftingrecipe = optional.get(); + ItemStack itemstack = icraftingrecipe.getCraftingResult(craftingInventory); + ghostInventory.setStackInSlot(9, itemstack); + contentHolder.inferredIcon = true; + ItemStack toSend = itemstack.copy(); + toSend.getOrCreateTag() + .putBoolean("InferredFromRecipe", true); + serverplayerentity.connection.sendPacket(new SSetSlotPacket(windowId, 36 + 9, toSend)); + } + + @Override + public void putStackInSlot(int p_75141_1_, ItemStack p_75141_2_) { + if (p_75141_1_ == 36 + 9) { + if (p_75141_2_.hasTag()) { + contentHolder.inferredIcon = p_75141_2_.getTag() + .getBoolean("InferredFromRecipe"); + p_75141_2_.getTag() + .remove("InferredFromRecipe"); + } else + contentHolder.inferredIcon = false; + } + super.putStackInSlot(p_75141_1_, p_75141_2_); + } + + @Override + protected ItemStackHandler createGhostInventory() { + return contentHolder.getItems(); + } + + @Override + protected void readData(BlueprintSection contentHolder) { + } + + @Override + protected void saveData(BlueprintSection contentHolder) { + contentHolder.save(ghostInventory); + } + + @Override + @OnlyIn(Dist.CLIENT) + protected BlueprintSection createOnClient(PacketBuffer extraData) { + int entityID = extraData.readVarInt(); + int section = extraData.readVarInt(); + Entity entityByID = Minecraft.getInstance().world.getEntityByID(entityID); + if (!(entityByID instanceof BlueprintEntity)) + return null; + BlueprintEntity blueprintEntity = (BlueprintEntity) entityByID; + BlueprintSection blueprintSection = blueprintEntity.getSection(section); + return blueprintSection; + } + + static class BlueprintCraftingInventory extends CraftingInventory { + + public BlueprintCraftingInventory(Container container, ItemStackHandler items) { + super(container, 3, 3); + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + ItemStack stack = items.getStackInSlot(y * 3 + x); + setInventorySlotContents(y * 3 + x, stack == null ? ItemStack.EMPTY : stack.copy()); + } + } + } + + } + + class BlueprintCraftSlot extends SlotItemHandler { + + private int index; + + public BlueprintCraftSlot(IItemHandler itemHandler, int index, int xPosition, int yPosition) { + super(itemHandler, index, xPosition, yPosition); + this.index = index; + } + + @Override + public void onSlotChanged() { + super.onSlotChanged(); + if (index == 9 && getHasStack() && !contentHolder.getBlueprintWorld().isRemote) { + contentHolder.inferredIcon = false; + ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) player; + serverplayerentity.connection.sendPacket(new SSetSlotPacket(windowId, 36 + 9, getStack())); + } + if (index < 9) + onCraftMatrixChanged(); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java new file mode 100644 index 000000000..6a8f863be --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java @@ -0,0 +1,528 @@ +package com.simibubi.create.content.curiosities.tools; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.Validate; + +import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.AllItems; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.item.filter.FilterItem; +import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement; +import com.simibubi.create.content.schematics.ItemRequirement; +import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; +import com.simibubi.create.foundation.networking.ISyncPersistentData; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.RedstoneDiodeBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntitySize; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.Pose; +import net.minecraft.entity.item.HangingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.IPacket; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Hand; +import net.minecraft.util.NonNullList; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.GameRules; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; +import net.minecraftforge.fml.hooks.BasicEventHooks; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.InvWrapper; + +public class BlueprintEntity extends HangingEntity + implements IEntityAdditionalSpawnData, ISpecialEntityItemRequirement, ISyncPersistentData { + + protected int size; + protected Direction verticalOrientation; + + @SuppressWarnings("unchecked") + public BlueprintEntity(EntityType p_i50221_1_, World p_i50221_2_) { + super((EntityType) p_i50221_1_, p_i50221_2_); + size = 1; + } + + public BlueprintEntity(World world, BlockPos pos, Direction facing, Direction verticalOrientation) { + super(AllEntityTypes.CRAFTING_BLUEPRINT.get(), world, pos); + + for (int size = 3; size > 0; size--) { + this.size = size; + this.updateFacingWithBoundingBox(facing, verticalOrientation); + if (this.onValidSurface()) + break; + } + } + + public static EntityType.Builder build(EntityType.Builder builder) { + @SuppressWarnings("unchecked") + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder; + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + public void writeAdditional(CompoundNBT p_213281_1_) { + p_213281_1_.putByte("Facing", (byte) this.facingDirection.getIndex()); + p_213281_1_.putByte("Orientation", (byte) this.verticalOrientation.getIndex()); + p_213281_1_.putInt("Size", size); + super.writeAdditional(p_213281_1_); + } + + @Override + public void readAdditional(CompoundNBT p_70037_1_) { + this.facingDirection = Direction.byIndex(p_70037_1_.getByte("Facing")); + this.verticalOrientation = Direction.byIndex(p_70037_1_.getByte("Orientation")); + this.size = p_70037_1_.getInt("Size"); + super.readAdditional(p_70037_1_); + this.updateFacingWithBoundingBox(this.facingDirection, this.verticalOrientation); + } + + protected void updateFacingWithBoundingBox(Direction facing, Direction verticalOrientation) { + Validate.notNull(facing); + this.facingDirection = facing; + this.verticalOrientation = verticalOrientation; + if (facing.getAxis() + .isHorizontal()) { + this.rotationPitch = 0.0F; + this.rotationYaw = (float) (this.facingDirection.getHorizontalIndex() * 90); + } else { + this.rotationPitch = (float) (-90 * facing.getAxisDirection() + .getOffset()); + this.rotationYaw = verticalOrientation.getAxis() + .isHorizontal() ? 180 + verticalOrientation.getHorizontalAngle() : 0; + } + + this.prevRotationPitch = this.rotationPitch; + this.prevRotationYaw = this.rotationYaw; + this.updateBoundingBox(); + } + + @Override + protected float getEyeHeight(Pose p_213316_1_, EntitySize p_213316_2_) { + return 0; + } + + @Override + protected void updateBoundingBox() { + if (this.facingDirection == null) + return; + if (this.verticalOrientation == null) + return; + + Vector3d pos = Vector3d.of(hangingPosition) + .add(.5, .5, .5) + .subtract(Vector3d.of(facingDirection.getDirectionVec()) + .scale(0.46875)); + double d1 = pos.x; + double d2 = pos.y; + double d3 = pos.z; + this.setPos(d1, d2, d3); + + Axis axis = facingDirection.getAxis(); + if (size == 2) + pos = pos.add(Vector3d.of(axis.isHorizontal() ? facingDirection.rotateYCCW() + .getDirectionVec() + : verticalOrientation.rotateY() + .getDirectionVec()) + .scale(0.5)) + .add(Vector3d + .of(axis.isHorizontal() ? Direction.UP.getDirectionVec() + : facingDirection == Direction.UP ? verticalOrientation.getDirectionVec() + : verticalOrientation.getOpposite() + .getDirectionVec()) + .scale(0.5)); + + d1 = pos.x; + d2 = pos.y; + d3 = pos.z; + + double d4 = (double) this.getWidthPixels(); + double d5 = (double) this.getHeightPixels(); + double d6 = (double) this.getWidthPixels(); + Direction.Axis direction$axis = this.facingDirection.getAxis(); + switch (direction$axis) { + case X: + d4 = 1.0D; + break; + case Y: + d5 = 1.0D; + break; + case Z: + d6 = 1.0D; + } + + d4 = d4 / 32.0D; + d5 = d5 / 32.0D; + d6 = d6 / 32.0D; + this.setBoundingBox(new AxisAlignedBB(d1 - d4, d2 - d5, d3 - d6, d1 + d4, d2 + d5, d3 + d6)); + } + + public boolean onValidSurface() { + if (!world.isSpaceEmpty(this)) + return false; + + int i = Math.max(1, this.getWidthPixels() / 16); + int j = Math.max(1, this.getHeightPixels() / 16); + BlockPos blockpos = this.hangingPosition.offset(this.facingDirection.getOpposite()); + Direction upDirection = facingDirection.getAxis() + .isHorizontal() ? Direction.UP + : facingDirection == Direction.UP ? verticalOrientation : verticalOrientation.getOpposite(); + Direction direction = facingDirection.getAxis() + .isVertical() ? verticalOrientation.rotateY() : facingDirection.rotateYCCW(); + BlockPos.Mutable blockpos$mutable = new BlockPos.Mutable(); + + for (int k = 0; k < i; ++k) { + for (int l = 0; l < j; ++l) { + int i1 = (i - 1) / -2; + int j1 = (j - 1) / -2; + blockpos$mutable.setPos(blockpos) + .move(direction, k + i1) + .move(upDirection, l + j1); + BlockState blockstate = this.world.getBlockState(blockpos$mutable); + if (Block.hasEnoughSolidSide(this.world, blockpos$mutable, this.facingDirection)) + continue; + if (!blockstate.getMaterial() + .isSolid() && !RedstoneDiodeBlock.isDiode(blockstate)) { + return false; + } + } + } + + return this.world.getEntitiesInAABBexcluding(this, this.getBoundingBox(), IS_HANGING_ENTITY) + .isEmpty(); + } + + @Override + public int getWidthPixels() { + return 16 * size; + } + + @Override + public int getHeightPixels() { + return 16 * size; + } + + @Override + public void onBroken(@Nullable Entity p_110128_1_) { + if (!world.getGameRules() + .getBoolean(GameRules.DO_ENTITY_DROPS)) + return; + + playSound(SoundEvents.ENTITY_PAINTING_BREAK, 1.0F, 1.0F); + if (p_110128_1_ instanceof PlayerEntity) { + PlayerEntity playerentity = (PlayerEntity) p_110128_1_; + if (playerentity.abilities.isCreativeMode) { + return; + } + } + + entityDropItem(AllItems.CRAFTING_BLUEPRINT.asStack()); + } + + @Override + public ItemStack getPickedResult(RayTraceResult target) { + return AllItems.CRAFTING_BLUEPRINT.asStack(); + } + + @Override + public ItemRequirement getRequiredItems() { + return new ItemRequirement(ItemUseType.CONSUME, AllItems.CRAFTING_BLUEPRINT.get()); + } + + @Override + public void playPlaceSound() { + this.playSound(SoundEvents.ENTITY_PAINTING_PLACE, 1.0F, 1.0F); + } + + @Override + public void setLocationAndAngles(double p_70012_1_, double p_70012_3_, double p_70012_5_, float p_70012_7_, + float p_70012_8_) { + this.setPosition(p_70012_1_, p_70012_3_, p_70012_5_); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void setPositionAndRotationDirect(double p_180426_1_, double p_180426_3_, double p_180426_5_, + float p_180426_7_, float p_180426_8_, int p_180426_9_, boolean p_180426_10_) { + BlockPos blockpos = + this.hangingPosition.add(p_180426_1_ - this.getX(), p_180426_3_ - this.getY(), p_180426_5_ - this.getZ()); + this.setPosition((double) blockpos.getX(), (double) blockpos.getY(), (double) blockpos.getZ()); + } + + @Override + public void writeSpawnData(PacketBuffer buffer) { + CompoundNBT compound = new CompoundNBT(); + writeAdditional(compound); + buffer.writeCompoundTag(compound); + buffer.writeCompoundTag(getPersistentData()); + } + + @Override + public void readSpawnData(PacketBuffer additionalData) { + readAdditional(additionalData.readCompoundTag()); + getPersistentData().merge(additionalData.readCompoundTag()); + } + + @Override + public ActionResultType applyPlayerInteraction(PlayerEntity player, Vector3d vec, Hand hand) { + if (player instanceof FakePlayer) + return ActionResultType.PASS; + + BlueprintSection section = getSectionAt(vec); + + if (!AllItems.WRENCH.isIn(player.getHeldItem(hand)) && !world.isRemote) { + boolean empty = true; + ItemStackHandler items = section.getItems(); + for (int i = 0; i < 9; i++) { + if (!items.getStackInSlot(i) + .isEmpty()) { + empty = false; + break; + } + } + + if (!empty) { + IItemHandlerModifiable playerInv = new InvWrapper(player.inventory); + boolean firstPass = true; + int amountCrafted = 0; + ForgeHooks.setCraftingPlayer(player); + Optional recipe = Optional.empty(); + + do { + Map stacksTaken = new HashMap<>(); + Map craftingGrid = new HashMap<>(); + boolean success = true; + + Search: + for (int i = 0; i < 9; i++) { + ItemStack requestedItem = items.getStackInSlot(i); + if (requestedItem.isEmpty()) { + craftingGrid.put(i, ItemStack.EMPTY); + continue; + } + + for (int slot = 0; slot < playerInv.getSlots(); slot++) { + if (!FilterItem.test(world, playerInv.getStackInSlot(slot), requestedItem)) + continue; + ItemStack currentItem = playerInv.extractItem(slot, 1, false); + if (stacksTaken.containsKey(slot)) { + stacksTaken.get(slot) + .grow(1); + } else { + stacksTaken.put(slot, currentItem.copy()); + } + craftingGrid.put(i, currentItem); + continue Search; + } + + success = false; + break; + } + + if (success) { + CraftingInventory craftingInventory = new BlueprintCraftingInventory(craftingGrid); + + if (!recipe.isPresent()) + recipe = world.getRecipeManager() + .getRecipe(IRecipeType.CRAFTING, craftingInventory, world); + ItemStack result = recipe.filter(r -> r.matches(craftingInventory, world)) + .map(r -> r.getCraftingResult(craftingInventory)) + .orElse(ItemStack.EMPTY); + + if (result.isEmpty()) { + success = false; + } else if (result.getCount() + amountCrafted > 64) { + success = false; + } else { + amountCrafted += result.getCount(); + result.onCrafting(player.world, player, 1); + BasicEventHooks.firePlayerCraftingEvent(player, result, craftingInventory); + NonNullList nonnulllist = world.getRecipeManager() + .getRecipeNonNull(IRecipeType.CRAFTING, craftingInventory, world); + + if (firstPass) + world.playSound(null, player.getBlockPos(), SoundEvents.ENTITY_ITEM_PICKUP, + SoundCategory.PLAYERS, .2f, 1f + Create.RANDOM.nextFloat()); + player.inventory.placeItemBackInInventory(world, result); + for (ItemStack itemStack : nonnulllist) + player.inventory.placeItemBackInInventory(world, itemStack); + firstPass = false; + } + } + + if (!success) { + for (Entry entry : stacksTaken.entrySet()) + playerInv.insertItem(entry.getKey(), entry.getValue(), false); + break; + } + + } while (player.isSneaking()); + ForgeHooks.setCraftingPlayer(null); + + return ActionResultType.SUCCESS; + } + } + + int i = section.index; + if (!world.isRemote && player instanceof ServerPlayerEntity) { + NetworkHooks.openGui((ServerPlayerEntity) player, section, buf -> { + buf.writeVarInt(getEntityId()); + buf.writeVarInt(i); + }); + } + + return ActionResultType.SUCCESS; + } + + public BlueprintSection getSectionAt(Vector3d vec) { + int index = 0; + if (size > 1) { + vec = VecHelper.rotate(vec, rotationYaw, Axis.Y); + vec = VecHelper.rotate(vec, -rotationPitch, Axis.X); + vec = vec.add(0.5, 0.5, 0); + if (size == 3) + vec = vec.add(1, 1, 0); + int x = MathHelper.clamp(MathHelper.floor(vec.x), 0, size - 1); + int y = MathHelper.clamp(MathHelper.floor(vec.y), 0, size - 1); + index = x + y * size; + } + + BlueprintSection section = getSection(index); + return section; + } + + static class BlueprintCraftingInventory extends CraftingInventory { + + private static Container dummyContainer = new Container(null, -1) { + public boolean canInteractWith(PlayerEntity playerIn) { + return false; + } + }; + + public BlueprintCraftingInventory(Map items) { + super(dummyContainer, 3, 3); + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + ItemStack stack = items.get(y * 3 + x); + setInventorySlotContents(y * 3 + x, stack == null ? ItemStack.EMPTY : stack.copy()); + } + } + } + + } + + public CompoundNBT getOrCreateRecipeCompound() { + CompoundNBT persistentData = getPersistentData(); + if (!persistentData.contains("Recipes")) + persistentData.put("Recipes", new CompoundNBT()); + return persistentData.getCompound("Recipes"); + } + + private Map sectionCache = new HashMap<>(); + + public BlueprintSection getSection(int index) { + return sectionCache.computeIfAbsent(index, i -> new BlueprintSection(i)); + } + + class BlueprintSection implements INamedContainerProvider { + int index; + Couple cachedDisplayItems; + public boolean inferredIcon = false; + + public BlueprintSection(int index) { + this.index = index; + } + + public Couple getDisplayItems() { + if (cachedDisplayItems != null) + return cachedDisplayItems; + ItemStackHandler items = getItems(); + return cachedDisplayItems = Couple.create(items.getStackInSlot(9), items.getStackInSlot(10)); + } + + public ItemStackHandler getItems() { + ItemStackHandler newInv = new ItemStackHandler(11); + CompoundNBT list = getOrCreateRecipeCompound(); + CompoundNBT invNBT = list.getCompound(index + ""); + inferredIcon = list.getBoolean("InferredIcon"); + if (!invNBT.isEmpty()) + newInv.deserializeNBT(invNBT); + return newInv; + } + + public void save(ItemStackHandler inventory) { + CompoundNBT list = getOrCreateRecipeCompound(); + list.put(index + "", inventory.serializeNBT()); + list.putBoolean("InferredIcon", inferredIcon); + cachedDisplayItems = null; + if (!world.isRemote) + syncPersistentDataWithTracking(BlueprintEntity.this); + } + + public boolean isEntityAlive() { + return isAlive(); + } + + public World getBlueprintWorld() { + return world; + } + + @Override + public Container createMenu(int id, PlayerInventory inv, PlayerEntity player) { + return BlueprintContainer.create(id, inv, this); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent(""); + } + + } + + @Override + public void onPersistentDataUpdated() { + sectionCache.clear(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintItem.java new file mode 100644 index 000000000..355df3b30 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintItem.java @@ -0,0 +1,154 @@ +package com.simibubi.create.content.curiosities.tools; + +import java.util.Collection; + +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode; +import com.simibubi.create.content.logistics.item.filter.FilterItem; +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.item.HangingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.crafting.Ingredient.IItemList; +import net.minecraft.item.crafting.Ingredient.SingleItemList; +import net.minecraft.item.crafting.Ingredient.TagList; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.crafting.StackList; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import net.minecraftforge.items.ItemStackHandler; + +public class BlueprintItem extends Item { + + public BlueprintItem(Properties p_i48487_1_) { + super(p_i48487_1_); + } + + @Override + public ActionResultType onItemUse(ItemUseContext ctx) { + Direction face = ctx.getFace(); + PlayerEntity player = ctx.getPlayer(); + ItemStack stack = ctx.getItem(); + BlockPos pos = ctx.getPos() + .offset(face); + + if (player != null && !player.canPlayerEdit(pos, face, stack)) + return ActionResultType.FAIL; + + World world = ctx.getWorld(); + HangingEntity hangingentity = new BlueprintEntity(world, pos, face, face.getAxis() + .isHorizontal() ? Direction.DOWN : ctx.getPlacementHorizontalFacing()); + CompoundNBT compoundnbt = stack.getTag(); + + if (compoundnbt != null) + EntityType.applyItemNBT(world, player, hangingentity, compoundnbt); + if (!hangingentity.onValidSurface()) + return ActionResultType.CONSUME; + if (!world.isRemote) { + hangingentity.playPlaceSound(); + world.addEntity(hangingentity); + } + + stack.shrink(1); + return ActionResultType.success(world.isRemote); + } + + protected boolean canPlace(PlayerEntity p_200127_1_, Direction p_200127_2_, ItemStack p_200127_3_, + BlockPos p_200127_4_) { + return p_200127_1_.canPlayerEdit(p_200127_4_, p_200127_2_, p_200127_3_); + } + + public static void assignCompleteRecipe(ItemStackHandler inv, IRecipe recipe) { + NonNullList ingredients = recipe.getIngredients(); + + for (int i = 0; i < 9; i++) + inv.setStackInSlot(i, ItemStack.EMPTY); + inv.setStackInSlot(9, recipe.getRecipeOutput()); + + if (recipe instanceof ShapedRecipe) { + ShapedRecipe shapedRecipe = (ShapedRecipe) recipe; + for (int row = 0; row < shapedRecipe.getHeight(); row++) + for (int col = 0; col < shapedRecipe.getWidth(); col++) + inv.setStackInSlot(row * 3 + col, + convertIngredientToFilter(ingredients.get(row * shapedRecipe.getWidth() + col))); + } else { + for (int i = 0; i < ingredients.size(); i++) + inv.setStackInSlot(i, convertIngredientToFilter(ingredients.get(i))); + } + } + + private static ItemStack convertIngredientToFilter(Ingredient ingredient) { + Ingredient.IItemList[] acceptedItems = + ObfuscationReflectionHelper.getPrivateValue(Ingredient.class, ingredient, "field_199807_b"); + if (acceptedItems == null || acceptedItems.length > 18) + return ItemStack.EMPTY; + if (acceptedItems.length == 0) + return ItemStack.EMPTY; + if (acceptedItems.length == 1) + return convertIItemListToFilter(acceptedItems[0]); + + ItemStack result = AllItems.FILTER.asStack(); + ItemStackHandler filterItems = FilterItem.getFilterItems(result); + for (int i = 0; i < acceptedItems.length; i++) + filterItems.setStackInSlot(i, convertIItemListToFilter(acceptedItems[i])); + result.getOrCreateTag() + .put("Items", filterItems.serializeNBT()); + return result; + } + + private static ItemStack convertIItemListToFilter(IItemList itemList) { + Collection stacks = itemList.getStacks(); + if (itemList instanceof SingleItemList) { + for (ItemStack itemStack : stacks) + return itemStack; + } + + if (itemList instanceof TagList) { + ResourceLocation resourcelocation = new ResourceLocation(JSONUtils.getString(itemList.serialize(), "tag")); + ItemStack filterItem = AllItems.ATTRIBUTE_FILTER.asStack(); + filterItem.getOrCreateTag() + .putInt("WhitelistMode", WhitelistMode.WHITELIST_DISJ.ordinal()); + ListNBT attributes = new ListNBT(); + ItemAttribute at = new ItemAttribute.InTag(resourcelocation); + CompoundNBT compoundNBT = new CompoundNBT(); + at.serializeNBT(compoundNBT); + compoundNBT.putBoolean("Inverted", false); + attributes.add(compoundNBT); + filterItem.getOrCreateTag() + .put("MatchedAttributes", attributes); + return filterItem; + } + + if (itemList instanceof StackList) { + ItemStack result = AllItems.FILTER.asStack(); + ItemStackHandler filterItems = FilterItem.getFilterItems(result); + int i = 0; + for (ItemStack itemStack : stacks) { + if (i >= 18) + break; + filterItems.setStackInSlot(i++, itemStack); + } + CompoundNBT tag = result.getOrCreateTag(); + tag.put("Items", filterItems.serializeNBT()); + tag.putBoolean("RespectNBT", true); + return result; + } + + return ItemStack.EMPTY; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java new file mode 100644 index 000000000..7d6825239 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java @@ -0,0 +1,241 @@ +package com.simibubi.create.content.curiosities.tools; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintCraftingInventory; +import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; +import com.simibubi.create.content.logistics.item.filter.FilterItem; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.util.math.EntityRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; + +public class BlueprintOverlayRenderer { + + static boolean active; + static boolean empty; + static boolean lastSneakState; + static BlueprintSection lastTargetedSection; + + static List> ingredients = new ArrayList<>(); + static ItemStack result = ItemStack.EMPTY; + static boolean resultCraftable = false; + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + RayTraceResult mouseOver = mc.objectMouseOver; + BlueprintSection last = lastTargetedSection; + boolean sneak = mc.player.isSneaking(); + lastTargetedSection = null; + active = false; + if (mouseOver == null) + return; + if (mouseOver.getType() != Type.ENTITY) + return; + + EntityRayTraceResult entityRay = (EntityRayTraceResult) mouseOver; + if (!(entityRay.getEntity() instanceof BlueprintEntity)) + return; + + BlueprintEntity blueprintEntity = (BlueprintEntity) entityRay.getEntity(); + BlueprintSection sectionAt = blueprintEntity.getSectionAt(entityRay.getHitVec() + .subtract(blueprintEntity.getPositionVec())); + + lastTargetedSection = last; + active = true; + + if (sectionAt != lastTargetedSection || AnimationTickHolder.getTicks() % 10 == 0 || lastSneakState != sneak) + rebuild(sectionAt, sneak); + + lastTargetedSection = sectionAt; + lastSneakState = sneak; + } + + public static void rebuild(BlueprintSection sectionAt, boolean sneak) { + ItemStackHandler items = sectionAt.getItems(); + boolean empty = true; + for (int i = 0; i < 9; i++) { + if (!items.getStackInSlot(i) + .isEmpty()) { + empty = false; + break; + } + } + + BlueprintOverlayRenderer.empty = empty; + BlueprintOverlayRenderer.result = ItemStack.EMPTY; + + if (empty) + return; + + boolean firstPass = true; + boolean success = true; + Minecraft mc = Minecraft.getInstance(); + ItemStackHandler playerInv = new ItemStackHandler(mc.player.inventory.getSizeInventory()); + for (int i = 0; i < playerInv.getSlots(); i++) + playerInv.setStackInSlot(i, mc.player.inventory.getStackInSlot(i) + .copy()); + + int amountCrafted = 0; + Optional recipe = Optional.empty(); + Map craftingGrid = new HashMap<>(); + ingredients.clear(); + ItemStackHandler missingItems = new ItemStackHandler(64); + ItemStackHandler availableItems = new ItemStackHandler(64); + List newlyAdded = new ArrayList<>(); + List newlyMissing = new ArrayList<>(); + boolean invalid = false; + + do { + craftingGrid.clear(); + newlyAdded.clear(); + newlyMissing.clear(); + + Search: + for (int i = 0; i < 9; i++) { + ItemStack requestedItem = items.getStackInSlot(i); + if (requestedItem.isEmpty()) { + craftingGrid.put(i, ItemStack.EMPTY); + continue; + } + + for (int slot = 0; slot < playerInv.getSlots(); slot++) { + if (!FilterItem.test(mc.world, playerInv.getStackInSlot(slot), requestedItem)) + continue; + ItemStack currentItem = playerInv.extractItem(slot, 1, false); + craftingGrid.put(i, currentItem); + newlyAdded.add(currentItem); + continue Search; + } + + success = false; + newlyMissing.add(requestedItem); + } + + if (success) { + CraftingInventory craftingInventory = new BlueprintCraftingInventory(craftingGrid); + if (!recipe.isPresent()) + recipe = mc.world.getRecipeManager() + .getRecipe(IRecipeType.CRAFTING, craftingInventory, mc.world); + ItemStack resultFromRecipe = recipe.filter(r -> r.matches(craftingInventory, mc.world)) + .map(r -> r.getCraftingResult(craftingInventory)) + .orElse(ItemStack.EMPTY); + + if (resultFromRecipe.isEmpty()) { + if (!recipe.isPresent()) + invalid = true; + success = false; + } else if (resultFromRecipe.getCount() + amountCrafted > 64) { + success = false; + } else { + amountCrafted += resultFromRecipe.getCount(); + if (result.isEmpty()) + result = resultFromRecipe.copy(); + else + result.grow(resultFromRecipe.getCount()); + resultCraftable = true; + firstPass = false; + } + } + + if (success || firstPass) { + newlyAdded.forEach(s -> ItemHandlerHelper.insertItemStacked(availableItems, s, false)); + newlyMissing.forEach(s -> ItemHandlerHelper.insertItemStacked(missingItems, s, false)); + } + + if (!success) { + if (firstPass) { + result = invalid ? ItemStack.EMPTY : items.getStackInSlot(9); + resultCraftable = false; + } + break; + } + + if (!sneak) + break; + + } while (success); + + for (int i = 0; i < 9; i++) { + ItemStack available = availableItems.getStackInSlot(i); + if (available.isEmpty()) + continue; + ingredients.add(Pair.of(available, true)); + } + for (int i = 0; i < 9; i++) { + ItemStack missing = missingItems.getStackInSlot(i); + if (missing.isEmpty()) + continue; + ingredients.add(Pair.of(missing, false)); + } + } + + public static void renderOverlay(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, + float partialTicks) { + if (!active || empty) + return; + + Minecraft mc = Minecraft.getInstance(); + int w = 30 + 21 * ingredients.size() + 21; + + int x = (mc.getWindow() + .getScaledWidth() - w) / 2; + int y = (int) (mc.getWindow() + .getScaledHeight() / 3f * 2); + + for (Pair pair : ingredients) { + RenderSystem.enableBlend(); + (pair.getSecond() ? AllGuiTextures.HOTSLOT_ACTIVE : AllGuiTextures.HOTSLOT).draw(ms, x, y); + ItemStack itemStack = pair.getFirst(); + GuiGameElement.of(itemStack) + .at(x + 3, y + 3) + .render(ms); + mc.getItemRenderer() + .renderItemOverlayIntoGUI(mc.fontRenderer, itemStack, x + 3, y + 3, + pair.getSecond() || itemStack.getCount() == 1 ? null + : TextFormatting.GOLD.toString() + itemStack.getCount()); + x += 21; + } + + x += 5; + RenderSystem.enableBlend(); + AllGuiTextures.HOTSLOT_ARROW.draw(ms, x, y + 4); + x += 25; + + if (result.isEmpty()) { + AllGuiTextures.HOTSLOT.draw(ms, x, y); + GuiGameElement.of(Items.BARRIER) + .at(x + 3, y + 3) + .render(ms); + } else { + (resultCraftable ? AllGuiTextures.HOTSLOT_SUPER_ACTIVE : AllGuiTextures.HOTSLOT).draw(ms, + resultCraftable ? x - 1 : x, resultCraftable ? y - 1 : y); + GuiGameElement.of(result) + .at(x + 3, y + 3) + .render(ms); + mc.getItemRenderer() + .renderItemOverlayIntoGUI(mc.fontRenderer, result, x + 3, y + 3, null); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java new file mode 100644 index 000000000..09007d6bf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java @@ -0,0 +1,116 @@ +package com.simibubi.create.content.curiosities.tools; + +import com.jozufozu.flywheel.core.PartialModel; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; +import com.simibubi.create.foundation.render.PartialBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.vector.Matrix3f; + +public class BlueprintRenderer extends EntityRenderer { + + public BlueprintRenderer(EntityRendererManager p_i46179_1_) { + super(p_i46179_1_); + } + + @Override + public void render(BlueprintEntity entity, float yaw, float pt, MatrixStack ms, IRenderTypeBuffer buffer, + int overlay) { + PartialModel partialModel = entity.size == 3 ? AllBlockPartials.CRAFTING_BLUEPRINT_3x3 + : entity.size == 2 ? AllBlockPartials.CRAFTING_BLUEPRINT_2x2 : AllBlockPartials.CRAFTING_BLUEPRINT_1x1; + SuperByteBuffer sbb = PartialBufferer.get(partialModel, Blocks.AIR.getDefaultState()); + int light = WorldRenderer.getLightmapCoordinates(entity.world, entity.getBlockPos()); + sbb.matrixStacker() + .rotateY(-yaw) + .rotateX(90.0F + entity.rotationPitch) + .translate(-.5, -1 / 32f, -.5); + if (entity.size == 2) + sbb.translate(.5, 0, -.5); + sbb.light(light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + super.render(entity, yaw, pt, ms, buffer, light); + + ms.push(); + + MatrixStacker.of(ms) + .rotateY(-yaw) + .rotateX(entity.rotationPitch == -90 ? -45 : entity.rotationPitch == 0 ? -15 : -5); + Matrix3f copy = ms.peek() + .getNormal() + .copy(); + + ms.pop(); + ms.push(); + + MatrixStacker.of(ms) + .rotateY(-yaw) + .rotateX(entity.rotationPitch) + .translate(0, 0, 1 / 32f + .001); + + if (entity.size == 3) + ms.translate(-1, -1, 0); + + for (int x = 0; x < entity.size; x++) { + ms.push(); + for (int y = 0; y < entity.size; y++) { + BlueprintSection section = entity.getSection(x * entity.size + y); + Couple displayItems = section.getDisplayItems(); + ms.push(); + ms.scale(.5f, .5f, 1 / 1024f); + displayItems.forEachWithContext((stack, primary) -> { + if (stack.isEmpty()) + return; + + ms.push(); + if (!primary) { + ms.translate(0.325f, -0.325f, 1); + ms.scale(.625f, .625f, 1); + } + + Matrix3f n = ms.peek() + .getNormal(); + n.a00 = copy.a00; + n.a01 = copy.a01; + n.a02 = copy.a02; + n.a10 = copy.a10; + n.a11 = copy.a11; + n.a12 = copy.a12; + n.a20 = copy.a20; + n.a21 = copy.a21; + n.a22 = copy.a22; + + Minecraft.getInstance() + .getItemRenderer() + .renderItem(stack, TransformType.GUI, light, overlay, ms, buffer); + ms.pop(); + }); + ms.pop(); + ms.translate(1, 0, 0); + } + ms.pop(); + ms.translate(0, 1, 0); + } + + ms.pop(); + } + + @Override + public ResourceLocation getEntityTexture(BlueprintEntity p_110775_1_) { + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java new file mode 100644 index 000000000..3ce0d4fdb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java @@ -0,0 +1,193 @@ +package com.simibubi.create.content.curiosities.tools; + +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.AllBlockPartials; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; +import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option; +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.networking.AllPackets; +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 BlueprintScreen extends AbstractSimiContainerScreen { + + protected AllGuiTextures background; + private List extraAreas = Collections.emptyList(); + + private IconButton resetButton; + private IconButton confirmButton; + + public BlueprintScreen(BlueprintContainer container, PlayerInventory inv, ITextComponent title) { + super(container, inv, title); + this.background = AllGuiTextures.BLUEPRINT; + } + + @Override + protected void init() { + setWindowSize(background.width + 50, background.height + PLAYER_INVENTORY.height + 20); + super.init(); + widgets.clear(); + int x = guiLeft; + 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 - 62, guiTop + background.height - 24, AllIcons.I_TRASH); + confirmButton = new IconButton(x + background.width - 33, guiTop + background.height - 24, 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; + background.draw(ms, this, x, y); + + int invX = guiLeft + 25; + int invY = y + background.height + 10; + PLAYER_INVENTORY.draw(ms, this, invX, invY); + + String localizedName = I18n.format(AllItems.CRAFTING_BLUEPRINT.get() + .getTranslationKey()); + textRenderer.draw(ms, playerInventory.getDisplayName(), invX + 7, invY + 6, 0x666666); + textRenderer.draw(ms, localizedName, x + 15, y + 4, 0xFFFFFF); + + GuiGameElement.of(AllBlockPartials.CRAFTING_BLUEPRINT_1x1).at(x + background.width + 20, guiTop + background.height - 35, 0) + .rotate(45, -45, 22.5f) + .scale(40) + .render(ms); + } + + @Override + protected void drawMouseoverTooltip(MatrixStack ms, int x, int y) { + if (!this.client.player.inventory.getItemStack() + .isEmpty() || this.hoveredSlot == null || this.hoveredSlot.getHasStack() + || hoveredSlot.inventory == container.playerInventory) { + super.drawMouseoverTooltip(ms, x, y); + return; + } + renderWrappedToolTip(ms, addToTooltip(new LinkedList<>(), hoveredSlot.getSlotIndex(), true), x, y, + textRenderer); + } + + @Override + public List getTooltipFromItem(ItemStack stack) { + List list = super.getTooltipFromItem(stack); + if (hoveredSlot.inventory == container.playerInventory) + return list; + return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex(), false) : list; + } + + private List addToTooltip(List list, int slot, boolean isEmptySlot) { + if (slot < 0 || slot > 10) + return list; + + if (slot < 9) { + list.add(Lang.createTranslationTextComponent("crafting_blueprint.crafting_slot") + .formatted(TextFormatting.GOLD)); + if (isEmptySlot) + list.add(Lang.createTranslationTextComponent("crafting_blueprint.filter_items_viable") + .formatted(TextFormatting.GRAY)); + + } else if (slot == 9) { + list.add(Lang.createTranslationTextComponent("crafting_blueprint.display_slot") + .formatted(TextFormatting.GOLD)); + if (!isEmptySlot) + list.add(Lang + .createTranslationTextComponent("crafting_blueprint." + + (container.contentHolder.inferredIcon ? "inferred" : "manually_assigned")) + .formatted(TextFormatting.GRAY)); + + } else if (slot == 10) { + list.add(Lang.createTranslationTextComponent("crafting_blueprint.secondary_display_slot") + .formatted(TextFormatting.GOLD)); + if (isEmptySlot) + list.add(Lang.createTranslationTextComponent("crafting_blueprint.optional") + .formatted(TextFormatting.GRAY)); + } + + return list; + } + + @Override + public void tick() { +// handleTooltips(); + super.tick(); + + if (!container.contentHolder.isEntityAlive()) + client.player.closeScreen(); + } + +// protected void handleTooltips() { +// List tooltipButtons = getTooltipButtons(); +// +// for (IconButton button : tooltipButtons) { +// if (!button.getToolTip() +// .isEmpty()) { +// button.setToolTip(button.getToolTip() +// .get(0)); +// button.getToolTip() +// .add(TooltipHelper.holdShift(Palette.Yellow, hasShiftDown())); +// } +// } +// +// if (hasShiftDown()) { +// List tooltipDescriptions = getTooltipDescriptions(); +// for (int i = 0; i < tooltipButtons.size(); i++) +// fillToolTip(tooltipButtons.get(i), tooltipDescriptions.get(i)); +// } +// } + + @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(); + contentsCleared(); + container.sendClearPacket(); + return true; + } + } + + return mouseClicked; + } + + protected void contentsCleared() { + } + + protected void sendOptionUpdate(Option option) { + AllPackets.channel.sendToServer(new FilterScreenPacket(option)); + } + + @Override + public List getExtraAreas() { + return extraAreas; + } +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java index ecba3ded1..3b6a2acc6 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java @@ -37,6 +37,7 @@ import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.living.LivingKnockBackEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -62,17 +63,18 @@ public class ExtendoGripItem extends Item { public ExtendoGripItem(Properties properties) { super(properties.maxStackSize(1) - .rarity(Rarity.UNCOMMON)); + .rarity(Rarity.UNCOMMON)); } + public static final String EXTENDO_MARKER = "createExtendo"; + public static final String DUAL_EXTENDO_MARKER = "createDualExtendo"; + @SubscribeEvent public static void holdingExtendoGripIncreasesRange(LivingUpdateEvent event) { if (!(event.getEntity() instanceof PlayerEntity)) return; PlayerEntity player = (PlayerEntity) event.getEntityLiving(); - String marker = "createExtendo"; - String dualMarker = "createDualExtendo"; CompoundNBT persistentData = player.getPersistentData(); boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemOffhand()); @@ -80,38 +82,49 @@ public class ExtendoGripItem extends Item { boolean holdingDualExtendo = inOff && inMain; boolean holdingExtendo = inOff ^ inMain; holdingExtendo &= !holdingDualExtendo; - boolean wasHoldingExtendo = persistentData.contains(marker); - boolean wasHoldingDualExtendo = persistentData.contains(dualMarker); + boolean wasHoldingExtendo = persistentData.contains(EXTENDO_MARKER); + boolean wasHoldingDualExtendo = persistentData.contains(DUAL_EXTENDO_MARKER); if (holdingExtendo != wasHoldingExtendo) { if (!holdingExtendo) { player.getAttributes().removeModifiers(rangeModifier.getValue()); - persistentData.remove(marker); + persistentData.remove(EXTENDO_MARKER); } else { if (player instanceof ServerPlayerEntity) AllTriggers.EXTENDO.trigger((ServerPlayerEntity) player); player.getAttributes() - .addTemporaryModifiers(rangeModifier.getValue()); - persistentData.putBoolean(marker, true); + .addTemporaryModifiers(rangeModifier.getValue()); + persistentData.putBoolean(EXTENDO_MARKER, true); } } if (holdingDualExtendo != wasHoldingDualExtendo) { if (!holdingDualExtendo) { player.getAttributes() - .removeModifiers(doubleRangeModifier.getValue()); - persistentData.remove(dualMarker); + .removeModifiers(doubleRangeModifier.getValue()); + persistentData.remove(DUAL_EXTENDO_MARKER); } else { if (player instanceof ServerPlayerEntity) AllTriggers.GIGA_EXTENDO.trigger((ServerPlayerEntity) player); player.getAttributes() - .addTemporaryModifiers(doubleRangeModifier.getValue()); - persistentData.putBoolean(dualMarker, true); + .addTemporaryModifiers(doubleRangeModifier.getValue()); + persistentData.putBoolean(DUAL_EXTENDO_MARKER, true); } } } + @SubscribeEvent + public static void addReachToJoiningPlayersHoldingExtendo(PlayerEvent.PlayerLoggedInEvent event) { + PlayerEntity player = event.getPlayer(); + CompoundNBT persistentData = player.getPersistentData(); + + if (persistentData.contains(DUAL_EXTENDO_MARKER)) + player.getAttributes().addTemporaryModifiers(doubleRangeModifier.getValue()); + else if (persistentData.contains(EXTENDO_MARKER)) + player.getAttributes().addTemporaryModifiers(rangeModifier.getValue()); + } + @SubscribeEvent @OnlyIn(Dist.CLIENT) public static void dontMissEntitiesWhenYouHaveHighReachDistance(ClickInputEvent event) { diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java index 2869afcea..c604eeb3a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.curiosities.tools; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; -import com.simibubi.create.foundation.item.PartialItemModelRenderer; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripModel.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripModel.java index aa8718952..cd37439f5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripModel.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripModel.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.curiosities.tools; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java index a5ce27abe..fca6a5c45 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.curiosities.tools; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java index 9904b6d39..db8beb57b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.curiosities.zapper; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; -import com.simibubi.create.foundation.item.PartialItemModelRenderer; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import net.minecraft.block.BlockState; import net.minecraft.block.FourWayBlock; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java index 9c2369935..3b5886bab 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java @@ -5,7 +5,7 @@ import static net.minecraft.util.math.MathHelper.clamp; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; -import com.simibubi.create.foundation.item.PartialItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperModel.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperModel.java index d28e0a2af..c27b76932 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperModel.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperModel.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.curiosities.zapper.terrainzapper; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java index 60970e62d..34e2a3976 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java @@ -200,24 +200,18 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I public ActionResultType onUse(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult p_225533_6_) { if (!player.getHeldItem(hand) - .isEmpty()) + .isEmpty()) return ActionResultType.PASS; if (world.isRemote) return ActionResultType.SUCCESS; - try { - ChuteTileEntity te = getTileEntity(world, pos); - if (te == null) - return ActionResultType.PASS; + + return onTileEntityUse(world, pos, te -> { if (te.item.isEmpty()) return ActionResultType.PASS; player.inventory.placeItemBackInInventory(world, te.item); te.setItem(ItemStack.EMPTY); return ActionResultType.SUCCESS; - - } catch (TileEntityException e) { - e.printStackTrace(); - } - return ActionResultType.PASS; + }); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java index 3d018cb61..bda0d93db 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java @@ -47,30 +47,25 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE { boolean sneak = player.isSneaking(); - AnalogLeverTileEntity te = getTileEntity(worldIn, pos); te.changeState(sneak); float f = .25f + ((te.state + 5) / 15f) * .5f; worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); - } catch (TileEntityException e) {} - - return ActionResultType.SUCCESS; + return ActionResultType.SUCCESS; + }); } @Override public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { - try { - return getTileEntity(blockAccess, pos).state; - } catch (TileEntityException e) { - return 0; - } + return getTileEntityOptional(blockAccess, pos).map(al -> al.state) + .orElse(0); } @Override @@ -86,27 +81,26 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE { + if (te.state != 0 && rand.nextFloat() < 0.25F) addParticles(stateIn, worldIn, pos, 0.5F); - } catch (TileEntityException e) {} + }); } @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - try { - AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); - if (!isMoving && state.getBlock() != newState.getBlock()) { - if (tileEntity.state != 0) - updateNeighbors(state, worldIn, pos); - worldIn.removeTileEntity(pos); - } - } catch (TileEntityException e) {} + if (isMoving || state.getBlock() == newState.getBlock()) + return; + withTileEntityDo(worldIn, pos, te -> { + if (te.state != 0) + updateNeighbors(state, worldIn, pos); + worldIn.removeTileEntity(pos); + }); } private static void addParticles(BlockState state, IWorld worldIn, BlockPos pos, float alpha) { - Direction direction = state.get(HORIZONTAL_FACING).getOpposite(); + Direction direction = state.get(HORIZONTAL_FACING) + .getOpposite(); Direction direction1 = getFacing(state).getOpposite(); double d0 = (double) pos.getX() + 0.5D + 0.1D * (double) direction.getXOffset() + 0.2D * (double) direction1.getXOffset(); @@ -137,7 +131,7 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE getTileEntityClass() { return AnalogLeverTileEntity.class; } - + @Override public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java index 8dd81f379..5205140b2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java @@ -42,52 +42,50 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE te.displayCustomNameOf(heldItem, rowPosition)); - BlockPos nextPos = currentPos.offset(right); - if (world.getBlockState(nextPos) != state) - break; - currentPos = nextPos; - index++; - } + BlockPos currentPos = pos; + while (true) { + BlockPos nextPos = currentPos.offset(left); + if (world.getBlockState(nextPos) != state) + break; + currentPos = nextPos; } - } catch (TileEntityException e) { + int index = 0; + + while (true) { + final int rowPosition = index; + withTileEntityDo(world, currentPos, te -> te.displayCustomNameOf(heldItem, rowPosition)); + BlockPos nextPos = currentPos.offset(right); + if (world.getBlockState(nextPos) != state) + break; + currentPos = nextPos; + index++; + } } return ActionResultType.PASS; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java index 6c58c7651..0469c1161 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java @@ -114,12 +114,8 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE { Boolean wasReceiver = state.get(RECEIVER); boolean blockPowered = worldIn.isBlockPowered(pos); worldIn.setBlockState(pos, state.cycle(RECEIVER) - .with(POWERED, blockPowered), 3); + .with(POWERED, blockPowered), 3); te.transmit(wasReceiver ? 0 : getPower(worldIn, pos)); return ActionResultType.SUCCESS; - } catch (TileEntityException e) { - } - return ActionResultType.PASS; + }); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java index 6055c1aac..7dc6293fa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.block.redstone; +import java.util.Random; + import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; @@ -27,6 +29,7 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -82,11 +85,14 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE 15) + .orElse(0); + } + + @Override + public void scheduledTick(BlockState blockState, ServerWorld world, BlockPos pos, Random random) { + getTileEntityOptional(world, pos).ifPresent(StockpileSwitchTileEntity::updatePowerAfterDelay); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java index 87f406177..51800ee50 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java @@ -14,6 +14,7 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.TickPriority; import net.minecraftforge.items.IItemHandler; public class StockpileSwitchTileEntity extends SmartTileEntity { @@ -23,6 +24,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { public float currentLevel; private boolean state; private boolean inverted; + private boolean poweredAfterDelay; private FilteringBehaviour filtering; private InvManipulationBehaviour observedInventory; @@ -34,6 +36,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { currentLevel = -1; state = false; inverted = false; + poweredAfterDelay = false; setLazyTickRate(10); } @@ -44,6 +47,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { currentLevel = compound.getFloat("Current"); state = compound.getBoolean("Powered"); inverted = compound.getBoolean("Inverted"); + poweredAfterDelay = compound.getBoolean("PoweredAfterDelay"); super.fromTag(blockState, compound, clientPacket); } @@ -54,6 +58,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { compound.putFloat("Current", currentLevel); compound.putBoolean("Powered", state); compound.putBoolean("Inverted", inverted); + compound.putBoolean("PoweredAfterDelay", poweredAfterDelay); super.write(compound, clientPacket); } @@ -110,8 +115,10 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { if (currentLevel > 0) displayLevel = (int) (currentLevel * 6); world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, displayLevel), update ? 3 : 2); - if (update) - world.updateNeighbors(pos, getBlockState().getBlock()); + + if (update && !world.getPendingBlockTicks().isTickPending(pos, getBlockState().getBlock())) + world.getPendingBlockTicks().scheduleTick(pos, getBlockState().getBlock(), 2, TickPriority.NORMAL); + if (changed || update) sendData(); } @@ -137,19 +144,28 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { public float getLevelForDisplay() { return currentLevel == -1 ? 0 : currentLevel; } - + public boolean getState() { return state; } - - public boolean isPowered() { + + public boolean shouldBePowered() { return inverted != state; } - + + public void updatePowerAfterDelay() { + poweredAfterDelay = shouldBePowered(); + world.updateNeighbors(pos, getBlockState().getBlock()); + } + + public boolean isPowered() { + return poweredAfterDelay; + } + public boolean isInverted() { return inverted; } - + public void setInverted(boolean inverted) { if (inverted == this.inverted) return; 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 index 2155442ec..a7e524e5a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java @@ -5,8 +5,8 @@ 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.item.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.animation.LerpedFloat; 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 index 075880dfd..a900bddf4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerModel.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.logistics.item; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; 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 index 24a7acab3..5c5ee8782 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java @@ -38,7 +38,8 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen getTooltipFromItem(ItemStack stack) { List list = super.getTooltipFromItem(stack); + if (hoveredSlot.inventory == container.playerInventory) + return list; return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex()) : list; } 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 ef433e77e..5e65483e0 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,145 +1,58 @@ package com.simibubi.create.content.logistics.item.filter; -import com.simibubi.create.foundation.gui.IClearableContainer; +import com.simibubi.create.foundation.gui.GhostItemContainer; 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.ItemHandlerHelper; -import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; -public abstract class AbstractFilterContainer extends Container implements IClearableContainer { - - public PlayerEntity player; - protected PlayerInventory playerInventory; - public ItemStack filterItem; - public ItemStackHandler filterInventory; +public abstract class AbstractFilterContainer extends GhostItemContainer { protected AbstractFilterContainer(ContainerType type, int id, PlayerInventory inv, PacketBuffer extraData) { - this(type, id, inv, extraData.readItemStack()); + super(type, id, inv, extraData); } - protected AbstractFilterContainer(ContainerType type, int id, PlayerInventory inv, ItemStack filterItem) { - super(type, id); - player = inv.player; - playerInventory = inv; - this.filterItem = filterItem; - init(); - } - - protected void init() { - this.filterInventory = createFilterInventory(); - readData(filterItem); - addPlayerSlots(); - addFilterSlots(); - detectAndSendChanges(); - } - - @Override - public void clearContents() { - for (int i = 0; i < filterInventory.getSlots(); i++) - filterInventory.setStackInSlot(i, ItemStack.EMPTY); - } - - protected abstract int getInventoryOffset(); - - protected abstract void addFilterSlots(); - - protected abstract ItemStackHandler createFilterInventory(); - - protected abstract void readData(ItemStack filterItem); - - protected abstract void saveData(ItemStack filterItem); - - protected void addPlayerSlots() { - int x = 8; - int y = 28 + getInventoryOffset(); - - 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)); - } - - @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; + protected AbstractFilterContainer(ContainerType type, int id, PlayerInventory inv, ItemStack contentHolder) { + super(type, id, inv, contentHolder); } @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; + return super.slotClick(slotId, dragType, clickTypeIn, player); } @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 (ItemHandlerHelper.canItemStacksStack(stack, stackToInsert)) - break; - 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; + protected boolean allowRepeats() { + return false; } @Override - public void onContainerClosed(PlayerEntity playerIn) { - super.onContainerClosed(playerIn); - filterItem.getOrCreateTag().put("Items", filterInventory.serializeNBT()); - saveData(filterItem); + @OnlyIn(Dist.CLIENT) + protected ItemStack createOnClient(PacketBuffer extraData) { + return extraData.readItemStack(); + } + + protected abstract int getPlayerInventoryXOffset(); + + protected abstract void addFilterSlots(); + + @Override + protected void addSlots() { + addPlayerSlots(8, 28 + getPlayerInventoryXOffset()); + addFilterSlots(); + } + + @Override + protected void saveData(ItemStack contentHolder) { + contentHolder.getOrCreateTag() + .put("Items", ghostInventory.serializeNBT()); } } 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 de8703059..5bcbb333e 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 @@ -66,9 +66,9 @@ public abstract class AbstractFilterScreen ex int invY = y + background.height + 10; PLAYER_INVENTORY.draw(ms, this, invX, invY); textRenderer.draw(ms, playerInventory.getDisplayName(), invX + 7, invY + 6, 0x666666); - textRenderer.draw(ms, I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 3, 0xdedede); + textRenderer.draw(ms, I18n.format(container.contentHolder.getTranslationKey()), x + 15, y + 3, 0xdedede); - GuiGameElement.of(container.filterItem) + GuiGameElement.of(container.contentHolder) .at(x + background.width, guiTop + background.height - 60, -200) .scale(5) .render(ms); @@ -82,7 +82,7 @@ public abstract class AbstractFilterScreen ex handleIndicators(); if (!container.player.getHeldItemMainhand() - .equals(container.filterItem, false)) + .equals(container.contentHolder, false)) client.player.closeScreen(); } 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 487f801d7..be5486320 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 @@ -53,22 +53,22 @@ public class AttributeFilterContainer extends AbstractFilterContainer { } @Override - protected void init() { - super.init(); + protected void init(PlayerInventory inv, ItemStack contentHolder) { + super.init(inv, contentHolder); ItemStack stack = new ItemStack(Items.NAME_TAG); stack.setDisplayName( - new StringTextComponent("Selected Tags").formatted(TextFormatting.RESET, TextFormatting.BLUE)); - filterInventory.setStackInSlot(1, stack); + new StringTextComponent("Selected Tags").formatted(TextFormatting.RESET, TextFormatting.BLUE)); + ghostInventory.setStackInSlot(1, stack); } @Override - protected ItemStackHandler createFilterInventory() { + protected ItemStackHandler createGhostInventory() { return new ItemStackHandler(2); } protected void addFilterSlots() { - this.addSlot(new SlotItemHandler(filterInventory, 0, -34, 22)); - this.addSlot(new SlotItemHandler(filterInventory, 1, -28, 57) { + this.addSlot(new SlotItemHandler(ghostInventory, 0, -34, 22)); + this.addSlot(new SlotItemHandler(ghostInventory, 1, -28, 57) { @Override public boolean canTakeStack(PlayerEntity playerIn) { return false; @@ -102,20 +102,20 @@ public class AttributeFilterContainer extends AbstractFilterContainer { if (index == 37) return ItemStack.EMPTY; if (index == 36) { - filterInventory.setStackInSlot(37, ItemStack.EMPTY); + ghostInventory.setStackInSlot(37, ItemStack.EMPTY); return ItemStack.EMPTY; } if (index < 36) { ItemStack stackToInsert = playerInventory.getStackInSlot(index); ItemStack copy = stackToInsert.copy(); copy.setCount(1); - filterInventory.setStackInSlot(0, copy); + ghostInventory.setStackInSlot(0, copy); } return ItemStack.EMPTY; } @Override - protected int getInventoryOffset() { + protected int getPlayerInventoryXOffset() { return 83; } @@ -134,14 +134,16 @@ public class AttributeFilterContainer extends AbstractFilterContainer { @Override protected void saveData(ItemStack filterItem) { + super.saveData(filterItem); filterItem.getOrCreateTag() - .putInt("WhitelistMode", whitelistMode.ordinal()); + .putInt("WhitelistMode", whitelistMode.ordinal()); ListNBT attributes = new ListNBT(); selectedAttributes.forEach(at -> { if (at == null) return; CompoundNBT compoundNBT = new CompoundNBT(); - at.getFirst().serializeNBT(compoundNBT); + at.getFirst() + .serializeNBT(compoundNBT); compoundNBT.putBoolean("Inverted", at.getSecond()); attributes.add(compoundNBT); }); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java index b71172708..9145c3b8f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java @@ -87,21 +87,21 @@ public class AttributeFilterScreen extends AbstractFilterScreen selectedAttributes.add(new StringTextComponent("- ") - .append(at.getFirst() - .format(at.getSecond())) + .append(at.getFirst() + .format(at.getSecond())) .formatted(TextFormatting.GRAY))); } @@ -160,13 +160,13 @@ public class AttributeFilterScreen extends AbstractFilterScreen AllColorHandlers::getGrassyBlock)); + builder.color(() -> ColorHandlers::getGrassyBlock); pattern.createCTBehaviour(variant) .ifPresent(b -> builder.onRegister(connectedTextures(b))); @@ -53,7 +53,7 @@ public class PalettesVariantEntry { if (pattern.hasFoliage()) builder.item() - .onRegister(CreateRegistrate.itemColors(() -> AllColorHandlers::getGrassyItem)) + .color(() -> ColorHandlers::getGrassyItem) .build(); else builder.simpleItem(); diff --git a/src/main/java/com/simibubi/create/content/palettes/ScoriaVertexColor.java b/src/main/java/com/simibubi/create/content/palettes/ScoriaVertexColor.java index ef93a2872..0629ec035 100644 --- a/src/main/java/com/simibubi/create/content/palettes/ScoriaVertexColor.java +++ b/src/main/java/com/simibubi/create/content/palettes/ScoriaVertexColor.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.palettes; -import com.simibubi.create.foundation.block.IBlockVertexColor; +import com.simibubi.create.foundation.block.render.IBlockVertexColor; import com.simibubi.create.foundation.utility.ColorHelper; public class ScoriaVertexColor implements IBlockVertexColor { diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 6391be8a2..4eb8402f4 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -25,6 +25,7 @@ import com.simibubi.create.content.contraptions.components.turntable.TurntableHa import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer; +import com.simibubi.create.content.curiosities.tools.BlueprintOverlayRenderer; import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler; import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; @@ -141,6 +142,7 @@ public class ClientEvents { CreateClient.OUTLINER.tickOutlines(); CreateClient.GHOST_BLOCKS.tickGhosts(); ContraptionRenderDispatcher.tick(); + BlueprintOverlayRenderer.tick(); } @SubscribeEvent @@ -218,6 +220,7 @@ public class ClientEvents { float partialTicks) { CreateClient.SCHEMATIC_HANDLER.renderOverlay(ms, buffer, light, overlay, partialTicks); LinkedControllerClientHandler.renderOverlay(ms, buffer, light, overlay, partialTicks); + BlueprintOverlayRenderer.renderOverlay(ms, buffer, light, overlay, partialTicks); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/block/DyedBlockList.java b/src/main/java/com/simibubi/create/foundation/block/DyedBlockList.java new file mode 100644 index 000000000..f0a5d97f6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/block/DyedBlockList.java @@ -0,0 +1,33 @@ +package com.simibubi.create.foundation.block; + +import java.util.Arrays; +import java.util.function.Function; + +import com.tterrag.registrate.util.entry.BlockEntry; + +import net.minecraft.block.Block; +import net.minecraft.item.DyeColor; + +public class DyedBlockList { + + private static final int COLOR_AMOUNT = DyeColor.values().length; + + private final BlockEntry[] values = new BlockEntry[COLOR_AMOUNT]; + + public DyedBlockList(Function> filler) { + for (DyeColor color : DyeColor.values()) { + values[color.ordinal()] = filler.apply(color); + } + } + + @SuppressWarnings("unchecked") + public BlockEntry get(DyeColor color) { + return (BlockEntry) values[color.ordinal()]; + } + + @SuppressWarnings("unchecked") + public BlockEntry[] toArray() { + return (BlockEntry[]) Arrays.copyOf(values, values.length); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/block/ITE.java b/src/main/java/com/simibubi/create/foundation/block/ITE.java index 1bc0863c9..16eae3ba0 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ITE.java +++ b/src/main/java/com/simibubi/create/foundation/block/ITE.java @@ -2,102 +2,44 @@ package com.simibubi.create.foundation.block; import java.util.Optional; import java.util.function.Consumer; +import java.util.function.Function; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.WorldHelper; +import javax.annotation.Nullable; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; +import net.minecraft.util.ActionResultType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; -import net.minecraft.world.IWorld; public interface ITE { Class getTileEntityClass(); default void withTileEntityDo(IBlockReader world, BlockPos pos, Consumer action) { - try { - action.accept(getTileEntity(world, pos)); - } catch (TileEntityException e) { - } + getTileEntityOptional(world, pos).ifPresent(action); + } + + default ActionResultType onTileEntityUse(IBlockReader world, BlockPos pos, Function action) { + return getTileEntityOptional(world, pos).map(action) + .orElse(ActionResultType.PASS); } default Optional getTileEntityOptional(IBlockReader world, BlockPos pos) { - try { - return Optional.of(getTileEntity(world, pos)); - } catch (TileEntityException e) { - } - return Optional.empty(); + return Optional.ofNullable(getTileEntity(world, pos)); } + @Nullable @SuppressWarnings("unchecked") - default T getTileEntity(IBlockReader worldIn, BlockPos pos) throws TileEntityException { + default T getTileEntity(IBlockReader worldIn, BlockPos pos) { TileEntity tileEntity = worldIn.getTileEntity(pos); Class expectedClass = getTileEntityClass(); - IWorld world = null; - if (worldIn instanceof IWorld) - world = (IWorld) worldIn; - if (tileEntity == null) - throw new MissingTileEntityException(world, pos, expectedClass); + return null; if (!expectedClass.isInstance(tileEntity)) - throw new InvalidTileEntityException(world, pos, expectedClass, tileEntity.getClass()); + return null; return (T) tileEntity; } - static class TileEntityException extends Throwable { - private static final long serialVersionUID = 1L; - - public TileEntityException(IWorld world, BlockPos pos, Class teClass) { - super(makeBaseMessage(world, pos, teClass)); - } - - public TileEntityException(String message) { - super(message); - report(this); - } - - static String makeBaseMessage(IWorld world, BlockPos pos, Class expectedTeClass) { - return String.format("[%s] @(%d, %d, %d), expecting a %s", getDimensionName(world), pos.getX(), pos.getY(), - pos.getZ(), expectedTeClass.getSimpleName()); - } - - static String getDimensionName(IWorld world) { - String notAvailable = "Dim N/A"; - if (world == null) - return notAvailable; - ResourceLocation registryName = WorldHelper.getDimensionID(world); - if (registryName == null) - return notAvailable; - return registryName.toString(); - } - } - - static class MissingTileEntityException extends TileEntityException { - private static final long serialVersionUID = 1L; - - public MissingTileEntityException(IWorld world, BlockPos pos, Class teClass) { - super("Missing TileEntity: " + makeBaseMessage(world, pos, teClass)); - } - - } - - static class InvalidTileEntityException extends TileEntityException { - private static final long serialVersionUID = 1L; - - public InvalidTileEntityException(IWorld world, BlockPos pos, Class expectedTeClass, Class foundTeClass) { - super("Wrong TileEntity: " + makeBaseMessage(world, pos, expectedTeClass) + ", found " - + foundTeClass.getSimpleName()); - } - } - - static void report(TileEntityException e) { - if (AllConfigs.COMMON.logTeErrors.get()) - Create.LOGGER.debug("TileEntityException thrown!", e); - } - } diff --git a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java index 0337a5d08..9d3dbf59b 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java +++ b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java @@ -13,15 +13,15 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -@Mod.EventBusSubscriber +@EventBusSubscriber public class ItemUseOverrides { - private static final Set overrides = new HashSet<>(); + private static final Set OVERRIDES = new HashSet<>(); public static void addBlock(Block block) { - overrides.add(block.getRegistryName()); + OVERRIDES.add(block.getRegistryName()); } @SubscribeEvent @@ -30,15 +30,15 @@ public class ItemUseOverrides { return; BlockState state = event.getWorld() - .getBlockState(event.getPos()); + .getBlockState(event.getPos()); ResourceLocation id = state.getBlock() - .getRegistryName(); + .getRegistryName(); - if (!overrides.contains(id)) + if (!OVERRIDES.contains(id)) return; BlockRayTraceResult blockTrace = - new BlockRayTraceResult(VecHelper.getCenterOf(event.getPos()), event.getFace(), event.getPos(), true); + new BlockRayTraceResult(VecHelper.getCenterOf(event.getPos()), event.getFace(), event.getPos(), true); ActionResultType result = state.onUse(event.getWorld(), event.getPlayer(), event.getHand(), blockTrace); if (!result.isAccepted()) @@ -46,6 +46,6 @@ public class ItemUseOverrides { event.setCanceled(true); event.setCancellationResult(result); - } + } diff --git a/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java b/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java index c860bb29e..e4be4b2ba 100644 --- a/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java @@ -4,8 +4,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import com.simibubi.create.foundation.block.IBlockVertexColor; - import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; diff --git a/src/main/java/com/simibubi/create/foundation/block/IBlockVertexColor.java b/src/main/java/com/simibubi/create/foundation/block/render/IBlockVertexColor.java similarity index 67% rename from src/main/java/com/simibubi/create/foundation/block/IBlockVertexColor.java rename to src/main/java/com/simibubi/create/foundation/block/render/IBlockVertexColor.java index 1a4f91dae..f754ed13c 100644 --- a/src/main/java/com/simibubi/create/foundation/block/IBlockVertexColor.java +++ b/src/main/java/com/simibubi/create/foundation/block/render/IBlockVertexColor.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.block; +package com.simibubi.create.foundation.block.render; @FunctionalInterface public interface IBlockVertexColor { diff --git a/src/main/java/com/simibubi/create/foundation/config/CCommon.java b/src/main/java/com/simibubi/create/foundation/config/CCommon.java index d95a92f60..beeb7f897 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CCommon.java +++ b/src/main/java/com/simibubi/create/foundation/config/CCommon.java @@ -3,7 +3,6 @@ package com.simibubi.create.foundation.config; public class CCommon extends ConfigBase { public CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); - public ConfigBool logTeErrors = b(false, "logTeErrors", Comments.logTeErrors); @Override public String getName() { @@ -12,7 +11,6 @@ public class CCommon extends ConfigBase { private static class Comments { static String worldGen = "Modify Create's impact on your terrain"; - static String logTeErrors = "Forward caught TileEntityExceptions to the log at debug level."; } } 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 6507c2820..01119459e 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 @@ -5,12 +5,14 @@ import javax.annotation.Nullable; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.AllIcons; 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; import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.widgets.BoxWidget; +import com.simibubi.create.foundation.item.TooltipHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; @@ -32,6 +34,7 @@ public class BaseConfigScreen extends ConfigScreen { BoxWidget clientConfigWidget; BoxWidget commonConfigWidget; BoxWidget serverConfigWidget; + BoxWidget goBack; ForgeConfigSpec clientSpec; ForgeConfigSpec commonSpec; @@ -40,6 +43,7 @@ public class BaseConfigScreen extends ConfigScreen { String commonTile = "COMMON CONFIG"; String serverTile = "SERVER CONFIG"; String modID = Create.ID; + protected boolean returnOnClose; /** * If you are a Create Addon dev and want to make use of the same GUI @@ -107,12 +111,13 @@ public class BaseConfigScreen extends ConfigScreen { protected void init() { widgets.clear(); super.init(); + returnOnClose = true; - TextStencilElement clientText = new TextStencilElement(client.fontRenderer, new StringTextComponent(clientTile).formatted(TextFormatting.BOLD)).centered(true, true); + TextStencilElement clientText = new TextStencilElement(client.fontRenderer, new StringTextComponent(clientTile)).centered(true, true); widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16).showingElement(clientText)); if (clientSpec != null) { - clientConfigWidget.withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, clientSpec))); + clientConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, clientSpec))); clientText.withElementRenderer(BoxWidget.gradientFactory.apply(clientConfigWidget)); } else { clientConfigWidget.active = false; @@ -120,11 +125,11 @@ public class BaseConfigScreen extends ConfigScreen { clientText.withElementRenderer(DISABLED_RENDERER); } - TextStencilElement commonText = new TextStencilElement(client.fontRenderer, new StringTextComponent(commonTile).formatted(TextFormatting.BOLD)).centered(true, true); + TextStencilElement commonText = new TextStencilElement(client.fontRenderer, new StringTextComponent(commonTile)).centered(true, true); widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16).showingElement(commonText)); if (commonSpec != null) { - commonConfigWidget.withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, commonSpec))); + commonConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, commonSpec))); commonText.withElementRenderer(BoxWidget.gradientFactory.apply(commonConfigWidget)); } else { commonConfigWidget.active = false; @@ -132,18 +137,46 @@ public class BaseConfigScreen extends ConfigScreen { commonText.withElementRenderer(DISABLED_RENDERER); } - TextStencilElement serverText = new TextStencilElement(client.fontRenderer, new StringTextComponent(serverTile).formatted(TextFormatting.BOLD)).centered(true, true); + TextStencilElement serverText = new TextStencilElement(client.fontRenderer, new StringTextComponent(serverTile)).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))); + serverConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.SERVER, serverSpec))); serverText.withElementRenderer(BoxWidget.gradientFactory.apply(serverConfigWidget)); } else { serverConfigWidget.active = false; serverConfigWidget.updateColorsFromState(); serverText.withElementRenderer(DISABLED_RENDERER); + serverConfigWidget.active = true; + serverConfigWidget.getToolTip() + .add(new StringTextComponent("Stored individually per World")); + serverConfigWidget.getToolTip() + .addAll(TooltipHelper.cutTextComponent( + new StringTextComponent( + "Gameplay settings can only be accessed from the in-game menu after joining a World or Server."), + TextFormatting.GRAY, TextFormatting.GRAY)); } ConfigScreen.modID = this.modID; + + goBack = new BoxWidget(width / 2 - 134, height / 2, 20, 20).withPadding(2, 2) + .withCallback(this::onClose); + goBack.showingElement(AllIcons.I_CONFIG_BACK.asStencil() + .withElementRenderer(BoxWidget.gradientFactory.apply(goBack))); + goBack.getToolTip() + .add(new StringTextComponent("Go Back")); + widgets.add(goBack); } + + private void linkTo(Screen screen) { + returnOnClose = false; + ScreenOpener.open(screen); + } + + @Override + public void onClose() { + super.onClose(); + ScreenOpener.open(parent); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java index a0d23b7a1..2b01b9647 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java @@ -135,7 +135,8 @@ public class ConfigScreenList extends ExtendedList { @Override public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - UIRenderHelper.streak(ms, 0, x, y + height / 2, height - 6, width, 0xdd_000000); + UIRenderHelper.streak(ms, 0, x - 10, y + height / 2, height - 6, width / 8 * 7, 0xdd_000000); + UIRenderHelper.streak(ms, 180, x + (int) (width * 1.35f) + 10, y + height / 2, height - 6, width / 8 * 7, 0xdd_000000); IFormattableTextComponent component = label.getComponent(); FontRenderer font = Minecraft.getInstance().fontRenderer; if (font.getWidth(component) > getLabelWidth(width) - 10) { diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java b/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java similarity index 88% rename from src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java rename to src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java index 52c571796..6d12dc3f8 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java @@ -7,6 +7,8 @@ import java.util.stream.Collectors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.gui.mainMenu.CreateMainMenuScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.IngameMenuScreen; @@ -21,12 +23,12 @@ import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -public class OpenConfigButton extends Button { +public class OpenCreateMenuButton extends Button { public static ItemStack icon = AllItems.GOGGLES.asStack(); - public OpenConfigButton(int x, int y) { - super(x, y, 20, 20, StringTextComponent.EMPTY, OpenConfigButton::click); + public OpenCreateMenuButton(int x, int y) { + super(x, y, 20, 20, StringTextComponent.EMPTY, OpenCreateMenuButton::click); } @Override @@ -36,7 +38,7 @@ public class OpenConfigButton extends Button { } public static void click(Button b) { - Minecraft.getInstance().displayGuiScreen(BaseConfigScreen.forCreate(Minecraft.getInstance().currentScreen)); + ScreenOpener.open(new CreateMainMenuScreen(Minecraft.getInstance().currentScreen)); } public static class SingleMenuRow { @@ -102,7 +104,7 @@ public class OpenConfigButton extends Button { .filter(w -> w.getMessage().getString().equals(target)) .findFirst() .ifPresent(w -> event.addWidget( - new OpenConfigButton(w.x + offsetX_ + (onLeft ? -20 : w.getWidth()), w.y) + new OpenCreateMenuButton(w.x + offsetX_ + (onLeft ? -20 : w.getWidth()), w.y) )); } } 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 a8adcdc1f..34d68af65 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,9 +1,11 @@ package com.simibubi.create.foundation.config.ui; -import java.awt.Color; +import java.awt.*; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.function.Consumer; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -14,6 +16,7 @@ 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.ConfigScreenList.LabeledEntry; import com.simibubi.create.foundation.config.ui.entries.BooleanEntry; import com.simibubi.create.foundation.config.ui.entries.EnumEntry; import com.simibubi.create.foundation.config.ui.entries.NumberEntry; @@ -21,6 +24,7 @@ import com.simibubi.create.foundation.config.ui.entries.SubMenuEntry; import com.simibubi.create.foundation.config.ui.entries.ValueEntry; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.ConfirmationScreen; +import com.simibubi.create.foundation.gui.ConfirmationScreen.Response; import com.simibubi.create.foundation.gui.DelegatedStencilElement; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.Theme; @@ -161,8 +165,8 @@ public class SubMenuConfigScreen extends ConfigScreen { .withPadding(2, 2) .withCallback((x, y) -> new ConfirmationScreen() - .at(x, y) - .withText(ITextProperties.plain("You are about to reset all settings for the " + type.toString() + " config. Are you sure?")) + .centered() + .withText(ITextProperties.plain("Resetting all settings of the " + type.toString() + " config. Are you sure?")) .withAction(success -> { if (success) resetConfig(spec.getValues()); @@ -172,7 +176,7 @@ public class SubMenuConfigScreen extends ConfigScreen { resetAll.showingElement(AllIcons.I_CONFIG_RESET.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(resetAll))); resetAll.getToolTip().add(new StringTextComponent("Reset All")); - resetAll.getToolTip().addAll(TooltipHelper.cutStringTextComponent("Click here to reset all configs to their default value.", TextFormatting.GRAY, TextFormatting.GRAY)); + resetAll.getToolTip().addAll(TooltipHelper.cutStringTextComponent("Click here to reset all settings to their default value.", TextFormatting.GRAY, TextFormatting.GRAY)); saveChanges = new BoxWidget(listL - 30, yCenter - 25, 20, 20) .withPadding(2, 2) @@ -181,8 +185,8 @@ public class SubMenuConfigScreen extends ConfigScreen { return; new ConfirmationScreen() - .at(x, y) - .withText(ITextProperties.plain("You are about to change " + changes.size() + " value" + (changes.size() != 1 ? "s" : "") + ". Are you sure?")) + .centered() + .withText(ITextProperties.plain("Saving " + changes.size() + " changed value" + (changes.size() != 1 ? "s" : "") + "")) .withAction(success -> { if (success) saveChanges(); @@ -200,8 +204,8 @@ public class SubMenuConfigScreen extends ConfigScreen { return; new ConfirmationScreen() - .at(x, y) - .withText(ITextProperties.plain("You are about to discard " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + ". Are you sure?")) + .centered() + .withText(ITextProperties.plain("Discarding " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + "")) .withAction(success -> { if (success) clearChanges(); @@ -234,6 +238,10 @@ public class SubMenuConfigScreen extends ConfigScreen { if (obj instanceof AbstractConfig) { SubMenuEntry entry = new SubMenuEntry(this, humanKey, spec, (UnmodifiableConfig) obj); list.children().add(entry); + if (configGroup.valueMap() + .size() == 1) + ScreenOpener.open( + new SubMenuConfigScreen(parent, humanKey, type, spec, (UnmodifiableConfig) obj)); } else if (obj instanceof ForgeConfigSpec.ConfigValue) { ForgeConfigSpec.ConfigValue configValue = (ForgeConfigSpec.ConfigValue) obj; @@ -259,9 +267,25 @@ public class SubMenuConfigScreen extends ConfigScreen { } }); + Collections.sort(list.children(), + (e, e2) -> { + int group = (e2 instanceof SubMenuEntry ? 1 : 0) - (e instanceof SubMenuEntry ? 1 : 0); + if (group == 0 && e instanceof LabeledEntry && e2 instanceof LabeledEntry) { + LabeledEntry le = (LabeledEntry) e; + LabeledEntry le2 = (LabeledEntry) e2; + return le.label.getComponent() + .getString() + .compareTo(le2.label.getComponent() + .getString()); + } + return group; + }); + //extras for server configs if (type != ModConfig.Type.SERVER) return; + if (client.isSingleplayer()) + return; list.isForServer = true; boolean canEdit = client != null && client.player != null && client.player.hasPermissionLevel(2); @@ -275,6 +299,7 @@ public class SubMenuConfigScreen extends ConfigScreen { .withPadding(2, 2) .showingElement(stencil); + if (!canEdit) { list.children().forEach(e -> e.setEditable(false)); resetAll.active = false; @@ -282,7 +307,7 @@ public class SubMenuConfigScreen extends ConfigScreen { stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, red)); serverLocked.withBorderColors(red); serverLocked.getToolTip().add(new StringTextComponent("Locked").formatted(TextFormatting.BOLD)); - serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You don't have enough permissions to edit the server config. You can still look at the current values here though.", TextFormatting.GRAY, TextFormatting.GRAY)); + serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You do not have enough permissions to edit the server config. You can still look at the current values here though.", TextFormatting.GRAY, TextFormatting.GRAY)); } else { stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_UNLOCKED.draw(ms, 0, 0)); stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, green)); @@ -298,8 +323,8 @@ public class SubMenuConfigScreen extends ConfigScreen { protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { super.renderWindow(ms, mouseX, mouseY, partialTicks); - int x = width/2; - drawCenteredString(ms, client.fontRenderer, "Editing config: " + ConfigScreen.modID + ":" + type.toString().toLowerCase(Locale.ROOT) + "@" + title, x, 15, Theme.i(Theme.Key.TEXT)); + int x = width / 2; + drawCenteredString(ms, client.fontRenderer, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.i(Theme.Key.TEXT)); list.render(ms, mouseX, mouseY, partialTicks); } @@ -338,42 +363,49 @@ public class SubMenuConfigScreen extends ConfigScreen { } private void attemptBackstep() { - if (!changes.isEmpty() && parent instanceof BaseConfigScreen) { - new ConfirmationScreen() - .centered() - .addText(ITextProperties.plain("You still have " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + " for this config.")) - .addText(ITextProperties.plain("Leaving this screen will discard them without saving. Are you sure?")) - .withAction(success -> { - if (!success) - return; - - changes.clear(); - ScreenOpener.open(parent); - }) - .open(this); - } else { + if (changes.isEmpty() || !(parent instanceof BaseConfigScreen)) { ScreenOpener.open(parent); + return; } + + Consumer action = success -> { + if (success == Response.Cancel) + return; + if (success == Response.Confirm) + saveChanges(); + changes.clear(); + ScreenOpener.open(parent); + }; + + showLeavingPrompt(action); } @Override public void onClose() { if (changes.isEmpty()) { super.onClose(); + ScreenOpener.open(parent); return; } - new ConfirmationScreen() - .centered() - .addText(ITextProperties.plain("You still have " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + " for this config.")) - .addText(ITextProperties.plain("Leaving this screen will discard them without saving. Are you sure?")) - .withAction(success -> { - if (!success) - return; + Consumer action = success -> { + if (success == Response.Cancel) + return; + if (success == Response.Confirm) + saveChanges(); + changes.clear(); + super.onClose(); + }; - changes.clear(); - super.onClose(); - }) + showLeavingPrompt(action); + } + + public void showLeavingPrompt(Consumer action) { + new ConfirmationScreen().centered() + .addText(ITextProperties.plain("Leaving with " + changes.size() + " unsaved change" + + (changes.size() != 1 ? "s" : "") + " for this config")) + .withThreeActions(action) .open(this); } + } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java index 08d7e8288..3d7590762 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config.ui.entries; +import java.util.Locale; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.BoxElement; @@ -78,9 +80,9 @@ public class EnumEntry extends ValueEntry> { cycleLeft.y = y + 10; cycleLeft.render(ms, mouseX, mouseY, partialTicks); - valueText.at(cycleLeft.x + cycleWidth - 8, y + 11, 200) - .withBounds(width - getLabelWidth(width) - 2 * cycleWidth - resetWidth - 4, 16) - .render(ms); + valueText.at(cycleLeft.x + cycleWidth - 8, y + 10, 200) + .withBounds(width - getLabelWidth(width) - 2 * cycleWidth - resetWidth - 4, 16) + .render(ms); cycleRight.x = x + width - cycleWidth * 2 - resetWidth + 10; cycleRight.y = y + 10; @@ -97,6 +99,10 @@ public class EnumEntry extends ValueEntry> { @Override public void onValueChange(Enum newValue) { super.onValueChange(newValue); - valueText.withText(newValue.name()); + valueText.withText(newValue.name() + .substring(0, 1) + + newValue.name() + .substring(1) + .toLowerCase(Locale.ROOT)); } } 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 48d1d86a0..52a0d3fa1 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 @@ -10,6 +10,7 @@ import javax.annotation.Nonnull; import org.apache.commons.lang3.ArrayUtils; +import com.google.common.base.Predicates; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.config.ui.ConfigHelper; import com.simibubi.create.foundation.config.ui.ConfigScreen; @@ -17,6 +18,7 @@ import com.simibubi.create.foundation.config.ui.ConfigScreenList; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.DelegatedStencilElement; import com.simibubi.create.foundation.gui.widgets.BoxWidget; +import com.simibubi.create.foundation.item.TooltipHelper; import net.minecraft.util.text.IFormattableTextComponent; import net.minecraft.util.text.StringTextComponent; @@ -52,7 +54,7 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { listeners.add(resetButton); List path = value.getPath(); - labelTooltip.add(new StringTextComponent(path.get(path.size()-1)).formatted(TextFormatting.GRAY)); + labelTooltip.add(new StringTextComponent(label).formatted(TextFormatting.WHITE)); String comment = spec.getComment(); if (comment == null || comment.isEmpty()) return; @@ -76,8 +78,14 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { u = "in SU"; unit = u; } - //add comment to tooltip - labelTooltip.addAll(Arrays.stream(commentLines).map(StringTextComponent::new).collect(Collectors.toList())); + // add comment to tooltip + labelTooltip.addAll(Arrays.stream(commentLines) + .filter(Predicates.not(s -> s.startsWith("Range"))) + .map(StringTextComponent::new) + .flatMap(stc -> TooltipHelper.cutTextComponent(stc, TextFormatting.GRAY, TextFormatting.GRAY) + .stream()) + .collect(Collectors.toList())); + labelTooltip.add(new StringTextComponent(ConfigScreen.modID + ":" + path.get(path.size() - 1)).formatted(TextFormatting.DARK_GRAY)); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index 6fff1acb8..5123d9a79 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -14,11 +14,11 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.fluids.VirtualFluid; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; -import com.simibubi.create.foundation.block.IBlockVertexColor; import com.simibubi.create.foundation.block.connected.CTModel; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.render.ColoredVertexModel; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.block.render.IBlockVertexColor; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import com.tterrag.registrate.AbstractRegistrate; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.Builder; @@ -34,14 +34,11 @@ import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; import net.minecraft.block.AbstractBlock.Properties; import net.minecraft.block.Block; -import net.minecraft.client.renderer.color.IBlockColor; -import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.IItemProvider; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidAttributes; @@ -114,7 +111,7 @@ public class CreateRegistrate extends AbstractRegistrate { public CreateTileEntityBuilder tileEntity(String name, NonNullFunction, ? extends T> factory) { - return this.tileEntity(this.self(), name, (NonNullFunction) factory); + return this.tileEntity(this.self(), name, factory); } @Override @@ -173,30 +170,22 @@ public class CreateRegistrate extends AbstractRegistrate { } public static NonNullConsumer casingConnectivity( - BiConsumer consumer) { + BiConsumer consumer) { return entry -> onClient(() -> () -> registerCasingConnectivity(entry, consumer)); } - public static NonNullConsumer blockModel( - Supplier> func) { - return entry -> onClient(() -> () -> registerBlockModel(entry, func)); - } - - public static NonNullConsumer blockColors(Supplier> colorFunc) { - return entry -> onClient(() -> () -> registerBlockColor(entry, colorFunc)); - } - public static NonNullConsumer blockVertexColors(IBlockVertexColor colorFunc) { return entry -> onClient(() -> () -> registerBlockVertexColor(entry, colorFunc)); } - public static NonNullConsumer itemModel( - Supplier> func) { - return entry -> onClient(() -> () -> registerItemModel(entry, func)); + public static NonNullConsumer blockModel( + Supplier> func) { + return entry -> onClient(() -> () -> registerBlockModel(entry, func)); } - public static NonNullConsumer itemColors(Supplier> colorFunc) { - return entry -> onClient(() -> () -> registerItemColor(entry, colorFunc)); + public static NonNullConsumer itemModel( + Supplier> func) { + return entry -> onClient(() -> () -> registerItemModel(entry, func)); } public static NonNullUnaryOperator> customRenderedItem( @@ -250,18 +239,4 @@ public class CreateRegistrate extends AbstractRegistrate { .register(entry.delegate, func.get()); } - @OnlyIn(Dist.CLIENT) - private static void registerBlockColor(Block entry, Supplier> colorFunc) { - CreateClient.getColorHandler() - .register(entry, colorFunc.get() - .get()); - } - - @OnlyIn(Dist.CLIENT) - private static void registerItemColor(IItemProvider entry, Supplier> colorFunc) { - CreateClient.getColorHandler() - .register(entry, colorFunc.get() - .get()); - } - } 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 c424175d3..6fc08ceae 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.gui; -import java.awt.Color; +import java.awt.*; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; @@ -20,6 +20,8 @@ public enum AllGuiTextures implements IScreenRenderable { TERRAINZAPPER("curiosities.png", 234, 103), TERRAINZAPPER_INACTIVE_PARAM("curiosities.png", 238, 0, 18, 18), + LOGO("logo.png", 256, 256), + SCHEMATIC("schematics.png", 192, 121), SCHEMATIC_SLOT("widgets.png", 54, 0, 16, 16), SCHEMATIC_PROMPT("schematics_2.png", 213, 77), @@ -57,8 +59,9 @@ 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), + BLUEPRINT("curiosities2.png", 0, 109, 179, 109), PROJECTOR("projector.png", 235, 185), PROJECTOR_FILTER_STRENGTH("projector.png", 0, 14, 162, 22), @@ -90,13 +93,16 @@ public enum AllGuiTextures implements IScreenRenderable { INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6), INDICATOR_RED("widgets.png", 72, 18, 18, 6), + HOTSLOT_ARROW("widgets.png", 24, 51, 20, 12), + HOTSLOT("widgets.png", 0, 68, 22, 22), + HOTSLOT_ACTIVE("widgets.png", 0, 46, 22, 22), + HOTSLOT_SUPER_ACTIVE("widgets.png", 27, 67, 24, 24), + SPEECH_TOOLTIP_BACKGROUND("widgets.png", 0, 24, 8, 8), SPEECH_TOOLTIP_COLOR("widgets.png", 8, 24, 8, 8), // PlacementIndicator - PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 16, 256); - - ; + PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 16, 256);; public static final int FONT_COLOR = 0x575F7A; 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 b0cfe2ffa..f0de70016 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java @@ -20,21 +20,28 @@ import net.minecraft.util.text.Style; public class ConfirmationScreen extends AbstractSimiScreen { private Screen source; - private Consumer action = _success -> {}; + private Consumer action = _success -> { + }; private List text = new ArrayList<>(); private boolean centered = false; private int x; private int y; private int textWidth; private int textHeight; + private boolean tristate; private BoxWidget confirm; + private BoxWidget confirmDontSave; private BoxWidget cancel; private BoxElement textBackground; + public enum Response { + Confirm, ConfirmDontSave, Cancel + } + /* - * Removes text lines from the back of the list - * */ + * Removes text lines from the back of the list + * */ public ConfirmationScreen removeTextLines(int amount) { if (amount > text.size()) return clearText(); @@ -70,7 +77,13 @@ public class ConfirmationScreen extends AbstractSimiScreen { } public ConfirmationScreen withAction(Consumer action) { + this.action = r -> action.accept(r == Response.Confirm); + return this; + } + + public ConfirmationScreen withThreeActions(Consumer action) { this.action = action; + this.tristate = true; return this; } @@ -115,32 +128,46 @@ public class ConfirmationScreen extends AbstractSimiScreen { y = height - textHeight - 30; } - 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)); + int buttonX = x + textWidth / 2 - 6 - (int) (70 * (tristate ? 1.5f : 1)); + + TextStencilElement confirmText = + new TextStencilElement(client.fontRenderer, tristate ? "Save" : "Confirm").centered(true, true); + confirm = new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.Confirm)); confirm.showingElement(confirmText.withElementRenderer(BoxWidget.gradientFactory.apply(confirm))); + widgets.add(confirm); + + buttonX += 12 + 70; + + if (tristate) { + TextStencilElement confirmDontSaveText = + new TextStencilElement(client.fontRenderer, "Don't Save").centered(true, true); + confirmDontSave = + new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.ConfirmDontSave)); + confirmDontSave.showingElement( + confirmDontSaveText.withElementRenderer(BoxWidget.gradientFactory.apply(confirmDontSave))); + widgets.add(confirmDontSave); + buttonX += 12 + 70; + } TextStencilElement cancelText = new TextStencilElement(client.fontRenderer, "Cancel").centered(true, true); - cancel = new BoxWidget(x + textWidth/2 + 6, y + textHeight + 2, textWidth/2 - 10, 20) - .withCallback(() -> accept(false)); + cancel = new BoxWidget(buttonX, y + textHeight + 6, 70, 16) + .withCallback(() -> accept(Response.Cancel)); cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel))); - - widgets.add(confirm); widgets.add(cancel); textBackground = new BoxElement() .gradientBorder(Theme.p(Theme.Key.BUTTON_DISABLE)) - .withBounds(textWidth, textHeight) - .at(x, y); + .withBounds(width + 10, textHeight + 35) + .at(-5, y - 5); } @Override public void onClose() { - accept(false); + accept(Response.Cancel); } - private void accept(boolean success) { + private void accept(Response success) { client.currentScreen = source; action.accept(success); } @@ -157,11 +184,12 @@ public class ConfirmationScreen extends AbstractSimiScreen { for (ITextProperties line : text) { lineY = lineY + offset; - if (line == null) continue; - - client.fontRenderer.draw(ms, line.getString(), x, lineY, 0xeaeaea); + int textX = x; + if (text.size() == 1) + x = (width - client.fontRenderer.getWidth(line)) / 2; + client.fontRenderer.draw(ms, line.getString(), textX, lineY, 0xeaeaea); } ms.pop(); @@ -175,7 +203,7 @@ public class ConfirmationScreen extends AbstractSimiScreen { ms.push(); UIRenderHelper.framebuffer.bindFramebuffer(true); - source.render(ms, mouseX, mouseY, 10); + source.render(ms, 0, 0, 10); // zero mouse coords to prevent further tooltips UIRenderHelper.framebuffer.unbindFramebuffer(); Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer(); ms.pop(); @@ -183,7 +211,7 @@ public class ConfirmationScreen extends AbstractSimiScreen { //fixme replace with glVersioned-backend calls once they are merged from jozu's branch GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, UIRenderHelper.framebuffer.framebufferObject); GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.framebufferObject); - GL30.glBlitFramebuffer(0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, 0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, GL30.GL_COLOR_BUFFER_BIT, GL30.GL_LINEAR); + GL30.glBlitFramebuffer(0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, 0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, GL30.GL_COLOR_BUFFER_BIT, GL30.GL_LINEAR); mainBuffer.bindFramebuffer(true); this.fillGradient(ms, 0, 0, this.width, this.height, 0x70101010, 0x80101010); diff --git a/src/main/java/com/simibubi/create/foundation/gui/GhostItemContainer.java b/src/main/java/com/simibubi/create/foundation/gui/GhostItemContainer.java new file mode 100644 index 000000000..34b710559 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/GhostItemContainer.java @@ -0,0 +1,149 @@ +package com.simibubi.create.foundation.gui; + +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.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; + +public abstract class GhostItemContainer extends Container implements IClearableContainer { + + public PlayerEntity player; + public PlayerInventory playerInventory; + public ItemStackHandler ghostInventory; + public T contentHolder; + + protected GhostItemContainer(ContainerType type, int id, PlayerInventory inv, PacketBuffer extraData) { + super(type, id); + init(inv, createOnClient(extraData)); + } + + protected GhostItemContainer(ContainerType type, int id, PlayerInventory inv, T contentHolder) { + super(type, id); + init(inv, contentHolder); + } + + @OnlyIn(Dist.CLIENT) + protected abstract T createOnClient(PacketBuffer extraData); + + protected abstract void addSlots(); + + protected abstract ItemStackHandler createGhostInventory(); + + protected abstract void readData(T contentHolder); + + protected abstract void saveData(T contentHolder); + + protected abstract boolean allowRepeats(); + + protected void init(PlayerInventory inv, T contentHolder) { + player = inv.player; + playerInventory = inv; + this.contentHolder = contentHolder; + ghostInventory = createGhostInventory(); + readData(contentHolder); + addSlots(); + detectAndSendChanges(); + } + + @Override + public void clearContents() { + for (int i = 0; i < ghostInventory.getSlots(); i++) + ghostInventory.setStackInSlot(i, ItemStack.EMPTY); + } + + protected void addPlayerSlots(int x, int y) { + 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)); + } + + @Override + public boolean canMergeSlot(ItemStack stack, Slot slotIn) { + return slotIn.inventory == playerInventory; + } + + @Override + public boolean canDragIntoSlot(Slot slotIn) { + if (allowRepeats()) + return true; + return slotIn.inventory == playerInventory; + } + + @Override + public boolean canInteractWith(PlayerEntity playerIn) { + return true; + } + + @Override + public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { + 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 = ghostInventory.getStackInSlot(slot) + .copy(); + stackInSlot.setCount(stackInSlot.getMaxStackSize()); + playerInventory.setItemStack(stackInSlot); + return ItemStack.EMPTY; + } + return ItemStack.EMPTY; + } + + if (held.isEmpty()) { + ghostInventory.setStackInSlot(slot, ItemStack.EMPTY); + getSlot(slotId).onSlotChanged(); + return ItemStack.EMPTY; + } + + ItemStack insert = held.copy(); + insert.setCount(1); + ghostInventory.setStackInSlot(slot, insert); + getSlot(slotId).onSlotChanged(); + return held; + } + + @Override + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + if (index < 36) { + ItemStack stackToInsert = playerInventory.getStackInSlot(index); + for (int i = 0; i < ghostInventory.getSlots(); i++) { + ItemStack stack = ghostInventory.getStackInSlot(i); + if (!allowRepeats() && ItemHandlerHelper.canItemStacksStack(stack, stackToInsert)) + break; + if (stack.isEmpty()) { + ItemStack copy = stackToInsert.copy(); + copy.setCount(1); + ghostInventory.insertItem(i, copy, false); + getSlot(i + 36).onSlotChanged(); + break; + } + } + } else { + ghostInventory.extractItem(index - 36, 1, false); + getSlot(index).onSlotChanged(); + } + return ItemStack.EMPTY; + } + + @Override + public void onContainerClosed(PlayerEntity playerIn) { + super.onContainerClosed(playerIn); + saveData(contentHolder); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/GhostItemSubmitPacket.java b/src/main/java/com/simibubi/create/foundation/gui/GhostItemSubmitPacket.java new file mode 100644 index 000000000..54df945ac --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/GhostItemSubmitPacket.java @@ -0,0 +1,53 @@ +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.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class GhostItemSubmitPacket extends SimplePacketBase { + + private final ItemStack item; + private final int slot; + + public GhostItemSubmitPacket(ItemStack item, int slot) { + this.item = item; + this.slot = slot; + } + + public GhostItemSubmitPacket(PacketBuffer buffer) { + item = buffer.readItemStack(); + slot = buffer.readInt(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeItemStack(item); + buffer.writeInt(slot); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity player = context.get() + .getSender(); + if (player == null) + return; + + if (player.openContainer instanceof GhostItemContainer) { + GhostItemContainer c = (GhostItemContainer) player.openContainer; + c.ghostInventory.setStackInSlot(slot, item); + c.getSlot(36 + slot).onSlotChanged(); + } + + }); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java index c5d87543c..cdea4f887 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java @@ -53,7 +53,7 @@ public class TextStencilElement extends DelegatedStencilElement { x = width / 2f - font.getWidth(component) / 2f; if (centerVertically) - y = height / 2f - font.FONT_HEIGHT / 2f; + y = height / 2f - (font.FONT_HEIGHT - 1) / 2f; font.draw(ms, component, x, y, 0xff_000000); } @@ -65,7 +65,7 @@ public class TextStencilElement extends DelegatedStencilElement { x = width / 2f - font.getWidth(component) / 2f; if (centerVertically) - y = height / 2f - font.FONT_HEIGHT / 2f; + y = height / 2f - (font.FONT_HEIGHT - 1) / 2f; ms.push(); ms.translate(x, y, 0); diff --git a/src/main/java/com/simibubi/create/foundation/gui/Theme.java b/src/main/java/com/simibubi/create/foundation/gui/Theme.java index 0f6f0155e..57b2b6412 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/Theme.java +++ b/src/main/java/com/simibubi/create/foundation/gui/Theme.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.gui; -import java.awt.Color; +import java.awt.*; import java.util.HashMap; import java.util.Map; @@ -18,6 +18,12 @@ public class Theme { custom = theme; } + public static void reload() { + base.init(); + if (custom != null) + custom.init(); + } + private static ColorHolder resolve(String key) { ColorHolder h = null; @@ -58,25 +64,29 @@ public class Theme { } protected void init() { - put(Key.BUTTON_IDLE, new Color(0x60_c0c0ff, true), new Color(0x30_c0c0ff, true)); - put(Key.BUTTON_HOVER, new Color(0xa0_c0c0ff, true), new Color(0x50_c0c0ff, true)); - put(Key.BUTTON_CLICK, new Color(0xff_4b4bff), new Color(0xff_3b3bdd)); - put(Key.BUTTON_DISABLE, new Color(0x80_909090, true), new Color(0x20_909090, true)); + put(Key.BUTTON_IDLE, new Color(0xdd_8ab6d6, true), new Color(0x90_8ab6d6, true)); + put(Key.BUTTON_HOVER, new Color(0xff_9ABBD3, true), new Color(0xd0_9ABBD3, true)); + put(Key.BUTTON_CLICK, new Color(0xff_ffffff), new Color(0xee_ffffff)); + put(Key.BUTTON_DISABLE, new Color(0x80_909090, true), new Color(0x60_909090, true)); put(Key.BUTTON_SUCCESS, new Color(0xcc_88f788, true), new Color(0xcc_20cc20, true)); put(Key.BUTTON_FAIL, new Color(0xcc_f78888, true), new Color(0xcc_cc2020, true)); put(Key.TEXT, new Color(0xff_eeeeee), new Color(0xff_a3a3a3)); put(Key.TEXT_DARKER, new Color(0xff_a3a3a3), new Color(0xff_808080)); - put(Key.TEXT_ACCENT_STRONG, new Color(0xff_7b7ba3), new Color(0xff_616192)); + put(Key.TEXT_ACCENT_STRONG, new Color(0xff_8ab6d6), new Color(0xff_8ab6d6)); put(Key.TEXT_ACCENT_SLIGHT, new Color(0xff_ddeeff), new Color(0xff_a0b0c0)); put(Key.STREAK, new Color(0x101010, false)); + put(Key.PONDER_BUTTON_IDLE, new Color(0x60_c0c0ff, true), new Color(0x30_c0c0ff, true)); + put(Key.PONDER_BUTTON_HOVER, new Color(0xf0_c0c0ff, true), new Color(0xa0_c0c0ff, true)); + put(Key.PONDER_BUTTON_CLICK, new Color(0xff_ffffff), new Color(0xdd_ffffff)); + put(Key.PONDER_BUTTON_DISABLE, new Color(0x80_909090, true), new Color(0x20_909090, true)); put(Key.PONDER_BACKGROUND_TRANSPARENT, new Color(0xdd_000000, true)); put(Key.PONDER_BACKGROUND_FLAT, new Color(0xff_000000, false)); put(Key.PONDER_IDLE, new Color(0x40ffeedd, true), new Color(0x20ffeedd, true)); put(Key.PONDER_HOVER, new Color(0x70ffffff, true), new Color(0x30ffffff, true)); put(Key.PONDER_HIGHLIGHT, new Color(0xf0ffeedd, true), new Color(0x60ffeedd, true)); put(Key.TEXT_WINDOW_BORDER, new Color(0x607a6000, true), new Color(0x207a6000, true)); - put(Key.PONDER_BACK_ARROW, new Color(0x70aa9999, true), new Color(0x30aa9999, true)); + put(Key.PONDER_BACK_ARROW, new Color(0xf0aa9999, true), new Color(0x30aa9999, true)); put(Key.PONDER_PROGRESSBAR, new Color(0x80ffeedd, true), new Color(0x50ffeedd, true)); put(Key.PONDER_MISSING_CREATE, new Color(0x70_984500, true), new Color(0x70_692400, true)); put(Key.PONDER_MISSING_VANILLA, new Color(0x50_5000ff, true), new Color(0x50_300077, true)); @@ -130,6 +140,11 @@ public class Theme { public static Key PONDER_MISSING_CREATE = new Key(); public static Key PONDER_MISSING_VANILLA = new Key(); + public static Key PONDER_BUTTON_IDLE = new Key(); + public static Key PONDER_BUTTON_HOVER = new Key(); + public static Key PONDER_BUTTON_CLICK = new Key(); + public static Key PONDER_BUTTON_DISABLE = new Key(); + private static int index = 0; private final String s; diff --git a/src/main/java/com/simibubi/create/foundation/gui/mainMenu/CreateMainMenuScreen.java b/src/main/java/com/simibubi/create/foundation/gui/mainMenu/CreateMainMenuScreen.java new file mode 100644 index 000000000..c1e6a95a2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/mainMenu/CreateMainMenuScreen.java @@ -0,0 +1,190 @@ +package com.simibubi.create.foundation.gui.mainMenu; + +import java.awt.*; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.config.ui.BaseConfigScreen; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.BoxElement; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.gui.screen.ConfirmOpenLinkScreen; +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.renderer.RenderSkybox; +import net.minecraft.client.renderer.RenderSkyboxCube; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Util; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; + +public class CreateMainMenuScreen extends AbstractSimiScreen { + + protected final Screen parent; + protected boolean returnOnClose; + + private static final RenderSkyboxCube PANORAMA_RESOURCES = + new RenderSkyboxCube(Create.asResource("textures/gui/title/background/panorama")); + private static final ResourceLocation PANORAMA_OVERLAY_TEXTURES = + new ResourceLocation("textures/gui/title/background/panorama_overlay.png"); + private RenderSkybox vanillaPanorama = new RenderSkybox(MainMenuScreen.PANORAMA_RESOURCES); + private RenderSkybox panorama = new RenderSkybox(PANORAMA_RESOURCES); + private long firstRenderTime; + + public CreateMainMenuScreen(Screen parent) { + this.parent = parent; + returnOnClose = true; + if (parent instanceof MainMenuScreen) + vanillaPanorama = ObfuscationReflectionHelper.getPrivateValue(MainMenuScreen.class, (MainMenuScreen) parent, + "field_209101_K"); + } + + @Override + public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + if (firstRenderTime == 0L) + this.firstRenderTime = Util.milliTime(); + super.render(ms, mouseX, mouseY, partialTicks); + } + + @Override + protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + float f = (float) (Util.milliTime() - this.firstRenderTime) / 1000.0F; + float alpha = MathHelper.clamp(f, 0.0F, 1.0F); + + if (parent instanceof MainMenuScreen) { + if (alpha < 1) + vanillaPanorama.render(partialTicks, 1); + panorama.render(partialTicks, alpha); + + client.getTextureManager() + .bindTexture(PANORAMA_OVERLAY_TEXTURES); + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, + GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + drawTexture(ms, 0, 0, this.width, this.height, 0.0F, 0.0F, 16, 128, 16, 128); + } + + RenderSystem.enableDepthTest(); + + for (int side : Iterate.positiveAndNegative) { + ms.push(); + ms.translate(width / 2, 60, -800); + ms.scale(24 * side, 24 * side, 32); + ms.translate(-1.75 * ((alpha * alpha) / 2f + .5f), .25f, 0); + MatrixStacker.of(ms) + .rotateX(45); + GuiGameElement.of(AllBlocks.LARGE_COGWHEEL.getDefaultState()) + .rotateBlock(0, Util.milliTime() / 32f * side, 0) + .render(ms); + ms.translate(-1, 0, -1); + GuiGameElement.of(AllBlocks.COGWHEEL.getDefaultState()) + .rotateBlock(0, Util.milliTime() / -16f * side + 22.5f, 0) + .render(ms); + ms.pop(); + } + + ms.push(); + ms.translate(width / 2 - 32, 32, -10); + ms.push(); + ms.scale(0.25f, 0.25f, 0.25f); + AllGuiTextures.LOGO.draw(ms, 0, 0); + ms.pop(); + new BoxElement().withBackground(0x88_000000) + .flatBorder(new Color(0x01_000000, true)) + .at(-32, 56, 100) + .withBounds(128, 11) + .render(ms); + ms.pop(); + + ms.push(); + ms.translate(0, 0, 200); + drawCenteredText(ms, textRenderer, new StringTextComponent(Create.NAME).formatted(TextFormatting.BOLD) + .append(new StringTextComponent(" v" + Create.VERSION).formatted(TextFormatting.BOLD, TextFormatting.WHITE)), + width / 2, 89, 0xff_E4BB67); + ms.pop(); + + RenderSystem.disableDepthTest(); + } + + protected void init() { + super.init(); + returnOnClose = true; + this.addButtons(); + } + + private void addButtons() { + buttons.clear(); + + int yStart = height / 4 + (parent instanceof MainMenuScreen ? 40 : 40); + int center = width / 2; + int bHeight = 20; + int bShortWidth = 98; + int bLongWidth = 200; + + addButton(new Button(center - 100, yStart + 24 + -16, bLongWidth, bHeight, Lang.translate("menu.return"), + $ -> onClose())); + addButton(new Button(center - 100, yStart + 48 + -16, bShortWidth, bHeight, Lang.translate("menu.configure"), + $ -> linkTo(BaseConfigScreen.forCreate(this)))); + + Button gettingStarted = new Button(center + 2, yStart + 48 + -16, bShortWidth, bHeight, + Lang.translate("menu.getting_started"), $ -> { + }); + gettingStarted.active = false; + addButton(gettingStarted); + + String projectLink = "https://www.curseforge.com/minecraft/mc-mods/create"; + String issueTrackerLink = "https://github.com/Creators-of-Create/Create/issues"; + String supportLink = "https://github.com/Creators-of-Create/Create/wiki/Supporting-the-Project"; + + addButton(new Button(center - 100, yStart + 68, bShortWidth, bHeight, Lang.translate("menu.project_page"), + $ -> linkTo(projectLink))); + addButton(new Button(center + 2, yStart + 68, bShortWidth, bHeight, Lang.translate("menu.report_bugs"), + $ -> linkTo(issueTrackerLink))); + addButton(new Button(center - 100, yStart + 92, bLongWidth, bHeight, Lang.translate("menu.support"), + $ -> linkTo(supportLink))); + } + + @Override + protected void renderWindowForeground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + super.renderWindowForeground(ms, mouseX, mouseY, partialTicks); + buttons.forEach(w -> w.render(ms, mouseX, mouseY, partialTicks)); + } + + public void tick() { + super.tick(); + } + + private void linkTo(Screen screen) { + returnOnClose = false; + ScreenOpener.open(screen); + } + + private void linkTo(String url) { + returnOnClose = false; + ScreenOpener.open(new ConfirmOpenLinkScreen((p_213069_2_) -> { + if (p_213069_2_) + Util.getOSType() + .openURI(url); + this.client.displayGuiScreen(this); + }, url, true)); + } + + @Override + public void onClose() { + super.onClose(); + ScreenOpener.open(parent); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java index 07b35d4f9..0623d96f9 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.gui.widgets; -import java.awt.Color; +import java.awt.*; import java.util.function.Function; import javax.annotation.Nonnull; @@ -9,6 +9,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.gui.BoxElement; import com.simibubi.create.foundation.gui.DelegatedStencilElement; import com.simibubi.create.foundation.gui.Theme; +import com.simibubi.create.foundation.gui.Theme.Key; import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Couple; @@ -24,9 +25,11 @@ public class BoxWidget extends ElementWidget { protected Color customBorderBot; protected boolean animateColors = true; protected LerpedFloat colorAnimation = LerpedFloat.linear(); + protected Color gradientColor1, gradientColor2; - private Color colorTarget1 = Theme.c(Theme.Key.BUTTON_IDLE, true), colorTarget2 = Theme.c(Theme.Key.BUTTON_IDLE, false); private Color previousColor1, previousColor2; + private Color colorTarget1 = Theme.c(getIdleTheme(), true); + private Color colorTarget2 = Theme.c(getIdleTheme(), false); public BoxWidget() { this(0, 0); @@ -84,8 +87,8 @@ public class BoxWidget extends ElementWidget { public void onClick(double x, double y) { super.onClick(x, y); - gradientColor1 = Theme.c(Theme.Key.BUTTON_CLICK, true); - gradientColor2 = Theme.c(Theme.Key.BUTTON_CLICK, true); + gradientColor1 = Theme.c(getClickTheme(), true); + gradientColor2 = Theme.c(getClickTheme(), false); startGradientAnimation(getColorForState(true), getColorForState(false), true, 0.15); } @@ -175,23 +178,40 @@ public class BoxWidget extends ElementWidget { } private void startGradientAnimation(Color c1, Color c2, boolean positive) { - startGradientAnimation(c1, c2, positive, 0.3); + startGradientAnimation(c1, c2, positive, 0.6); } private Color getColorForState(boolean first) { if (!active) - return Theme.p(Theme.Key.BUTTON_DISABLE).get(first); + return Theme.p(getDisabledTheme()).get(first); if (hovered) { if (first) - return customBorderTop != null ? customBorderTop.darker() : Theme.c(Theme.Key.BUTTON_HOVER, true); + return customBorderTop != null ? customBorderTop.darker() : Theme.c(getHoverTheme(), true); else - return customBorderBot != null ? customBorderBot.darker() : Theme.c(Theme.Key.BUTTON_HOVER, false); + return customBorderBot != null ? customBorderBot.darker() : Theme.c(getHoverTheme(), false); } if (first) - return customBorderTop != null ? customBorderTop : Theme.c(Theme.Key.BUTTON_IDLE, true); + return customBorderTop != null ? customBorderTop : Theme.c(getIdleTheme(), true); else - return customBorderBot != null ? customBorderBot : Theme.c(Theme.Key.BUTTON_IDLE, false); + return customBorderBot != null ? customBorderBot : Theme.c(getIdleTheme(), false); } + + public Key getDisabledTheme() { + return Theme.Key.BUTTON_DISABLE; + } + + public Key getIdleTheme() { + return Theme.Key.BUTTON_IDLE; + } + + public Key getHoverTheme() { + return Theme.Key.BUTTON_HOVER; + } + + public Key getClickTheme() { + return Theme.Key.BUTTON_CLICK; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index e8a901d58..155f4758c 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -161,7 +161,7 @@ public class ItemHelper { continue; if (!test.test(stack)) continue; - if (!extracting.isEmpty() && !ItemHandlerHelper.canItemStacksStack(stack, extracting)) { + if (!extracting.isEmpty() && !canItemStackAmountsStack(stack, extracting)) { potentialOtherMatch = true; continue; } @@ -174,8 +174,7 @@ public class ItemHelper { if (!simulate && hasEnoughItems) inv.extractItem(slot, stack.getCount(), false); - if (extracting.getCount() >= maxExtractionCount - || extracting.getCount() >= extracting.getMaxStackSize()) { + if (extracting.getCount() >= maxExtractionCount) { if (checkHasEnoughItems) { hasEnoughItems = true; checkHasEnoughItems = false; @@ -225,7 +224,7 @@ public class ItemHelper { if (!test.test(stack)) continue; - if (!extracting.isEmpty() && !ItemHandlerHelper.canItemStacksStack(stack, extracting)) + if (!extracting.isEmpty() && !canItemStackAmountsStack(stack, extracting)) continue; if (extracting.isEmpty()) @@ -235,13 +234,17 @@ public class ItemHelper { if (!simulate) inv.extractItem(slot, stack.getCount(), false); - if (extracting.getCount() >= maxExtractionCount || extracting.getCount() >= extracting.getMaxStackSize()) + if (extracting.getCount() >= maxExtractionCount) break; } return extracting; } + public static boolean canItemStackAmountsStack(ItemStack a, ItemStack b) { + return ItemHandlerHelper.canItemStacksStack(a, b) && a.getCount() + b.getCount() <= a.getMaxStackSize(); + } + public static ItemStack findFirstMatch(IItemHandler inv, Predicate test) { int slot = findFirstMatchingSlotIndex(inv, test); if (slot == -1) diff --git a/src/main/java/com/simibubi/create/foundation/item/CustomItemModels.java b/src/main/java/com/simibubi/create/foundation/item/render/CustomItemModels.java similarity index 96% rename from src/main/java/com/simibubi/create/foundation/item/CustomItemModels.java rename to src/main/java/com/simibubi/create/foundation/item/render/CustomItemModels.java index 805d8e3f6..8f7ed04f6 100644 --- a/src/main/java/com/simibubi/create/foundation/item/CustomItemModels.java +++ b/src/main/java/com/simibubi/create/foundation/item/render/CustomItemModels.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.item; +package com.simibubi.create.foundation.item.render; import java.util.ArrayList; import java.util.IdentityHashMap; diff --git a/src/main/java/com/simibubi/create/foundation/block/render/CustomRenderedItemModel.java b/src/main/java/com/simibubi/create/foundation/item/render/CustomRenderedItemModel.java similarity index 96% rename from src/main/java/com/simibubi/create/foundation/block/render/CustomRenderedItemModel.java rename to src/main/java/com/simibubi/create/foundation/item/render/CustomRenderedItemModel.java index 6df4c426b..6ef18e8cd 100644 --- a/src/main/java/com/simibubi/create/foundation/block/render/CustomRenderedItemModel.java +++ b/src/main/java/com/simibubi/create/foundation/item/render/CustomRenderedItemModel.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.block.render; +package com.simibubi.create.foundation.item.render; import java.util.HashMap; import java.util.List; @@ -16,7 +16,6 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.model.BakedModelWrapper; -@SuppressWarnings("deprecation") public abstract class CustomRenderedItemModel extends BakedModelWrapper { protected String basePath; @@ -67,6 +66,7 @@ public abstract class CustomRenderedItemModel extends BakedModelWrapper self), new Packet(self)); + } + + public static class Packet extends SimplePacketBase { + + private int entityId; + private Entity entity; + private CompoundNBT readData; + + public Packet(Entity entity) { + this.entity = entity; + this.entityId = entity.getEntityId(); + } + + public Packet(PacketBuffer buffer) { + entityId = buffer.readInt(); + readData = buffer.readCompoundTag(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeInt(entityId); + buffer.writeCompoundTag(entity.getPersistentData()); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + Entity entityByID = Minecraft.getInstance().world.getEntityByID(entityId); + if (!(entityByID instanceof ISyncPersistentData)) + return; + CompoundNBT data = entityByID.getPersistentData(); + for (Iterator iterator = data.keySet() + .iterator(); iterator.hasNext(); ) { + data.remove(iterator.next()); + } + data.merge(readData); + ((ISyncPersistentData) entityByID).onPersistentDataUpdated(); + }); + context.get() + .setPacketHandled(true); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index 7f0e951fd..1fe81d97f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.ponder; import static com.simibubi.create.foundation.ponder.PonderLocalization.LANG_PREFIX; -import java.awt.Color; +import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -693,7 +693,7 @@ public class PonderUI extends NavigatableSimiScreen { chase.tickChaser(); - if (highlightAll || sceneTags.contains(this.tags.get(i))) + if (highlightAll) button.flash(); else button.dim(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index 843f8a622..8152befd9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -618,7 +618,7 @@ public class BearingScenes { .placeNearTarget(); scene.idle(40); scene.world.configureCenterOfRotation(plank, util.vector.centerOf(bearingPos)); - + if (!frame) { scene.world.rotateBearing(bearingPos, 180, 75); scene.world.rotateSection(plank, 0, 180, 0, 75); @@ -628,26 +628,26 @@ public class BearingScenes { scene.rotateCameraY(-30); scene.idle(10); InputWindowElement input = - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) - .withItem(new ItemStack(Items.BLUE_DYE)); + new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) + .withItem(new ItemStack(Items.BLUE_DYE)); scene.overlay.showControls(input, 30); scene.idle(7); - scene.world.setBlock(util.grid.at(2, 3, 1), AllBlocks.DYED_SAILS[DyeColor.BLUE.ordinal()].getDefaultState() - .with(SailBlock.FACING, Direction.WEST), false); + scene.world.setBlock(util.grid.at(2, 3, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE).getDefaultState() + .with(SailBlock.FACING, Direction.WEST), false); scene.idle(10); scene.overlay.showText(40) - .colored(PonderPalette.BLUE) - .text("Right-Click with Dye to paint them") - .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.WEST)) - .placeNearTarget(); + .colored(PonderPalette.BLUE) + .text("Right-Click with Dye to paint them") + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.WEST)) + .placeNearTarget(); scene.idle(20); scene.overlay.showControls(input, 30); scene.idle(7); scene.world.replaceBlocks(util.select.fromTo(2, 2, 1, 2, 4, 1), - AllBlocks.DYED_SAILS[DyeColor.BLUE.ordinal()].getDefaultState() - .with(SailBlock.FACING, Direction.WEST), - false); + AllBlocks.DYED_SAILS.get(DyeColor.BLUE).getDefaultState() + .with(SailBlock.FACING, Direction.WEST), + false); scene.idle(20); scene.world.rotateBearing(bearingPos, 90, 33); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java index 168e171c2..43d12f44f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java @@ -116,7 +116,7 @@ public class ChainDriveScenes { scene.idle(10); scene.overlay.showText(60) - .text("Unpowered Chain Gearshifts behave exacly like Chain Drives") + .text("Unpowered Chain Gearshifts behave exactly like Chain Drives") .placeNearTarget() .pointAt(util.vector.blockSurface(eastDrive, Direction.NORTH)); scene.idle(60); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 8d97c0254..5a59ff35f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -26,6 +26,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.FurnaceBlock; import net.minecraft.block.RedstoneWireBlock; +import net.minecraft.item.DyeColor; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.particles.ParticleTypes; @@ -631,7 +632,7 @@ public class KineticsScenes { scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.BLUE_DYE)), 40); scene.idle(7); - scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES[11].getDefaultState() + scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES.get(DyeColor.BLUE).getDefaultState() .with(ValveHandleBlock.FACING, Direction.UP), true); scene.idle(10); scene.overlay.showText(70) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index 71fb38cb2..838a518ab 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.PonderRegistry; import net.minecraft.block.Blocks; +import net.minecraft.item.DyeColor; public class PonderIndex { @@ -54,24 +55,24 @@ public class PonderIndex { .addStoryBoard("fan/source", FanScenes::source, PonderTag.KINETIC_SOURCES); PonderRegistry.addStoryBoard(AllBlocks.CREATIVE_MOTOR, "creative_motor", KineticsScenes::creativeMotor, - PonderTag.KINETIC_SOURCES); + PonderTag.KINETIC_SOURCES); PonderRegistry.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel, - PonderTag.KINETIC_SOURCES); + PonderTag.KINETIC_SOURCES); PonderRegistry.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, - PonderTag.KINETIC_SOURCES); + PonderTag.KINETIC_SOURCES); PonderRegistry.addStoryBoard(AllBlocks.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle, - PonderTag.KINETIC_SOURCES); - PonderRegistry.forComponents(AllBlocks.DYED_VALVE_HANDLES) - .addStoryBoard("valve_handle", KineticsScenes::valveHandle); + PonderTag.KINETIC_SOURCES); + PonderRegistry.forComponents(AllBlocks.DYED_VALVE_HANDLES.toArray()) + .addStoryBoard("valve_handle", KineticsScenes::valveHandle); PonderRegistry.addStoryBoard(AllBlocks.ENCASED_CHAIN_DRIVE, "chain_drive/relay", - ChainDriveScenes::chainDriveAsRelay, PonderTag.KINETIC_RELAYS); + ChainDriveScenes::chainDriveAsRelay, PonderTag.KINETIC_RELAYS); PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) - .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); + .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE) - .addStoryBoard("furnace_engine", KineticsScenes::furnaceEngine); + .addStoryBoard("furnace_engine", KineticsScenes::furnaceEngine); PonderRegistry.forComponents(AllBlocks.FLYWHEEL) .addStoryBoard("furnace_engine", KineticsScenes::flywheel); PonderRegistry.forComponents(AllBlocks.ROTATION_SPEED_CONTROLLER) @@ -398,17 +399,17 @@ public class PonderIndex { .add(Blocks.HONEY_BLOCK); PonderRegistry.tags.forTag(PonderTag.CONTRAPTION_ACTOR) - .add(AllBlocks.MECHANICAL_HARVESTER) - .add(AllBlocks.MECHANICAL_PLOUGH) - .add(AllBlocks.MECHANICAL_DRILL) - .add(AllBlocks.MECHANICAL_SAW) - .add(AllBlocks.DEPLOYER) - .add(AllBlocks.PORTABLE_STORAGE_INTERFACE) - .add(AllBlocks.PORTABLE_FLUID_INTERFACE) - .add(AllBlocks.MECHANICAL_BEARING) - .add(AllBlocks.ANDESITE_FUNNEL) - .add(AllBlocks.BRASS_FUNNEL) - .add(AllBlocks.SEATS[0]) + .add(AllBlocks.MECHANICAL_HARVESTER) + .add(AllBlocks.MECHANICAL_PLOUGH) + .add(AllBlocks.MECHANICAL_DRILL) + .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.DEPLOYER) + .add(AllBlocks.PORTABLE_STORAGE_INTERFACE) + .add(AllBlocks.PORTABLE_FLUID_INTERFACE) + .add(AllBlocks.MECHANICAL_BEARING) + .add(AllBlocks.ANDESITE_FUNNEL) + .add(AllBlocks.BRASS_FUNNEL) + .add(AllBlocks.SEATS.get(DyeColor.WHITE)) .add(AllBlocks.REDSTONE_CONTACT) .add(Blocks.BELL) .add(Blocks.DISPENSER) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java index 2533e3e9a..e3e675053 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.ponder.ui; -import java.awt.Color; +import java.awt.*; import javax.annotation.Nonnull; @@ -8,6 +8,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.RenderElement; import com.simibubi.create.foundation.gui.Theme; +import com.simibubi.create.foundation.gui.Theme.Key; import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.widgets.ElementWidget; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -74,12 +75,12 @@ public class PonderButton extends BoxWidget { float flashValue = flash.getValue(partialTicks); if (flashValue > .1f) { - float sin = 0.5f + 0.5f * MathHelper.sin((AnimationTickHolder.getTicks(true) + partialTicks) / 6f); + float sin = 0.5f + 0.5f * MathHelper.sin((AnimationTickHolder.getTicks(true) + partialTicks) / 5f); sin *= flashValue; Color c1 = gradientColor1; Color c2 = gradientColor2; - Color nc1 = new Color(c1.getRed(), c1.getGreen(), c1.getBlue(), MathHelper.clamp(c1.getAlpha() + 50, 0, 255)); - Color nc2 = new Color(c2.getRed(), c2.getGreen(), c2.getBlue(), MathHelper.clamp(c2.getAlpha() + 50, 0, 255)); + Color nc1 = new Color(255, 255, 255, MathHelper.clamp(c1.getAlpha() + 150, 0, 255)); + Color nc2 = new Color(155, 155, 155, MathHelper.clamp(c2.getAlpha() + 150, 0, 255)); gradientColor1 = ColorHelper.mixColors(c1, nc1, sin); gradientColor2 = ColorHelper.mixColors(c2, nc2, sin); } @@ -94,7 +95,7 @@ public class PonderButton extends BoxWidget { return; if (shortcut != null) { - ms.translate(0, 0, z+50); + ms.translate(0, 0, z + 50); drawCenteredText(ms, Minecraft.getInstance().fontRenderer, shortcut.getBoundKeyLocalizedText(), x + width / 2 + 8, y + height - 6, ColorHelper.applyAlpha(Theme.i(Theme.Key.TEXT_DARKER), fadeValue)); } } @@ -102,4 +103,25 @@ public class PonderButton extends BoxWidget { public ItemStack getItem() { return item; } + + @Override + public Key getDisabledTheme() { + return Theme.Key.PONDER_BUTTON_DISABLE; + } + + @Override + public Key getIdleTheme() { + return Theme.Key.PONDER_BUTTON_IDLE; + } + + @Override + public Key getHoverTheme() { + return Theme.Key.PONDER_BUTTON_HOVER; + } + + @Override + public Key getClickTheme() { + return Theme.Key.PONDER_BUTTON_CLICK; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java index eac304882..80fcbf014 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java @@ -107,12 +107,19 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { return ItemStack.EMPTY; Predicate test = getFilterTest(filter); - ItemStack extract = ItemStack.EMPTY; - if (amount != -1) - extract = ItemHelper.extract(inventory, test, amount, shouldSimulate); - else - extract = ItemHelper.extract(inventory, test, amountThreshold, shouldSimulate); - return extract; + + ItemStack simulatedItems = extractAmountOrThresh(inventory, test, amount, amountThreshold, true); + if (shouldSimulate || simulatedItems.isEmpty()) + return simulatedItems; + + return extractAmountOrThresh(inventory, test, amount, amountThreshold, false); + } + + private static ItemStack extractAmountOrThresh(IItemHandler inventory, Predicate test, int amount, + Function amountThreshold, boolean shouldSimulate) { + if (amount == -1) + return ItemHelper.extract(inventory, test, amountThreshold, shouldSimulate); + return ItemHelper.extract(inventory, test, amount, shouldSimulate); } public ItemStack insert(ItemStack stack) { @@ -156,7 +163,7 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { if (!targetCapability.isPresent()) findNewCapability(); } - + @Override public void tick() { super.tick(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/ColorHandlers.java b/src/main/java/com/simibubi/create/foundation/utility/ColorHandlers.java new file mode 100644 index 000000000..75e429dd1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/ColorHandlers.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.utility; + +import net.minecraft.block.RedstoneWireBlock; +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.world.GrassColors; +import net.minecraft.world.biome.BiomeColors; + +public class ColorHandlers { + + public static IBlockColor getGrassyBlock() { + return (state, world, pos, layer) -> pos != null && world != null ? BiomeColors.getGrassColor(world, pos) + : GrassColors.get(0.5D, 1.0D); + } + + public static IItemColor getGrassyItem() { + return (stack, layer) -> GrassColors.get(0.5D, 1.0D); + } + + public static IBlockColor getRedstonePower() { + return (state, world, pos, layer) -> RedstoneWireBlock + .getWireColor(pos != null && world != null ? state.get(BlockStateProperties.POWER_0_15) : 0); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java index d2a119cae..cf919904a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java @@ -11,10 +11,13 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.MobSpawnerTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.text.ITextComponent; +import net.minecraftforge.common.util.Constants; public final class NBTProcessors { @@ -32,10 +35,26 @@ public final class NBTProcessors { static { addProcessor(TileEntityType.SIGN, data -> { for (int i = 0; i < 4; ++i) { - String s = data.getString("Text" + (i + 1)); - ITextComponent textcomponent = ITextComponent.Serializer.fromJson(s.isEmpty() ? "\"\"" : s); - if (textcomponent != null && textcomponent.getStyle() != null && textcomponent.getStyle() - .getClickEvent() != null) + if (textComponentHasClickEvent(data.getString("Text" + (i + 1)))) + return null; + } + return data; + }); + addProcessor(TileEntityType.LECTERN, data -> { + if (!data.contains("Book", Constants.NBT.TAG_COMPOUND)) + return data; + CompoundNBT book = data.getCompound("Book"); + + if (!book.contains("tag", Constants.NBT.TAG_COMPOUND)) + return data; + CompoundNBT tag = book.getCompound("tag"); + + if (!tag.contains("pages", Constants.NBT.TAG_LIST)) + return data; + ListNBT pages = tag.getList("pages", Constants.NBT.TAG_STRING); + + for (INBT inbt : pages) { + if (textComponentHasClickEvent(inbt.getString())) return null; } return data; @@ -50,7 +69,13 @@ public final class NBTProcessors { }); } - private NBTProcessors() {} + public static boolean textComponentHasClickEvent(String json) { + ITextComponent component = ITextComponent.Serializer.fromJson(json.isEmpty() ? "\"\"" : json); + return component != null && component.getStyle() != null && component.getStyle().getClickEvent() != null; + } + + private NBTProcessors() { + } @Nullable public static CompoundNBT process(TileEntity tileEntity, CompoundNBT compound, boolean survival) { diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index ce2e8e7e6..24c126827 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -2,25 +2,29 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create Palettes", - - "death.attack.create.crush": "%1$s was processed by Crushing Wheels", - "death.attack.create.fan_fire": "%1$s was burned to death by hot air", - "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", - "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", - "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", - "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", - "create.block.deployer.damage_source_name": "a rogue Deployer", - "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", - - "create.recipe.crushing": "Crushing", - "create.recipe.milling": "Milling", - "create.recipe.fan_washing": "Bulk Washing", - "create.recipe.fan_washing.fan": "Fan behind Flowing Water", - "create.recipe.fan_smoking": "Bulk Smoking", - "create.recipe.fan_smoking.fan": "Fan behind Fire", - "create.recipe.fan_blasting": "Bulk Blasting", - "create.recipe.fan_blasting.fan": "Fan behind Lava", - "create.recipe.pressing": "Pressing", + "death.attack.create.crush": "%1$s was processed by Crushing Wheels", + "death.attack.create.fan_fire": "%1$s was burned to death by hot air", + "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", + "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", + "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", + "create.block.deployer.damage_source_name": "a rogue Deployer", + "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", + "create.menu.return": "Return to Menu", + "create.menu.configure": "Configure...", + "create.menu.getting_started": "Getting Started", + "create.menu.project_page": "Project Page", + "create.menu.report_bugs": "Report Issues", + "create.menu.support": "Support Us", + "create.recipe.crushing": "Crushing", + "create.recipe.milling": "Milling", + "create.recipe.fan_washing": "Bulk Washing", + "create.recipe.fan_washing.fan": "Fan behind Flowing Water", + "create.recipe.fan_smoking": "Bulk Smoking", + "create.recipe.fan_smoking.fan": "Fan behind Fire", + "create.recipe.fan_blasting": "Bulk Blasting", + "create.recipe.fan_blasting.fan": "Fan behind Lava", + "create.recipe.pressing": "Pressing", "create.recipe.mixing": "Mixing", "create.recipe.deploying": "Deploying", "create.recipe.automatic_shapeless": "Automated Shapeless Crafting", @@ -37,11 +41,11 @@ "create.recipe.spout_filling": "Filling by Spout", "create.recipe.draining": "Item Draining", - "create.recipe.processing.chance": "%1$s%% Chance", + "create.recipe.processing.chance": "%1$s%% Chance", "create.recipe.heat_requirement.none": "No Heating Required", "create.recipe.heat_requirement.heated": "Heated", "create.recipe.heat_requirement.superheated": "Super-Heated", - + "create.generic.range": "Range", "create.generic.radius": "Radius", "create.generic.width": "Width", @@ -116,11 +120,11 @@ "create.gui.terrainzapper.tool.clear": "Clear", "create.gui.terrainzapper.tool.overlay": "Overlay", "create.gui.terrainzapper.tool.flatten": "Flatten", - + "create.terrainzapper.shiftRightClickToSet": "Shift-Right-Click to Select a Shape", "create.terrainzapper.usingBlock": "Using: %1$s", "create.terrainzapper.leftClickToSet": "Left-Click a Block to set Material", - + "create.minecart_coupling.two_couplings_max": "Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "Parts of your train seem to be in unloaded chunks", "create.minecart_coupling.no_loops": "Couplings cannot form a loop", @@ -138,13 +142,13 @@ "create.contraptions.cart_movement_mode.rotate": "Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "Lock rotation", - + "create.contraptions.windmill.rotation_direction": "Rotation Direction", "create.contraptions.clockwork.clock_hands": "Clock Hands", "create.contraptions.clockwork.hour_first": "Hour hand first", "create.contraptions.clockwork.minute_first": "Minute hand first", "create.contraptions.clockwork.hour_first_24": "24-Hour hand first", - + "create.logistics.filter": "Filter", "create.logistics.recipe_filter": "Recipe Filter", "create.logistics.fluid_filter": "Fluid Filter", @@ -176,7 +180,7 @@ "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.overstressed": "Overstressed", "create.gui.stressometer.no_rotation": "No Rotation", - + "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", @@ -289,7 +293,7 @@ "create.gui.schematicannon.option.replaceWithEmpty": "Replace Solid with Empty", "create.gui.schematicannon.option.skipMissing": "Skip missing Blocks", "create.gui.schematicannon.option.skipTileEntities": "Protect Tile Entities", - + "create.gui.schematicannon.slot.gunpowder": "Add gunpowder to fuel the cannon", "create.gui.schematicannon.slot.listPrinter": "Place books here to print a Checklist for your Schematic", "create.gui.schematicannon.slot.schematic": "Add your Schematic here. Make sure it is deployed at a specific location.", @@ -330,7 +334,7 @@ "create.gui.filter.respect_data.description": "Items only match if their durability, enchantments, and other attributes match as well.", "create.gui.filter.ignore_data": "Ignore Data", "create.gui.filter.ignore_data.description": "Items match regardless of their attributes.", - + "create.item_attributes.placeable": "is placeable", "create.item_attributes.placeable.inverted": "is not placeable", "create.item_attributes.consumable": "can be eaten", @@ -392,7 +396,7 @@ "create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s", "create.item_attributes.astralsorcery_amulet": "improves %1$s", "create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s", - + "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", "create.gui.attribute_filter.add_attribute": "Add attribute to List", @@ -428,12 +432,12 @@ "create.tooltip.generationSpeed" : "Generates at %1$s %2$s", "create.tooltip.analogStrength": "Analog Strength: %1$s/15", - + "create.mechanical_arm.extract_from": "Take items from %1$s", "create.mechanical_arm.deposit_to": "Deposit items to %1$s", "create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.", - + "create.weighted_ejector.target_set": "Target Selected", "create.weighted_ejector.target_not_valid": "Ejecting to Adjacent block (Target was not Valid)", "create.weighted_ejector.no_target": "Ejecting to Adjacent block (No Target was Selected)", @@ -460,26 +464,30 @@ "create.tooltip.chute.no_fans_attached": "No attached fans", "create.tooltip.chute.fans_push_up": "Fans push from Below", "create.tooltip.chute.fans_push_down": "Fans push from Above", - "create.tooltip.chute.fans_pull_up": "Fans pull from Above", - "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", - "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.empty_bearing.title": "Update Bearing", - "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "Deployer Item Overflow", - "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", - - "create.gui.config.overlay1": "Hi :)", + "create.tooltip.chute.fans_pull_up": "Fans pull from Above", + "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.crafting_blueprint.crafting_slot": "Ingredient Slot", + "create.crafting_blueprint.filter_items_viable": "Advanced filter items are viable", + "create.crafting_blueprint.display_slot": "Display Slot", + "create.crafting_blueprint.inferred": "Inferred from recipe", + "create.crafting_blueprint.manually_assigned": "Manually assigned", + "create.crafting_blueprint.secondary_display_slot": "Secondary Display Slot", + "create.crafting_blueprint.optional": "Optional", + "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", + "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.empty_bearing.title": "Update Bearing", + "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.hint.full_deployer.title": "Deployer Item Overflow", + "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", "create.gui.config.overlay3": "Click or drag with your mouse", "create.gui.config.overlay4": "to move this preview", @@ -495,7 +503,7 @@ "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", - + "create.contraption.minecart_contraption_too_big": "This Cart Contraption seems too big to pick up" -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/entity/crafting_blueprint_large.json b/src/main/resources/assets/create/models/entity/crafting_blueprint_large.json new file mode 100644 index 000000000..2fdd1143c --- /dev/null +++ b/src/main/resources/assets/create/models/entity/crafting_blueprint_large.json @@ -0,0 +1,81 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:entity/blueprint_large", + "particle": "create:entity/blueprint_large" + }, + "elements": [ + { + "from": [ + -16, + 0, + -16 + ], + "to": [ + 32, + 1, + 32 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 12, + 0.25 + ], + "rotation": 180, + "texture": "#0" + }, + "east": { + "uv": [ + 11.75, + 0, + 12, + 12 + ], + "rotation": 90, + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 11.75, + 12, + 12 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0.25, + 12 + ], + "rotation": 270, + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 12, + 12 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 12, + 12 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} diff --git a/src/main/resources/assets/create/models/entity/crafting_blueprint_medium.json b/src/main/resources/assets/create/models/entity/crafting_blueprint_medium.json new file mode 100644 index 000000000..6dcdf49dc --- /dev/null +++ b/src/main/resources/assets/create/models/entity/crafting_blueprint_medium.json @@ -0,0 +1,81 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:entity/blueprint_medium", + "particle": "create:entity/blueprint_medium" + }, + "elements": [ + { + "from": [ + -8, + 0, + -8 + ], + "to": [ + 24, + 1, + 24 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 0.5 + ], + "rotation": 180, + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 15.5, + 16, + 16 + ], + "rotation": 180, + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 15.5, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0.5, + 16 + ], + "rotation": 270, + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} diff --git a/src/main/resources/assets/create/models/entity/crafting_blueprint_small.json b/src/main/resources/assets/create/models/entity/crafting_blueprint_small.json new file mode 100644 index 000000000..e70b7bbf5 --- /dev/null +++ b/src/main/resources/assets/create/models/entity/crafting_blueprint_small.json @@ -0,0 +1,81 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:entity/blueprint_small", + "particle": "create:entity/blueprint_small" + }, + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 1, + 16 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 1 + ], + "rotation": 180, + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 15, + 16, + 16 + ], + "rotation": 180, + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 15, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 1, + 16 + ], + "rotation": 270, + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} diff --git a/src/main/resources/assets/create/models/item/wrench/item.json b/src/main/resources/assets/create/models/item/wrench/item.json index 656143148..55cbe7e35 100644 --- a/src/main/resources/assets/create/models/item/wrench/item.json +++ b/src/main/resources/assets/create/models/item/wrench/item.json @@ -81,13 +81,65 @@ "to": [10.4, 9, 9], "rotation": {"angle": 0, "axis": "y", "origin": [9, 11, 8]}, "faces": { - "north": {"uv": [4, 10, 12, 12], "texture": "#5"}, - "east": {"uv": [4, 10, 6, 14], "rotation": 90, "texture": "#5"}, - "south": {"uv": [12, 10, 4, 12], "texture": "#5"}, - "west": {"uv": [4, 10, 6, 14], "rotation": 90, "texture": "#5"}, - "up": {"uv": [4, 10, 12, 14], "rotation": 180, "texture": "#5"}, - "down": {"uv": [6, 0, 9, 2], "texture": "#5"} - } + "north": { + "uv": [ + 4, + 10, + 12, + 12 + ], + "texture": "#5" + }, + "east": { + "uv": [ + 4, + 10, + 6, + 14 + ], + "rotation": 90, + "texture": "#5" + }, + "south": { + "uv": [ + 12, + 10, + 4, + 12 + ], + "texture": "#5" + }, + "west": { + "uv": [ + 4, + 10, + 6, + 14 + ], + "rotation": 90, + "texture": "#5" + }, + "up": { + "uv": [ + 4, + 10, + 12, + 14 + ], + "rotation": 180, + "texture": "#5" + }, + "down": { + "uv": [ + 4, + 10, + 12, + 13 + ], + "rotation": 180, + "texture": "#5" + } + } }, { "name": "gear case", @@ -142,4 +194,4 @@ "children": [0, 1, 2, 3, 4, 5, 6] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/textures/entity/blueprint_large.png b/src/main/resources/assets/create/textures/entity/blueprint_large.png new file mode 100644 index 000000000..5d56ae44e Binary files /dev/null and b/src/main/resources/assets/create/textures/entity/blueprint_large.png differ diff --git a/src/main/resources/assets/create/textures/entity/blueprint_medium.png b/src/main/resources/assets/create/textures/entity/blueprint_medium.png new file mode 100644 index 000000000..ced7b7045 Binary files /dev/null and b/src/main/resources/assets/create/textures/entity/blueprint_medium.png differ diff --git a/src/main/resources/assets/create/textures/entity/blueprint_small.png b/src/main/resources/assets/create/textures/entity/blueprint_small.png new file mode 100644 index 000000000..a386ea078 Binary files /dev/null and b/src/main/resources/assets/create/textures/entity/blueprint_small.png differ diff --git a/src/main/resources/assets/create/textures/gui/curiosities2.png b/src/main/resources/assets/create/textures/gui/curiosities2.png index 26fce588c..601fb22df 100644 Binary files a/src/main/resources/assets/create/textures/gui/curiosities2.png and b/src/main/resources/assets/create/textures/gui/curiosities2.png differ diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index ad4928d11..9c862ea80 100644 Binary files a/src/main/resources/assets/create/textures/gui/icons.png and b/src/main/resources/assets/create/textures/gui/icons.png differ diff --git a/src/main/resources/assets/create/textures/gui/logo.png b/src/main/resources/assets/create/textures/gui/logo.png new file mode 100644 index 000000000..beac8a31b Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/logo.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_0.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_0.png new file mode 100644 index 000000000..2a955e5f8 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/title/background/panorama_0.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_1.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_1.png new file mode 100644 index 000000000..dc8632fa2 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/title/background/panorama_1.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_2.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_2.png new file mode 100644 index 000000000..b8ea73f25 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/title/background/panorama_2.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_3.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_3.png new file mode 100644 index 000000000..64542f2a3 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/title/background/panorama_3.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_4.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_4.png new file mode 100644 index 000000000..c094a82e9 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/title/background/panorama_4.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_5.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_5.png new file mode 100644 index 000000000..bbac982a8 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/title/background/panorama_5.png differ diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index 33cfed66c..3588a5cfc 100644 Binary files a/src/main/resources/assets/create/textures/gui/widgets.png and b/src/main/resources/assets/create/textures/gui/widgets.png differ diff --git a/src/main/resources/assets/create/textures/item/crafting_blueprint.png b/src/main/resources/assets/create/textures/item/crafting_blueprint.png new file mode 100644 index 000000000..4481759f1 Binary files /dev/null and b/src/main/resources/assets/create/textures/item/crafting_blueprint.png differ