Merge remote-tracking branch 'origin/mc1.16/dev' into chromatic-projector

This commit is contained in:
JozsefA 2021-06-11 01:17:01 -07:00
commit d612cfdd34
143 changed files with 5052 additions and 2660 deletions

View file

@ -407,21 +407,21 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
e9c463e0cf56ed28ee26a33debeae3ecc2e941d2 assets/create/lang/en_ud.json c71f5246d2cb8e9913d1552d23fcc82c43cde7a0 assets/create/lang/en_ud.json
dceb2a935135d2ef502cdcba7c9d58f64062513f assets/create/lang/en_us.json ec002cefbb883258daed50448e17f874eb814c18 assets/create/lang/en_us.json
eb40acb99f3c7af50b840f3c2058d7a7bdd5cff7 assets/create/lang/unfinished/de_de.json 639b3bbd99887014d67fc943d6e1415bebd1c70a assets/create/lang/unfinished/de_de.json
bcbfd3a6768daf265a1c01a424e985a3fdec6504 assets/create/lang/unfinished/es_es.json 3dca81115778734215a4d361ec30f43b1342b51c assets/create/lang/unfinished/es_es.json
50dec8a7eb983ac4d29f3eeba3273dbaeca26902 assets/create/lang/unfinished/es_mx.json df82753f7276ceb72a834170bb09260c4c4f7936 assets/create/lang/unfinished/es_mx.json
cc723673107651024f3fc0e43690ac467ff729b2 assets/create/lang/unfinished/fr_fr.json 021158ff586e33ccfd0012c2c4fbfba83b62d57b assets/create/lang/unfinished/fr_fr.json
99452bacb5d80715ea0a52106b7e2734a32c55d4 assets/create/lang/unfinished/it_it.json 4d3132ccb4a8d7c211451e195165fb3719c135a6 assets/create/lang/unfinished/it_it.json
f3058ea623666a43029af307f632197c8ff8dcab assets/create/lang/unfinished/ja_jp.json 741f5a61d9fec8ece2936649490318ef4b06b15f assets/create/lang/unfinished/ja_jp.json
d756b02573d6a3a3b73bd03ec69fe760825e1606 assets/create/lang/unfinished/ko_kr.json 79983f46c225a3dca6b9e6cecc26f73e07db1b86 assets/create/lang/unfinished/ko_kr.json
281712735ab6437a417dde63c855e18eb19493a0 assets/create/lang/unfinished/nl_nl.json c85b841cf6ef7a5205782da242e98c2dc3b2af9a assets/create/lang/unfinished/nl_nl.json
24056aefb7ff79a2127c194fe2918ab9e745d6b5 assets/create/lang/unfinished/pl_pl.json 2bcee4396da8bc2cbba794e7dd4b33a406d58360 assets/create/lang/unfinished/pl_pl.json
0f9c83a9f70d809d8f66c0438529b169b92ffdb1 assets/create/lang/unfinished/pt_br.json 0b45c9ecdf8fc82f7f1e112d82cb95e94cf8b064 assets/create/lang/unfinished/pt_br.json
ff35273842d3190aa361f2a8ca7edae80f97864d assets/create/lang/unfinished/ru_ru.json b7ef8659876e0890016e696b5adf73404b31ef8a assets/create/lang/unfinished/ru_ru.json
139a31cfd09d4aaca33d118d28de735ba72f4f0d assets/create/lang/unfinished/zh_cn.json f04ba370732503448596909c56ff0e05aec5a233 assets/create/lang/unfinished/zh_cn.json
19bfa8f57e8b395a2cfd98039f44301a61c1f73c assets/create/lang/unfinished/zh_tw.json 708e423b949fc4113cefc46a0119d02cad8f71ad assets/create/lang/unfinished/zh_tw.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.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 f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles.json
5583368909c319acfcf0f7a419bedf23272fe613 assets/create/models/item/copper_valve_handle.json 5583368909c319acfcf0f7a419bedf23272fe613 assets/create/models/item/copper_valve_handle.json
4e253e7c0626dfd76e2d39786ce1a34e0baaa62d assets/create/models/item/crafter_slot_cover.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 7b333dea353afaa27b182aedc647c9e9e34e92ef assets/create/models/item/creative_crate.json
f7d06c52c3ca8c22ad67f5741471f06ac22e7fcb assets/create/models/item/creative_fluid_tank.json f7d06c52c3ca8c22ad67f5741471f06ac22e7fcb assets/create/models/item/creative_fluid_tank.json
5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json 5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json

View file

@ -410,6 +410,7 @@
"block.create.zinc_block": "\u0254u\u0131Z \u025Fo \u029E\u0254o\u05DF\u15FA", "block.create.zinc_block": "\u0254u\u0131Z \u025Fo \u029E\u0254o\u05DF\u15FA",
"block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z",
"entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", "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.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141",
"entity.create.seat": "\u0287\u0250\u01DDS", "entity.create.seat": "\u0287\u0250\u01DDS",
"entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S", "entity.create.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_nugget": "\u0287\u01DDbbnN \u0279\u01DDddo\u0186",
"item.create.copper_sheet": "\u0287\u01DD\u01DD\u0265S \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.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_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_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", "item.create.crushed_copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186 p\u01DD\u0265sn\u0279\u0186",

View file

@ -412,17 +412,15 @@
"block.create.yellow_valve_handle": "Yellow Valve Handle", "block.create.yellow_valve_handle": "Yellow Valve Handle",
"block.create.zinc_block": "Block of Zinc", "block.create.zinc_block": "Block of Zinc",
"block.create.zinc_ore": "Zinc Ore", "block.create.zinc_ore": "Zinc Ore",
"entity.create.contraption": "Contraption", "entity.create.contraption": "Contraption",
"entity.create.crafting_blueprint": "Crafting Blueprint",
"entity.create.gantry_contraption": "Gantry Contraption", "entity.create.gantry_contraption": "Gantry Contraption",
"entity.create.seat": "Seat", "entity.create.seat": "Seat",
"entity.create.stationary_contraption": "Stationary Contraption", "entity.create.stationary_contraption": "Stationary Contraption",
"entity.create.super_glue": "Super Glue", "entity.create.super_glue": "Super Glue",
"fluid.create.milk": "Milk", "fluid.create.milk": "Milk",
"fluid.create.potion": "Potion", "fluid.create.potion": "Potion",
"fluid.create.tea": "Builder's Tea", "fluid.create.tea": "Builder's Tea",
"item.create.andesite_alloy": "Andesite Alloy", "item.create.andesite_alloy": "Andesite Alloy",
"item.create.attribute_filter": "Attribute Filter", "item.create.attribute_filter": "Attribute Filter",
"item.create.bar_of_chocolate": "Bar of Chocolate", "item.create.bar_of_chocolate": "Bar of Chocolate",
@ -444,6 +442,7 @@
"item.create.copper_nugget": "Copper Nugget", "item.create.copper_nugget": "Copper Nugget",
"item.create.copper_sheet": "Copper Sheet", "item.create.copper_sheet": "Copper Sheet",
"item.create.crafter_slot_cover": "Crafter Slot Cover", "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_aluminum_ore": "Crushed Aluminum Ore",
"item.create.crushed_brass": "Crushed Brass", "item.create.crushed_brass": "Crushed Brass",
"item.create.crushed_copper_ore": "Crushed Copper Ore", "item.create.crushed_copper_ore": "Crushed Copper Ore",
@ -662,17 +661,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create Palettes", "itemGroup.create.palettes": "Create Palettes",
"death.attack.create.crush": "%1$s was processed by Crushing Wheels", "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_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.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_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.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", "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.deployer.damage_source_name": "a rogue Deployer",
"create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", "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.crushing": "Crushing",
"create.recipe.milling": "Milling", "create.recipe.milling": "Milling",
"create.recipe.fan_washing": "Bulk Washing", "create.recipe.fan_washing": "Bulk Washing",
@ -1105,13 +1107,18 @@
"create.tooltip.chute.fans_pull_up": "Fans pull 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.fans_pull_down": "Fans pull from Below",
"create.tooltip.chute.contains": "Contains: %1$s x%2$s", "create.tooltip.chute.contains": "Contains: %1$s x%2$s",
"create.linked_controller.bind_mode": "Bind mode active", "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.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.key_bound": "Frequency bound to %1$s",
"create.linked_controller.frequency_slot_1": "Keybind: %1$s, Freq. #1", "create.linked_controller.frequency_slot_1": "Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "Keybind: %1$s, Freq. #2", "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.title": "Bottomless Supply",
"create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", "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.title": "No Targets",
@ -1614,20 +1621,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "12 RPM",
"create.ponder.chute.header": "Transporting Items downward via Chutes", "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_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_2": "Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 953", "_": "Missing Localizations: 968",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Akazienholzfenster", "block.create.acacia_window": "Akazienholzfenster",
"block.create.acacia_window_pane": "Akazienholzfensterscheibe", "block.create.acacia_window_pane": "Akazienholzfensterscheibe",
"block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe", "block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "Gelber Ventilgriff", "block.create.yellow_valve_handle": "Gelber Ventilgriff",
"block.create.zinc_block": "Zinkblock", "block.create.zinc_block": "Zinkblock",
"block.create.zinc_ore": "Zinkerz", "block.create.zinc_ore": "Zinkerz",
"entity.create.contraption": "Vorrichtung", "entity.create.contraption": "Vorrichtung",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "Portalkran Vorrichtung", "entity.create.gantry_contraption": "Portalkran Vorrichtung",
"entity.create.seat": "Sitz", "entity.create.seat": "Sitz",
"entity.create.stationary_contraption": "Stationäre Vorrichtung", "entity.create.stationary_contraption": "Stationäre Vorrichtung",
"entity.create.super_glue": "Superkleber", "entity.create.super_glue": "Superkleber",
"fluid.create.milk": "Milch", "fluid.create.milk": "Milch",
"fluid.create.potion": "Trank", "fluid.create.potion": "Trank",
"fluid.create.tea": "Bauherrentee", "fluid.create.tea": "Bauherrentee",
"item.create.andesite_alloy": "Andesitlegierung", "item.create.andesite_alloy": "Andesitlegierung",
"item.create.attribute_filter": "Attribut Filter", "item.create.attribute_filter": "Attribut Filter",
"item.create.bar_of_chocolate": "Schokoladentafel", "item.create.bar_of_chocolate": "Schokoladentafel",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Kupferklumpen", "item.create.copper_nugget": "Kupferklumpen",
"item.create.copper_sheet": "Kupferblech", "item.create.copper_sheet": "Kupferblech",
"item.create.crafter_slot_cover": "Handwerkseinheit Slot Abdeckung", "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_aluminum_ore": "Zerkleinertes Aluminiumerz",
"item.create.crushed_brass": "Zerkleinertes Messing", "item.create.crushed_brass": "Zerkleinertes Messing",
"item.create.crushed_copper_ore": "Zerkleinertes Kupfererz", "item.create.crushed_copper_ore": "Zerkleinertes Kupfererz",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create Paletten", "itemGroup.create.palettes": "Create Paletten",
"death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", "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_fire": "%1$s hat heiße Luft eingeatmet",
"death.attack.create.fan_lava": "%1$s wurde von Lava verweht", "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_drill": "%1$s wurde von einem Bohrer durchlöchert",
"death.attack.create.mechanical_saw": "%1$s wurde zersägt", "death.attack.create.mechanical_saw": "%1$s wurde zersägt",
"death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt",
"create.block.deployer.damage_source_name": "einem Finger", "create.block.deployer.damage_source_name": "einem Finger",
"create.block.cart_assembler.invalid": "Platziere deinen Lorenmonteur auf einer Schiene.", "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.crushing": "Mahlen (Mahlwerk)",
"create.recipe.milling": "Mahlen (Mahlstein)", "create.recipe.milling": "Mahlen (Mahlstein)",
"create.recipe.fan_washing": "Sammelwaschen", "create.recipe.fan_washing": "Sammelwaschen",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "Propeller ziehen 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.fans_pull_down": "Propeller ziehen von unterhalb",
"create.tooltip.chute.contains": "Enthält: %1$s x%2$s", "create.tooltip.chute.contains": "Enthält: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "Endlose Versorgung",
"create.hint.hose_pulley": "Das angewählte Gewässer wird als unendlich betrachtet.", "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.title": "Keine Ziele",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 654", "_": "Missing Localizations: 669",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Ventana de acacia", "block.create.acacia_window": "Ventana de acacia",
"block.create.acacia_window_pane": "Panel de 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_chain_gearshift": "Cadena de transmisión ajustable",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "Asa de válvula amarillo", "block.create.yellow_valve_handle": "Asa de válvula amarillo",
"block.create.zinc_block": "Bloque de zinc", "block.create.zinc_block": "Bloque de zinc",
"block.create.zinc_ore": "Mineral de zinc", "block.create.zinc_ore": "Mineral de zinc",
"entity.create.contraption": "Artilugio", "entity.create.contraption": "Artilugio",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "Artilugio de grúa", "entity.create.gantry_contraption": "Artilugio de grúa",
"entity.create.seat": "Asiento", "entity.create.seat": "Asiento",
"entity.create.stationary_contraption": "Artilugio estacionario", "entity.create.stationary_contraption": "Artilugio estacionario",
"entity.create.super_glue": "Super Pegamento", "entity.create.super_glue": "Super Pegamento",
"fluid.create.milk": "Leche", "fluid.create.milk": "Leche",
"fluid.create.potion": "Poción", "fluid.create.potion": "Poción",
"fluid.create.tea": "Té del Constructor", "fluid.create.tea": "Té del Constructor",
"item.create.andesite_alloy": "Aleación de andesita", "item.create.andesite_alloy": "Aleación de andesita",
"item.create.attribute_filter": "Filtro de atributos", "item.create.attribute_filter": "Filtro de atributos",
"item.create.bar_of_chocolate": "Barra de chocolate", "item.create.bar_of_chocolate": "Barra de chocolate",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Pepita de cobre", "item.create.copper_nugget": "Pepita de cobre",
"item.create.copper_sheet": "Lámina de cobre", "item.create.copper_sheet": "Lámina de cobre",
"item.create.crafter_slot_cover": "Tapa de ranura del Autoensamblador mecánico", "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_aluminum_ore": "Mineral de aluminio molido",
"item.create.crushed_brass": "Latón molido", "item.create.crushed_brass": "Latón molido",
"item.create.crushed_copper_ore": "Mineral de cobre molido", "item.create.crushed_copper_ore": "Mineral de cobre molido",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Paletas", "itemGroup.create.palettes": "Paletas",
"death.attack.create.crush": "%1$s se procesó por las Ruedas de trituración", "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_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.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_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.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", "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.deployer.damage_source_name": "un Desplegador rebelde",
"create.block.cart_assembler.invalid": "Coloque su Ensamblador de vagonetas en un bloque de Raíles", "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.crushing": "Trituración",
"create.recipe.milling": "Fresado", "create.recipe.milling": "Fresado",
"create.recipe.fan_washing": "Lavado a granel", "create.recipe.fan_washing": "Lavado a granel",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "Los ventiladores tiran 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.fans_pull_down": "Los ventiladores tiran desde abajo",
"create.tooltip.chute.contains": "Contiene: %1$s x%2$s", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "Suministro sin fondo",
"create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", "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.title": "No hay objetivos",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 1277", "_": "Missing Localizations: 1292",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Ventana de Acacia", "block.create.acacia_window": "Ventana de Acacia",
"block.create.acacia_window_pane": "Panel de 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_chain_gearshift": "Cambio Ajustable de Velocidad de Cadena",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "Manija de Válvula Amarilla", "block.create.yellow_valve_handle": "Manija de Válvula Amarilla",
"block.create.zinc_block": "Bloque de Zinc", "block.create.zinc_block": "Bloque de Zinc",
"block.create.zinc_ore": "Mineral de Zinc", "block.create.zinc_ore": "Mineral de Zinc",
"entity.create.contraption": "Artefacto", "entity.create.contraption": "Artefacto",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "Asiento", "entity.create.seat": "Asiento",
"entity.create.stationary_contraption": "Artefacto Estacionario", "entity.create.stationary_contraption": "Artefacto Estacionario",
"entity.create.super_glue": "Super Pegamento", "entity.create.super_glue": "Super Pegamento",
"fluid.create.milk": "Leche", "fluid.create.milk": "Leche",
"fluid.create.potion": "Poción", "fluid.create.potion": "Poción",
"fluid.create.tea": "Té del Constructor", "fluid.create.tea": "Té del Constructor",
"item.create.andesite_alloy": "Aleación de Andesita", "item.create.andesite_alloy": "Aleación de Andesita",
"item.create.attribute_filter": "Filtro por Atributos", "item.create.attribute_filter": "Filtro por Atributos",
"item.create.bar_of_chocolate": "Barra de Chocolate", "item.create.bar_of_chocolate": "Barra de Chocolate",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Pepita de Cobre", "item.create.copper_nugget": "Pepita de Cobre",
"item.create.copper_sheet": "Lámina de Cobre", "item.create.copper_sheet": "Lámina de Cobre",
"item.create.crafter_slot_cover": "Cubierta de Ranura del Crafter", "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_aluminum_ore": "Mineral de Aluminio Molido",
"item.create.crushed_brass": "Latón Molido", "item.create.crushed_brass": "Latón Molido",
"item.create.crushed_copper_ore": "Mineral de Cobre Molido", "item.create.crushed_copper_ore": "Mineral de Cobre Molido",
@ -662,17 +659,20 @@
"itemGroup.create.base": "UNLOCALIZED: Create", "itemGroup.create.base": "UNLOCALIZED: Create",
"itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes",
"death.attack.create.crush": "UNLOCALIZED: %1$s was processed by Crushing Wheels", "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_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.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_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.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "death.attack.create.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.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer",
"create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", "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.crushing": "UNLOCALIZED: Crushing",
"create.recipe.milling": "UNLOCALIZED: Milling", "create.recipe.milling": "UNLOCALIZED: Milling",
"create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull 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.fans_pull_down": "UNLOCALIZED: Fans pull from Below",
"create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "UNLOCALIZED: Bottomless Supply",
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "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.title": "UNLOCALIZED: No Targets",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 1205", "_": "Missing Localizations: 1220",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Fenêtre en acacia", "block.create.acacia_window": "Fenêtre en acacia",
"block.create.acacia_window_pane": "Vitre en acacia", "block.create.acacia_window_pane": "Vitre en acacia",
"block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle",
"block.create.zinc_block": "Bloc de zinc", "block.create.zinc_block": "Bloc de zinc",
"block.create.zinc_ore": "Minerai de zinc", "block.create.zinc_ore": "Minerai de zinc",
"entity.create.contraption": "Engin", "entity.create.contraption": "Engin",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "Siège", "entity.create.seat": "Siège",
"entity.create.stationary_contraption": "Engin stationnaire", "entity.create.stationary_contraption": "Engin stationnaire",
"entity.create.super_glue": "Colle extra-forte", "entity.create.super_glue": "Colle extra-forte",
"fluid.create.milk": "Lait", "fluid.create.milk": "Lait",
"fluid.create.potion": "Potion", "fluid.create.potion": "Potion",
"fluid.create.tea": "Thé du constructeur", "fluid.create.tea": "Thé du constructeur",
"item.create.andesite_alloy": "Alliage d'andésite", "item.create.andesite_alloy": "Alliage d'andésite",
"item.create.attribute_filter": "Filtre d'attribut", "item.create.attribute_filter": "Filtre d'attribut",
"item.create.bar_of_chocolate": "Barre de chocolat", "item.create.bar_of_chocolate": "Barre de chocolat",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Pépite de cuivre", "item.create.copper_nugget": "Pépite de cuivre",
"item.create.copper_sheet": "Plaques de cuivre", "item.create.copper_sheet": "Plaques de cuivre",
"item.create.crafter_slot_cover": "Couvercle", "item.create.crafter_slot_cover": "Couvercle",
"item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"item.create.crushed_aluminum_ore": "Aluminium concassé", "item.create.crushed_aluminum_ore": "Aluminium concassé",
"item.create.crushed_brass": "Laiton concassé", "item.create.crushed_brass": "Laiton concassé",
"item.create.crushed_copper_ore": "Cuivre concassé", "item.create.crushed_copper_ore": "Cuivre concassé",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create Palettes", "itemGroup.create.palettes": "Create Palettes",
"death.attack.create.crush": "%1$s a été concassé.e", "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_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.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_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.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", "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.deployer.damage_source_name": "un déployeur voyou",
"create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", "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.crushing": "Ecrasement",
"create.recipe.milling": "Mouture", "create.recipe.milling": "Mouture",
"create.recipe.fan_washing": "Lavage", "create.recipe.fan_washing": "Lavage",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull 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.fans_pull_down": "UNLOCALIZED: Fans pull from Below",
"create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "UNLOCALIZED: Bottomless Supply",
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "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.title": "UNLOCALIZED: No Targets",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 671", "_": "Missing Localizations: 686",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Finestra di acacia", "block.create.acacia_window": "Finestra di acacia",
"block.create.acacia_window_pane": "Pannello di 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_chain_gearshift": "Cambio a catena regolabile",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "Maniglia per valvola gialla", "block.create.yellow_valve_handle": "Maniglia per valvola gialla",
"block.create.zinc_block": "Blocco di zinco", "block.create.zinc_block": "Blocco di zinco",
"block.create.zinc_ore": "Zinco grezzo", "block.create.zinc_ore": "Zinco grezzo",
"entity.create.contraption": "Contrazione", "entity.create.contraption": "Contrazione",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "Sedile", "entity.create.seat": "Sedile",
"entity.create.stationary_contraption": "Contrazione stazionaria", "entity.create.stationary_contraption": "Contrazione stazionaria",
"entity.create.super_glue": "Super colla", "entity.create.super_glue": "Super colla",
"fluid.create.milk": "Latte", "fluid.create.milk": "Latte",
"fluid.create.potion": "Pozione", "fluid.create.potion": "Pozione",
"fluid.create.tea": "Tè del costruttore", "fluid.create.tea": "Tè del costruttore",
"item.create.andesite_alloy": "Lega di andesite", "item.create.andesite_alloy": "Lega di andesite",
"item.create.attribute_filter": "Filtro attributi", "item.create.attribute_filter": "Filtro attributi",
"item.create.bar_of_chocolate": "Barretta di cioccolato", "item.create.bar_of_chocolate": "Barretta di cioccolato",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Pepita di rame", "item.create.copper_nugget": "Pepita di rame",
"item.create.copper_sheet": "Lamiera di rame", "item.create.copper_sheet": "Lamiera di rame",
"item.create.crafter_slot_cover": "Rivestimento per slot da costruzione", "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_aluminum_ore": "Alluminio grezzo frantumato",
"item.create.crushed_brass": "Ottone frantumato", "item.create.crushed_brass": "Ottone frantumato",
"item.create.crushed_copper_ore": "Rame grezzo frantumato", "item.create.crushed_copper_ore": "Rame grezzo frantumato",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create: Blocchi", "itemGroup.create.palettes": "Create: Blocchi",
"death.attack.create.crush": "%1$s è stato frantumato", "death.attack.create.crush": "%1$s è stato frantumato",
"death.attack.create.fan_fire": "%1$s è stato bruciato dall'aria calda", "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.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_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.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", "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.deployer.damage_source_name": "un disadattato",
"create.block.cart_assembler.invalid": "Piazza il tuo assemblatore di carrelli da miniera su un binario", "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.crushing": "Frantumazione",
"create.recipe.milling": "Macinatura", "create.recipe.milling": "Macinatura",
"create.recipe.fan_washing": "Lavaggio volumetrico", "create.recipe.fan_washing": "Lavaggio volumetrico",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "I ventilatori tirano 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.fans_pull_down": "I ventilatori tirano da sotto",
"create.tooltip.chute.contains": "Contiene: %1$s x%2$s", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "Buco senza fondo",
"create.hint.hose_pulley": "Il corpo fluido selezionato è considerato infinito.", "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.title": "Nessun bersaglio",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 35", "_": "Missing Localizations: 50",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "アカシアの窓", "block.create.acacia_window": "アカシアの窓",
"block.create.acacia_window_pane": "アカシアの窓パネル", "block.create.acacia_window_pane": "アカシアの窓パネル",
"block.create.adjustable_chain_gearshift": "可変チェーンギアシフト", "block.create.adjustable_chain_gearshift": "可変チェーンギアシフト",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "黄色のバルブハンドル", "block.create.yellow_valve_handle": "黄色のバルブハンドル",
"block.create.zinc_block": "亜鉛ブロック", "block.create.zinc_block": "亜鉛ブロック",
"block.create.zinc_ore": "亜鉛鉱石", "block.create.zinc_ore": "亜鉛鉱石",
"entity.create.contraption": "からくり", "entity.create.contraption": "からくり",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "ガントリーからくり", "entity.create.gantry_contraption": "ガントリーからくり",
"entity.create.seat": "シート", "entity.create.seat": "シート",
"entity.create.stationary_contraption": "付設からくり", "entity.create.stationary_contraption": "付設からくり",
"entity.create.super_glue": "超粘着剤", "entity.create.super_glue": "超粘着剤",
"fluid.create.milk": "牛乳", "fluid.create.milk": "牛乳",
"fluid.create.potion": "ポーション", "fluid.create.potion": "ポーション",
"fluid.create.tea": "建築家のお茶", "fluid.create.tea": "建築家のお茶",
"item.create.andesite_alloy": "安山岩合金", "item.create.andesite_alloy": "安山岩合金",
"item.create.attribute_filter": "属性フィルター", "item.create.attribute_filter": "属性フィルター",
"item.create.bar_of_chocolate": "チョコレートバー", "item.create.bar_of_chocolate": "チョコレートバー",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "銅塊", "item.create.copper_nugget": "銅塊",
"item.create.copper_sheet": "銅板", "item.create.copper_sheet": "銅板",
"item.create.crafter_slot_cover": "クラフタースロットカバー", "item.create.crafter_slot_cover": "クラフタースロットカバー",
"item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"item.create.crushed_aluminum_ore": "砕いたアルミニウム鉱石", "item.create.crushed_aluminum_ore": "砕いたアルミニウム鉱石",
"item.create.crushed_brass": "砕いた真鍮", "item.create.crushed_brass": "砕いた真鍮",
"item.create.crushed_copper_ore": "砕いた銅鉱石", "item.create.crushed_copper_ore": "砕いた銅鉱石",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create Palettes", "itemGroup.create.palettes": "Create Palettes",
"death.attack.create.crush": "%1$s は破砕ホイールによって処理されました", "death.attack.create.crush": "%1$s は破砕ホイールによって処理されました",
"death.attack.create.fan_fire": "%1$s は熱風で焼死した", "death.attack.create.fan_fire": "%1$s は熱風で焼死した",
"death.attack.create.fan_lava": "%1$s は溶岩ファンによって焼死した", "death.attack.create.fan_lava": "%1$s は溶岩ファンによって焼死した",
"death.attack.create.mechanical_drill": "%1$s はメカニカルドリルに突き刺さった", "death.attack.create.mechanical_drill": "%1$s はメカニカルドリルに突き刺さった",
"death.attack.create.mechanical_saw": "%1$s はメカニカルソーで半分にカットされた", "death.attack.create.mechanical_saw": "%1$s はメカニカルソーで半分にカットされた",
"death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された", "death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された",
"create.block.deployer.damage_source_name": "悪いデプロイヤー", "create.block.deployer.damage_source_name": "悪いデプロイヤー",
"create.block.cart_assembler.invalid": "トロッコアセンブラはレールの上にのみ設置できます", "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.crushing": "粉砕",
"create.recipe.milling": "製粉", "create.recipe.milling": "製粉",
"create.recipe.fan_washing": "一括洗浄", "create.recipe.fan_washing": "一括洗浄",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "ファンが上から吸い込んでいます", "create.tooltip.chute.fans_pull_up": "ファンが上から吸い込んでいます",
"create.tooltip.chute.fans_pull_down": "ファンが下から吸い込んでいます", "create.tooltip.chute.fans_pull_down": "ファンが下から吸い込んでいます",
"create.tooltip.chute.contains": "内容物: %1$s x%2$s", "create.tooltip.chute.contains": "内容物: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "底なし搬出",
"create.hint.hose_pulley": "対象となる液体は無限とみなされています。", "create.hint.hose_pulley": "対象となる液体は無限とみなされています。",
"create.hint.mechanical_arm_no_targets.title": "ターゲットが見つかりません", "create.hint.mechanical_arm_no_targets.title": "ターゲットが見つかりません",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 724", "_": "Missing Localizations: 739",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "아카시아 유리창", "block.create.acacia_window": "아카시아 유리창",
"block.create.acacia_window_pane": "아카시아나무 유리판 ", "block.create.acacia_window_pane": "아카시아나무 유리판 ",
"block.create.adjustable_chain_gearshift": "벨트 변속기", "block.create.adjustable_chain_gearshift": "벨트 변속기",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "노란색 밸브 손잡이", "block.create.yellow_valve_handle": "노란색 밸브 손잡이",
"block.create.zinc_block": "아연 블", "block.create.zinc_block": "아연 블",
"block.create.zinc_ore": "아연 광석", "block.create.zinc_ore": "아연 광석",
"entity.create.contraption": "장치", "entity.create.contraption": "장치",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "좌석", "entity.create.seat": "좌석",
"entity.create.stationary_contraption": "고정된 장치", "entity.create.stationary_contraption": "고정된 장치",
"entity.create.super_glue": "강력 접착제", "entity.create.super_glue": "강력 접착제",
"fluid.create.milk": "우유", "fluid.create.milk": "우유",
"fluid.create.potion": "포션", "fluid.create.potion": "포션",
"fluid.create.tea": "건축가의 차", "fluid.create.tea": "건축가의 차",
"item.create.andesite_alloy": "안산암 합금", "item.create.andesite_alloy": "안산암 합금",
"item.create.attribute_filter": "속성 필터 틀", "item.create.attribute_filter": "속성 필터 틀",
"item.create.bar_of_chocolate": "초콜릿 바", "item.create.bar_of_chocolate": "초콜릿 바",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "구리 조각", "item.create.copper_nugget": "구리 조각",
"item.create.copper_sheet": "구리 판", "item.create.copper_sheet": "구리 판",
"item.create.crafter_slot_cover": "조합기 슬롯 덮개", "item.create.crafter_slot_cover": "조합기 슬롯 덮개",
"item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore",
"item.create.crushed_brass": "분쇄된 황동", "item.create.crushed_brass": "분쇄된 황동",
"item.create.crushed_copper_ore": "분쇄된 구리 광석", "item.create.crushed_copper_ore": "분쇄된 구리 광석",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create 팔레트", "itemGroup.create.palettes": "Create 팔레트",
"death.attack.create.crush": "%1$s이(가) 분쇄 휠에 의해 가공되었습니다", "death.attack.create.crush": "%1$s이(가) 분쇄 휠에 의해 가공되었습니다",
"death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 의해 익어버렸습니다", "death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 의해 익어버렸습니다",
"death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 구워졌습니다", "death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 구워졌습니다",
"death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다", "death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다",
"death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다", "death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다",
"death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", "death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다",
"create.block.deployer.damage_source_name": "배포기", "create.block.deployer.damage_source_name": "배포기",
"create.block.cart_assembler.invalid": "카트조립기를 레일 위에 설치하세요", "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.crushing": "분쇄",
"create.recipe.milling": "맷돌질", "create.recipe.milling": "맷돌질",
"create.recipe.fan_washing": "세척", "create.recipe.fan_washing": "세척",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "선풍기가 위에서 당김", "create.tooltip.chute.fans_pull_up": "선풍기가 위에서 당김",
"create.tooltip.chute.fans_pull_down": "선풍기가 아래에서 당김", "create.tooltip.chute.fans_pull_down": "선풍기가 아래에서 당김",
"create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "UNLOCALIZED: Bottomless Supply",
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "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.title": "목표 없음",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 1588", "_": "Missing Localizations: 1603",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "UNLOCALIZED: Acacia Window", "block.create.acacia_window": "UNLOCALIZED: Acacia Window",
"block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane",
"block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle",
"block.create.zinc_block": "UNLOCALIZED: Block of Zinc", "block.create.zinc_block": "UNLOCALIZED: Block of Zinc",
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
"entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.contraption": "UNLOCALIZED: Contraption",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "UNLOCALIZED: Seat", "entity.create.seat": "UNLOCALIZED: Seat",
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
"entity.create.super_glue": "UNLOCALIZED: Super Glue", "entity.create.super_glue": "UNLOCALIZED: Super Glue",
"fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.milk": "UNLOCALIZED: Milk",
"fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.potion": "UNLOCALIZED: Potion",
"fluid.create.tea": "UNLOCALIZED: Builder's Tea", "fluid.create.tea": "UNLOCALIZED: Builder's Tea",
"item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy",
"item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter",
"item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate", "item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Koper klompje", "item.create.copper_nugget": "Koper klompje",
"item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet",
"item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", "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_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore",
"item.create.crushed_brass": "Gemalen Brons", "item.create.crushed_brass": "Gemalen Brons",
"item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore",
@ -662,17 +659,20 @@
"itemGroup.create.base": "UNLOCALIZED: Create", "itemGroup.create.base": "UNLOCALIZED: Create",
"itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes",
"death.attack.create.crush": "%1$s is verwerkd door verpulverende wielen", "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_fire": "%1$s is verbrand door hete lucht",
"death.attack.create.fan_lava": "%1$s is verbrand door een lava ventilator", "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_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.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "death.attack.create.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.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer",
"create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", "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.crushing": "Verpulveren",
"create.recipe.milling": "UNLOCALIZED: Milling", "create.recipe.milling": "UNLOCALIZED: Milling",
"create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull 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.fans_pull_down": "UNLOCALIZED: Fans pull from Below",
"create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "UNLOCALIZED: Bottomless Supply",
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "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.title": "UNLOCALIZED: No Targets",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 11", "_": "Missing Localizations: 26",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Akacjowe okno", "block.create.acacia_window": "Akacjowe okno",
"block.create.acacia_window_pane": "Akacjowa szyba okienna", "block.create.acacia_window_pane": "Akacjowa szyba okienna",
"block.create.adjustable_chain_gearshift": "Regulowany przekładnik łańcuchowy", "block.create.adjustable_chain_gearshift": "Regulowany przekładnik łańcuchowy",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "Żółte pokrętło", "block.create.yellow_valve_handle": "Żółte pokrętło",
"block.create.zinc_block": "Blok cynku", "block.create.zinc_block": "Blok cynku",
"block.create.zinc_ore": "Ruda cynku", "block.create.zinc_ore": "Ruda cynku",
"entity.create.contraption": "Maszyna", "entity.create.contraption": "Maszyna",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "Maszyna suwnicowa", "entity.create.gantry_contraption": "Maszyna suwnicowa",
"entity.create.seat": "Siedzenie", "entity.create.seat": "Siedzenie",
"entity.create.stationary_contraption": "Maszyna stacjonarna", "entity.create.stationary_contraption": "Maszyna stacjonarna",
"entity.create.super_glue": "Super Glue", "entity.create.super_glue": "Super Glue",
"fluid.create.milk": "Mleko", "fluid.create.milk": "Mleko",
"fluid.create.potion": "Mikstura", "fluid.create.potion": "Mikstura",
"fluid.create.tea": "Herbatka Budowniczego", "fluid.create.tea": "Herbatka Budowniczego",
"item.create.andesite_alloy": "Stop andezytu", "item.create.andesite_alloy": "Stop andezytu",
"item.create.attribute_filter": "Filtr atrybutowy", "item.create.attribute_filter": "Filtr atrybutowy",
"item.create.bar_of_chocolate": "Tabliczka czekolady", "item.create.bar_of_chocolate": "Tabliczka czekolady",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Bryłka miedzi", "item.create.copper_nugget": "Bryłka miedzi",
"item.create.copper_sheet": "Arkusz miedzi", "item.create.copper_sheet": "Arkusz miedzi",
"item.create.crafter_slot_cover": "Przykrywka na slot stołu rzemieślniczego", "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_aluminum_ore": "Rozkruszona ruda żelaza",
"item.create.crushed_brass": "Rozkruszony mosiądz", "item.create.crushed_brass": "Rozkruszony mosiądz",
"item.create.crushed_copper_ore": "Rozkruszona ruda miedzi", "item.create.crushed_copper_ore": "Rozkruszona ruda miedzi",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create", "itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Palety Create", "itemGroup.create.palettes": "Palety Create",
"death.attack.create.crush": "Gracz %1$s został zgnieciony przez koło kruszące", "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_fire": "Gracz %1$s poparzył się gorącym powietrzem",
"death.attack.create.fan_lava": "Gracz %1$s poparzył się kroplami lawy", "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_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.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ą", "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.deployer.damage_source_name": "zbuntowany aplikator",
"create.block.cart_assembler.invalid": "Postaw monter wagoników na torze", "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.crushing": "Kruszenie",
"create.recipe.milling": "Mielenie", "create.recipe.milling": "Mielenie",
"create.recipe.fan_washing": "Hurtowe płukanie", "create.recipe.fan_washing": "Hurtowe płukanie",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "Wiatraki ciągną 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.fans_pull_down": "Wiatraki ciągną od dołu",
"create.tooltip.chute.contains": "Zawiera: %1$s x%2$s", "create.tooltip.chute.contains": "Zawiera: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "Niewyczerpany zapas",
"create.hint.hose_pulley": "Wybrane zbiornik cieczy jest uznany za nieskończony", "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.title": "Brak celi",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 1640", "_": "Missing Localizations: 1655",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "UNLOCALIZED: Acacia Window", "block.create.acacia_window": "UNLOCALIZED: Acacia Window",
"block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane",
"block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle",
"block.create.zinc_block": "UNLOCALIZED: Block of Zinc", "block.create.zinc_block": "UNLOCALIZED: Block of Zinc",
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
"entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.contraption": "UNLOCALIZED: Contraption",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "UNLOCALIZED: Seat", "entity.create.seat": "UNLOCALIZED: Seat",
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
"entity.create.super_glue": "UNLOCALIZED: Super Glue", "entity.create.super_glue": "UNLOCALIZED: Super Glue",
"fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.milk": "UNLOCALIZED: Milk",
"fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.potion": "UNLOCALIZED: Potion",
"fluid.create.tea": "UNLOCALIZED: Builder's Tea", "fluid.create.tea": "UNLOCALIZED: Builder's Tea",
"item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy",
"item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter",
"item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate", "item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget",
"item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet",
"item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", "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_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore",
"item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass",
"item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore",
@ -662,17 +659,20 @@
"itemGroup.create.base": "UNLOCALIZED: Create", "itemGroup.create.base": "UNLOCALIZED: Create",
"itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes",
"death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer", "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_fire": "%1$s foi queimado por ar quente",
"death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava", "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_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.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "death.attack.create.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.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer",
"create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", "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.crushing": "Moendo",
"create.recipe.milling": "UNLOCALIZED: Milling", "create.recipe.milling": "UNLOCALIZED: Milling",
"create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull 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.fans_pull_down": "UNLOCALIZED: Fans pull from Below",
"create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "UNLOCALIZED: Bottomless Supply",
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "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.title": "UNLOCALIZED: No Targets",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 568", "_": "Missing Localizations: 583",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Акациевое окно", "block.create.acacia_window": "Акациевое окно",
"block.create.acacia_window_pane": "Панель из акациевого окна", "block.create.acacia_window_pane": "Панель из акациевого окна",
"block.create.adjustable_chain_gearshift": "Регулируемый цепной механизм", "block.create.adjustable_chain_gearshift": "Регулируемый цепной механизм",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "Жёлтый ручной вентиль", "block.create.yellow_valve_handle": "Жёлтый ручной вентиль",
"block.create.zinc_block": "Цинковый блок", "block.create.zinc_block": "Цинковый блок",
"block.create.zinc_ore": "Цинковая руда", "block.create.zinc_ore": "Цинковая руда",
"entity.create.contraption": "Штуковина", "entity.create.contraption": "Штуковина",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "Сиденье", "entity.create.seat": "Сиденье",
"entity.create.stationary_contraption": "Стационарная штуковина", "entity.create.stationary_contraption": "Стационарная штуковина",
"entity.create.super_glue": "Супер-клей", "entity.create.super_glue": "Супер-клей",
"fluid.create.milk": "Молоко", "fluid.create.milk": "Молоко",
"fluid.create.potion": "Зелье", "fluid.create.potion": "Зелье",
"fluid.create.tea": "Чай Строителя", "fluid.create.tea": "Чай Строителя",
"item.create.andesite_alloy": "Андезитовый сплав", "item.create.andesite_alloy": "Андезитовый сплав",
"item.create.attribute_filter": "Фильтр атрибутов", "item.create.attribute_filter": "Фильтр атрибутов",
"item.create.bar_of_chocolate": "Плитка шоколада", "item.create.bar_of_chocolate": "Плитка шоколада",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "Кусочек меди", "item.create.copper_nugget": "Кусочек меди",
"item.create.copper_sheet": "Медный лист", "item.create.copper_sheet": "Медный лист",
"item.create.crafter_slot_cover": "Крышка на слот крафтера", "item.create.crafter_slot_cover": "Крышка на слот крафтера",
"item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда", "item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда",
"item.create.crushed_brass": "Дроблёная латунь", "item.create.crushed_brass": "Дроблёная латунь",
"item.create.crushed_copper_ore": "Дроблёная медная руда", "item.create.crushed_copper_ore": "Дроблёная медная руда",
@ -662,17 +659,20 @@
"itemGroup.create.base": "Create: Механизмы", "itemGroup.create.base": "Create: Механизмы",
"itemGroup.create.palettes": "Create: Декор", "itemGroup.create.palettes": "Create: Декор",
"death.attack.create.crush": "%1$s был передроблен", "death.attack.create.crush": "%1$s был передроблен",
"death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом",
"death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы",
"death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели",
"death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой", "death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой",
"death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой", "death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой",
"create.block.deployer.damage_source_name": "автономным активатором", "create.block.deployer.damage_source_name": "автономным активатором",
"create.block.cart_assembler.invalid": "Поместите сборщик вагонеток на блок рельс", "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.crushing": "Измельчение",
"create.recipe.milling": "Помол", "create.recipe.milling": "Помол",
"create.recipe.fan_washing": "Массовая промывка", "create.recipe.fan_washing": "Массовая промывка",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху", "create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху",
"create.tooltip.chute.fans_pull_down": "Вентилятор тянет снизу", "create.tooltip.chute.fans_pull_down": "Вентилятор тянет снизу",
"create.tooltip.chute.contains": "Содержит: %1$s x%2$s", "create.tooltip.chute.contains": "Содержит: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "Безграничное снабжение",
"create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.", "create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.",
"create.hint.mechanical_arm_no_targets.title": "Нет целей", "create.hint.mechanical_arm_no_targets.title": "Нет целей",
@ -1599,20 +1604,17 @@
"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_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_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.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.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_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_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_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.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_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_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_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_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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", "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_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_2": "UNLOCALIZED: Using the Wrench, a window can be created",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 54", "_": "Missing Localizations: 69",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "金合欢窗户", "block.create.acacia_window": "金合欢窗户",
"block.create.acacia_window_pane": "金合欢窗户板", "block.create.acacia_window_pane": "金合欢窗户板",
"block.create.adjustable_chain_gearshift": "可调节链式传动箱", "block.create.adjustable_chain_gearshift": "可调节链式传动箱",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "黄色阀门手轮", "block.create.yellow_valve_handle": "黄色阀门手轮",
"block.create.zinc_block": "锌块", "block.create.zinc_block": "锌块",
"block.create.zinc_ore": "锌矿石", "block.create.zinc_ore": "锌矿石",
"entity.create.contraption": "装置", "entity.create.contraption": "装置",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "起重机装置", "entity.create.gantry_contraption": "起重机装置",
"entity.create.seat": "坐垫", "entity.create.seat": "坐垫",
"entity.create.stationary_contraption": "固定装置", "entity.create.stationary_contraption": "固定装置",
"entity.create.super_glue": "强力胶", "entity.create.super_glue": "强力胶",
"fluid.create.milk": "牛奶", "fluid.create.milk": "牛奶",
"fluid.create.potion": "药水", "fluid.create.potion": "药水",
"fluid.create.tea": "茶", "fluid.create.tea": "茶",
"item.create.andesite_alloy": "安山合金", "item.create.andesite_alloy": "安山合金",
"item.create.attribute_filter": "属性过滤器", "item.create.attribute_filter": "属性过滤器",
"item.create.bar_of_chocolate": "巧克力棒", "item.create.bar_of_chocolate": "巧克力棒",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "铜粒", "item.create.copper_nugget": "铜粒",
"item.create.copper_sheet": "铜板", "item.create.copper_sheet": "铜板",
"item.create.crafter_slot_cover": "合成器盖板", "item.create.crafter_slot_cover": "合成器盖板",
"item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"item.create.crushed_aluminum_ore": "粉碎铝矿石", "item.create.crushed_aluminum_ore": "粉碎铝矿石",
"item.create.crushed_brass": "粉碎黄铜", "item.create.crushed_brass": "粉碎黄铜",
"item.create.crushed_copper_ore": "粉碎铜矿石", "item.create.crushed_copper_ore": "粉碎铜矿石",
@ -662,17 +659,20 @@
"itemGroup.create.base": "机械动力", "itemGroup.create.base": "机械动力",
"itemGroup.create.palettes": "机械动力建筑方块", "itemGroup.create.palettes": "机械动力建筑方块",
"death.attack.create.crush": "%1$s被压扁了", "death.attack.create.crush": "%1$s被压扁了",
"death.attack.create.fan_fire": "%1$s试图接受热风的洗礼", "death.attack.create.fan_fire": "%1$s试图接受热风的洗礼",
"death.attack.create.fan_lava": "%1$s在接受热风的洗礼中浴火焚身", "death.attack.create.fan_lava": "%1$s在接受热风的洗礼中浴火焚身",
"death.attack.create.mechanical_drill": "%1$s被钻头钻的坏掉了", "death.attack.create.mechanical_drill": "%1$s被钻头钻的坏掉了",
"death.attack.create.mechanical_saw": "%1$s被圆锯切成了两截", "death.attack.create.mechanical_saw": "%1$s被圆锯切成了两截",
"death.attack.create.cuckoo_clock_explosion": "%1$s被布谷鸟钟炸得粉身碎骨", "death.attack.create.cuckoo_clock_explosion": "%1$s被布谷鸟钟炸得粉身碎骨",
"create.block.deployer.damage_source_name": "二五仔机械手", "create.block.deployer.damage_source_name": "二五仔机械手",
"create.block.cart_assembler.invalid": "请将矿车装配器放置在铁轨上", "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.crushing": "粉碎",
"create.recipe.milling": "研磨", "create.recipe.milling": "研磨",
"create.recipe.fan_washing": "批量洗涤", "create.recipe.fan_washing": "批量洗涤",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "鼓风机从上方进行吸引", "create.tooltip.chute.fans_pull_up": "鼓风机从上方进行吸引",
"create.tooltip.chute.fans_pull_down": "鼓风机从下方进行吸引", "create.tooltip.chute.fans_pull_down": "鼓风机从下方进行吸引",
"create.tooltip.chute.contains": "内含物品:%1$s x%2$s", "create.tooltip.chute.contains": "内含物品:%1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "无限供应",
"create.hint.hose_pulley": "目标液体对象被视为无限量的。", "create.hint.hose_pulley": "目标液体对象被视为无限量的。",
"create.hint.mechanical_arm_no_targets.title": "没有目标", "create.hint.mechanical_arm_no_targets.title": "没有目标",

View file

@ -1,8 +1,6 @@
{ {
"_": "Missing Localizations: 47", "_": "Missing Localizations: 62",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "相思木窗戶", "block.create.acacia_window": "相思木窗戶",
"block.create.acacia_window_pane": "相思木窗戶片", "block.create.acacia_window_pane": "相思木窗戶片",
"block.create.adjustable_chain_gearshift": "可調式鏈式變速箱", "block.create.adjustable_chain_gearshift": "可調式鏈式變速箱",
@ -412,17 +410,15 @@
"block.create.yellow_valve_handle": "黃色閥門開關", "block.create.yellow_valve_handle": "黃色閥門開關",
"block.create.zinc_block": "鋅磚", "block.create.zinc_block": "鋅磚",
"block.create.zinc_ore": "鋅礦石", "block.create.zinc_ore": "鋅礦石",
"entity.create.contraption": "結構", "entity.create.contraption": "結構",
"entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"entity.create.gantry_contraption": "門式結構", "entity.create.gantry_contraption": "門式結構",
"entity.create.seat": "坐墊", "entity.create.seat": "坐墊",
"entity.create.stationary_contraption": "固定結構", "entity.create.stationary_contraption": "固定結構",
"entity.create.super_glue": "強力膠", "entity.create.super_glue": "強力膠",
"fluid.create.milk": "牛奶", "fluid.create.milk": "牛奶",
"fluid.create.potion": "藥水", "fluid.create.potion": "藥水",
"fluid.create.tea": "茶", "fluid.create.tea": "茶",
"item.create.andesite_alloy": "安山合金", "item.create.andesite_alloy": "安山合金",
"item.create.attribute_filter": "屬性過濾器", "item.create.attribute_filter": "屬性過濾器",
"item.create.bar_of_chocolate": "巧克力棒", "item.create.bar_of_chocolate": "巧克力棒",
@ -444,6 +440,7 @@
"item.create.copper_nugget": "銅粒", "item.create.copper_nugget": "銅粒",
"item.create.copper_sheet": "銅板", "item.create.copper_sheet": "銅板",
"item.create.crafter_slot_cover": "合成器蓋板", "item.create.crafter_slot_cover": "合成器蓋板",
"item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
"item.create.crushed_aluminum_ore": "碎狀鋁礦石", "item.create.crushed_aluminum_ore": "碎狀鋁礦石",
"item.create.crushed_brass": "碎狀黃銅", "item.create.crushed_brass": "碎狀黃銅",
"item.create.crushed_copper_ore": "碎狀銅礦石", "item.create.crushed_copper_ore": "碎狀銅礦石",
@ -662,17 +659,20 @@
"itemGroup.create.base": "動力機械", "itemGroup.create.base": "動力機械",
"itemGroup.create.palettes": "動力機械建築與裝飾方塊", "itemGroup.create.palettes": "動力機械建築與裝飾方塊",
"death.attack.create.crush": "%1$s被壓扁了", "death.attack.create.crush": "%1$s被壓扁了",
"death.attack.create.fan_fire": "%1$s想接受熱風的洗禮", "death.attack.create.fan_fire": "%1$s想接受熱風的洗禮",
"death.attack.create.fan_lava": "%1$s想接受熱風的洗禮但走火入魔", "death.attack.create.fan_lava": "%1$s想接受熱風的洗禮但走火入魔",
"death.attack.create.mechanical_drill": "%1$s被鑽頭鑽爆腦袋", "death.attack.create.mechanical_drill": "%1$s被鑽頭鑽爆腦袋",
"death.attack.create.mechanical_saw": "%1$s被鋸切成了兩半", "death.attack.create.mechanical_saw": "%1$s被鋸切成了兩半",
"death.attack.create.cuckoo_clock_explosion": "%1$s 被布穀鳥鐘炸得粉身碎骨", "death.attack.create.cuckoo_clock_explosion": "%1$s 被布穀鳥鐘炸得粉身碎骨",
"create.block.deployer.damage_source_name": "機械手", "create.block.deployer.damage_source_name": "機械手",
"create.block.cart_assembler.invalid": "將您的礦車裝修站放在鐵軌上", "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.crushing": "粉碎",
"create.recipe.milling": "研磨", "create.recipe.milling": "研磨",
"create.recipe.fan_washing": "批次洗滌", "create.recipe.fan_washing": "批次洗滌",
@ -1105,13 +1105,18 @@
"create.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引", "create.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引",
"create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引", "create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引",
"create.tooltip.chute.contains": "物品: %1$s x%2$s", "create.tooltip.chute.contains": "物品: %1$s x%2$s",
"create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.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.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.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_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1",
"create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", "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.title": "無限供應",
"create.hint.hose_pulley": "目標液體為無限供應", "create.hint.hose_pulley": "目標液體為無限供應",
"create.hint.mechanical_arm_no_targets.title": "沒有目標", "create.hint.mechanical_arm_no_targets.title": "沒有目標",

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "create:item/crafting_blueprint"
}
}

View file

@ -71,7 +71,7 @@ public class InstancedRenderDispatcher {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
ClientWorld world = mc.world; ClientWorld world = mc.world;
Entity renderViewEntity = mc.renderViewEntity; Entity renderViewEntity = mc.renderViewEntity != null ? mc.renderViewEntity : mc.player;
if (renderViewEntity == null) return; if (renderViewEntity == null) return;

View file

@ -102,11 +102,13 @@ public class AllBlockPartials {
COPPER_BACKTANK_SHAFT = get("copper_backtank/block_shaft_input"), COPPER_BACKTANK_SHAFT = get("copper_backtank/block_shaft_input"),
COPPER_BACKTANK_COGS = get("copper_backtank/block_cogs"), COPPER_BACKTANK_COGS = get("copper_backtank/block_cogs"),
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_ATTACHMENT = getEntity("minecart_coupling/attachment"),
COUPLING_RING = getEntity("minecart_coupling/ring"), COUPLING_RING = getEntity("minecart_coupling/ring"),
COUPLING_CONNECTOR = getEntity("minecart_coupling/connector") COUPLING_CONNECTOR = getEntity("minecart_coupling/connector");
;
public static final Map<FluidTransportBehaviour.AttachmentTypes, Map<Direction, PartialModel>> PIPE_ATTACHMENTS = new HashMap<>(); public static final Map<FluidTransportBehaviour.AttachmentTypes, Map<Direction, PartialModel>> PIPE_ATTACHMENTS = new HashMap<>();
public static final Map<BlazeBurnerBlock.HeatLevel, PartialModel> BLAZES = new HashMap<>(); public static final Map<BlazeBurnerBlock.HeatLevel, PartialModel> BLAZES = new HashMap<>();

View file

@ -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.logistics.block.redstone.StockpileSwitchBlock;
import com.simibubi.create.content.schematics.block.SchematicTableBlock; import com.simibubi.create.content.schematics.block.SchematicTableBlock;
import com.simibubi.create.content.schematics.block.SchematicannonBlock; 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.block.ItemUseOverrides;
import com.simibubi.create.foundation.config.StressConfigDefaults; import com.simibubi.create.foundation.config.StressConfigDefaults;
import com.simibubi.create.foundation.data.AssetLookup; 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.ModelGen;
import com.simibubi.create.foundation.data.SharedProperties; import com.simibubi.create.foundation.data.SharedProperties;
import com.simibubi.create.foundation.item.TooltipHelper; 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.utility.DyeHelper;
import com.simibubi.create.foundation.worldgen.OxidizingBlock; import com.simibubi.create.foundation.worldgen.OxidizingBlock;
import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.providers.RegistrateRecipeProvider;
@ -626,12 +628,9 @@ public class AllBlocks {
.transform(BuilderTransformers.valveHandle(null)) .transform(BuilderTransformers.valveHandle(null))
.register(); .register();
public static final BlockEntry<?>[] DYED_VALVE_HANDLES = new BlockEntry<?>[DyeColor.values().length]; public static final DyedBlockList<ValveHandleBlock> DYED_VALVE_HANDLES = new DyedBlockList<>(colour -> {
static {
for (DyeColor colour : DyeColor.values()) {
String colourName = colour.getString(); String colourName = colour.getString();
DYED_VALVE_HANDLES[colour.ordinal()] = REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed) return REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed)
.transform(BuilderTransformers.valveHandle(colour)) .transform(BuilderTransformers.valveHandle(colour))
.recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get()) .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get())
.patternLine("#") .patternLine("#")
@ -641,8 +640,7 @@ public class AllBlocks {
.addCriterion("has_valve", RegistrateRecipeProvider.hasItem(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"))) .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle")))
.register(); .register();
} });
}
public static final BlockEntry<FluidTankBlock> FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular) public static final BlockEntry<FluidTankBlock> FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular)
.initialProperties(SharedProperties::softMetal) .initialProperties(SharedProperties::softMetal)
@ -842,7 +840,7 @@ public class AllBlocks {
.initialProperties(() -> Blocks.POWERED_RAIL) .initialProperties(() -> Blocks.POWERED_RAIL)
.blockstate(new ControllerRailGenerator()::generate) .blockstate(new ControllerRailGenerator()::generate)
.addLayer(() -> RenderType::getCutoutMipped) .addLayer(() -> RenderType::getCutoutMipped)
.onRegister(CreateRegistrate.blockColors(() -> AllColorHandlers::getRedstonePower)) .color(() -> ColorHandlers::getRedstonePower)
.tag(BlockTags.RAILS) .tag(BlockTags.RAILS)
.item() .item()
.model((c, p) -> p.generated(c, Create.asResource("block/" + c.getName()))) .model((c, p) -> p.generated(c, Create.asResource("block/" + c.getName())))
@ -961,15 +959,10 @@ public class AllBlocks {
.simpleItem() .simpleItem()
.register(); .register();
public static final BlockEntry<?>[] SEATS = new BlockEntry<?>[DyeColor.values().length]; public static final DyedBlockList<SeatBlock> SEATS = new DyedBlockList<>(colour -> {
static {
// SEATS
for (DyeColor colour : DyeColor.values()) {
String colourName = colour.getString(); String colourName = colour.getString();
SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour();
SEATS[colour.ordinal()] = return REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED))
REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED))
.initialProperties(SharedProperties::wooden) .initialProperties(SharedProperties::wooden)
.onRegister(addMovementBehaviour(movementBehaviour)) .onRegister(addMovementBehaviour(movementBehaviour))
.blockstate((c, p) -> { .blockstate((c, p) -> {
@ -1000,8 +993,7 @@ public class AllBlocks {
.tag(AllItemTags.SEATS.tag) .tag(AllItemTags.SEATS.tag)
.build() .build()
.register(); .register();
} });
}
public static final BlockEntry<SailBlock> SAIL_FRAME = REGISTRATE.block("sail_frame", p -> SailBlock.frame(p)) public static final BlockEntry<SailBlock> SAIL_FRAME = REGISTRATE.block("sail_frame", p -> SailBlock.frame(p))
.initialProperties(SharedProperties::wooden) .initialProperties(SharedProperties::wooden)
@ -1012,8 +1004,6 @@ public class AllBlocks {
.simpleItem() .simpleItem()
.register(); .register();
public static final BlockEntry<?>[] DYED_SAILS = new BlockEntry<?>[DyeColor.values().length];
public static final BlockEntry<SailBlock> SAIL = REGISTRATE.block("white_sail", p -> SailBlock.withCanvas(p)) public static final BlockEntry<SailBlock> SAIL = REGISTRATE.block("white_sail", p -> SailBlock.withCanvas(p))
.initialProperties(SharedProperties::wooden) .initialProperties(SharedProperties::wooden)
.properties(Block.Properties::nonOpaque) .properties(Block.Properties::nonOpaque)
@ -1022,15 +1012,12 @@ public class AllBlocks {
.simpleItem() .simpleItem()
.register(); .register();
static { public static final DyedBlockList<SailBlock> DYED_SAILS = new DyedBlockList<>(colour -> {
// DYED SAILS
for (DyeColor colour : DyeColor.values()) {
if (colour == DyeColor.WHITE) { if (colour == DyeColor.WHITE) {
DYED_SAILS[colour.ordinal()] = SAIL; return SAIL;
continue;
} }
String colourName = colour.getString(); String colourName = colour.getString();
DYED_SAILS[colour.ordinal()] = REGISTRATE.block(colourName + "_sail", p -> SailBlock.withCanvas(p)) return REGISTRATE.block(colourName + "_sail", p -> SailBlock.withCanvas(p))
.properties(Block.Properties::nonOpaque) .properties(Block.Properties::nonOpaque)
.initialProperties(SharedProperties::wooden) .initialProperties(SharedProperties::wooden)
.blockstate((c, p) -> p.directionalBlock(c.get(), p.models() .blockstate((c, p) -> p.directionalBlock(c.get(), p.models()
@ -1040,8 +1027,7 @@ public class AllBlocks {
.tag(AllBlockTags.SAILS.tag) .tag(AllBlockTags.SAILS.tag)
.loot((p, b) -> p.registerDropping(b, SAIL.get())) .loot((p, b) -> p.registerDropping(b, SAIL.get()))
.register(); .register();
} });
}
public static final BlockEntry<CasingBlock> ANDESITE_CASING = REGISTRATE.block("andesite_casing", CasingBlock::new) public static final BlockEntry<CasingBlock> ANDESITE_CASING = REGISTRATE.block("andesite_casing", CasingBlock::new)
.transform(BuilderTransformers.casing(AllSpriteShifts.ANDESITE_CASING)) .transform(BuilderTransformers.casing(AllSpriteShifts.ANDESITE_CASING))

View file

@ -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<Block, IBlockColor> coloredBlocks = new HashMap<>();
private final Map<IItemProvider, IItemColor> 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));
}
}

View file

@ -1,5 +1,7 @@
package com.simibubi.create; 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.AdjustableCrateContainer;
import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen;
import com.simibubi.create.content.logistics.item.LinkedControllerContainer; import com.simibubi.create.content.logistics.item.LinkedControllerContainer;
@ -38,6 +40,9 @@ public class AllContainerTypes {
public static final ContainerEntry<AttributeFilterContainer> ATTRIBUTE_FILTER = public static final ContainerEntry<AttributeFilterContainer> ATTRIBUTE_FILTER =
register("attribute_filter", AttributeFilterContainer::new, () -> AttributeFilterScreen::new); register("attribute_filter", AttributeFilterContainer::new, () -> AttributeFilterScreen::new);
public static final ContainerEntry<BlueprintContainer> CRAFTING_BLUEPRINT =
register("crafting_blueprint", BlueprintContainer::new, () -> BlueprintScreen::new);
public static final ContainerEntry<LinkedControllerContainer> LINKED_CONTROLLER = public static final ContainerEntry<LinkedControllerContainer> LINKED_CONTROLLER =
register("linked_controller", LinkedControllerContainer::new, () -> LinkedControllerScreen::new); register("linked_controller", LinkedControllerContainer::new, () -> LinkedControllerScreen::new);
@ -45,6 +50,7 @@ public class AllContainerTypes {
return Create.registrate().container(name, factory, screenFactory).register(); return Create.registrate().container(name, factory, screenFactory).register();
} }
public static void register() {} public static void register() {
}
} }

View file

@ -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.gantry.GantryContraptionEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; 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.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.simibubi.create.foundation.utility.Lang;
import com.tterrag.registrate.util.entry.EntityEntry; import com.tterrag.registrate.util.entry.EntityEntry;
import com.tterrag.registrate.util.nullness.NonNullConsumer; import com.tterrag.registrate.util.nullness.NonNullConsumer;
@ -35,6 +37,11 @@ public class AllEntityTypes {
public static final EntityEntry<SuperGlueEntity> SUPER_GLUE = public static final EntityEntry<SuperGlueEntity> SUPER_GLUE =
register("super_glue", SuperGlueEntity::new, () -> SuperGlueRenderer::new, register("super_glue", SuperGlueEntity::new, () -> SuperGlueRenderer::new,
EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, SuperGlueEntity::build); EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, SuperGlueEntity::build);
public static final EntityEntry<BlueprintEntity> CRAFTING_BLUEPRINT =
register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new,
EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, BlueprintEntity::build);
public static final EntityEntry<SeatEntity> SEAT = public static final EntityEntry<SeatEntity> SEAT =
register("seat", SeatEntity::new, () -> SeatEntity.Render::new, register("seat", SeatEntity::new, () -> SeatEntity.Render::new,
EntityClassification.MISC, 0, Integer.MAX_VALUE, false, true, SeatEntity::build); EntityClassification.MISC, 0, Integer.MAX_VALUE, false, true, SeatEntity::build);

View file

@ -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.armor.DivingHelmetItem;
import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem; import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem;
import com.simibubi.create.content.curiosities.symmetry.client.SymmetryWandModel; 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.ExtendoGripItem;
import com.simibubi.create.content.curiosities.tools.ExtendoGripModel; import com.simibubi.create.content.curiosities.tools.ExtendoGripModel;
import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.content.curiosities.tools.SandPaperItem;
@ -128,7 +129,7 @@ public class AllItems {
REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new) REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new)
.properties(p -> p.rarity(Rarity.UNCOMMON)) .properties(p -> p.rarity(Rarity.UNCOMMON))
.model(AssetLookup.existingItemModel()) .model(AssetLookup.existingItemModel())
.onRegister(CreateRegistrate.itemColors(() -> ChromaticCompoundColor::new)) .color(() -> ChromaticCompoundColor::new)
.register(); .register();
public static final ItemEntry<ShadowSteelItem> SHADOW_STEEL = REGISTRATE.item("shadow_steel", ShadowSteelItem::new) public static final ItemEntry<ShadowSteelItem> SHADOW_STEEL = REGISTRATE.item("shadow_steel", ShadowSteelItem::new)
@ -197,6 +198,10 @@ public class AllItems {
REGISTRATE.item("minecart_coupling", MinecartCouplingItem::new) REGISTRATE.item("minecart_coupling", MinecartCouplingItem::new)
.register(); .register();
public static final ItemEntry<BlueprintItem> CRAFTING_BLUEPRINT =
REGISTRATE.item("crafting_blueprint", BlueprintItem::new)
.register();
public static final ItemEntry<SandPaperItem> SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) public static final ItemEntry<SandPaperItem> SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new)
.transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new))
.register(); .register();

View file

@ -250,7 +250,7 @@ public class AllTileEntities {
.tileEntity("hand_crank", HandCrankTileEntity::new) .tileEntity("hand_crank", HandCrankTileEntity::new)
.instance(() -> HandCrankInstance::new) .instance(() -> HandCrankInstance::new)
.validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE) .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE)
.validBlocks(AllBlocks.DYED_VALVE_HANDLES) .validBlocks(AllBlocks.DYED_VALVE_HANDLES.toArray())
.renderer(() -> HandCrankRenderer::new) .renderer(() -> HandCrankRenderer::new)
.register(); .register();

View file

@ -54,7 +54,7 @@ public class Create {
public static final String ID = "create"; public static final String ID = "create";
public static final String NAME = "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(); public static final Logger LOGGER = LogManager.getLogger();

View file

@ -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.block.render.SpriteShifter;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.render.CustomItemModels;
import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.item.render.CustomRenderedItems;
import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.SuperByteBufferCache;
@ -66,12 +66,10 @@ public class CreateClient {
private static CustomBlockModels customBlockModels; private static CustomBlockModels customBlockModels;
private static CustomItemModels customItemModels; private static CustomItemModels customItemModels;
private static CustomRenderedItems customRenderedItems; private static CustomRenderedItems customRenderedItems;
private static AllColorHandlers colorHandlers;
private static CasingConnectivity casingConnectivity; private static CasingConnectivity casingConnectivity;
public static void addClientListeners(IEventBus modEventBus) { public static void addClientListeners(IEventBus modEventBus) {
modEventBus.addListener(CreateClient::clientInit); modEventBus.addListener(CreateClient::clientInit);
modEventBus.register(getColorHandler());
modEventBus.addListener(CreateClient::onTextureStitch); modEventBus.addListener(CreateClient::onTextureStitch);
modEventBus.addListener(CreateClient::onModelRegistry); modEventBus.addListener(CreateClient::onModelRegistry);
modEventBus.addListener(CreateClient::onModelBake); modEventBus.addListener(CreateClient::onModelBake);
@ -186,12 +184,6 @@ public class CreateClient {
return customBlockModels; return customBlockModels;
} }
public static AllColorHandlers getColorHandler() {
if (colorHandlers == null)
colorHandlers = new AllColorHandlers();
return colorHandlers;
}
public static CasingConnectivity getCasingConnectivity() { public static CasingConnectivity getCasingConnectivity() {
if (casingConnectivity == null) if (casingConnectivity == null)
casingConnectivity = new CasingConnectivity(); casingConnectivity = new CasingConnectivity();

View file

@ -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<BlueprintContainer> {
@Override
public Class<BlueprintContainer> 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;
}
}

View file

@ -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.components.saw.SawTileEntity;
import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager;
import com.simibubi.create.content.contraptions.processing.BasinRecipe; 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.block.inventories.AdjustableCrateScreen;
import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; 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.AttributeFilterScreen;
@ -51,10 +52,12 @@ import com.simibubi.create.foundation.config.ConfigBase.ConfigBool;
import mezz.jei.api.IModPlugin; import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin; import mezz.jei.api.JeiPlugin;
import mezz.jei.api.constants.VanillaRecipeCategoryUid;
import mezz.jei.api.registration.IGuiHandlerRegistration; import mezz.jei.api.registration.IGuiHandlerRegistration;
import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeCatalystRegistration;
import mezz.jei.api.registration.IRecipeCategoryRegistration; import mezz.jei.api.registration.IRecipeCategoryRegistration;
import mezz.jei.api.registration.IRecipeRegistration; import mezz.jei.api.registration.IRecipeRegistration;
import mezz.jei.api.registration.IRecipeTransferRegistration;
import mezz.jei.api.runtime.IIngredientManager; import mezz.jei.api.runtime.IIngredientManager;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -169,7 +172,8 @@ public class CreateJEI implements IModPlugin {
.build(), .build(),
deploying = register("deploying", DeployingCategory::new) deploying = register("deploying", DeployingCategory::new)
.recipeList(() -> DeployerApplicationRecipe.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.type))) .recipeList(
() -> DeployerApplicationRecipe.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.type)))
.recipes(AllRecipeTypes.DEPLOYING) .recipes(AllRecipeTypes.DEPLOYING)
.catalyst(AllBlocks.DEPLOYER::get) .catalyst(AllBlocks.DEPLOYER::get)
.catalyst(AllBlocks.DEPOT::get) .catalyst(AllBlocks.DEPOT::get)
@ -204,15 +208,18 @@ public class CreateJEI implements IModPlugin {
mechanicalCrafting = mechanicalCrafting =
register("mechanical_crafting", MechanicalCraftingCategory::new).recipes(AllRecipeTypes.MECHANICAL_CRAFTING) register("mechanical_crafting", MechanicalCraftingCategory::new).recipes(AllRecipeTypes.MECHANICAL_CRAFTING)
.catalyst(AllBlocks.MECHANICAL_CRAFTER::get) .catalyst(AllBlocks.MECHANICAL_CRAFTER::get)
.build() .build();
;
private <T extends IRecipe<?>> CategoryBuilder<T> register(String name, private <T extends IRecipe<?>> CategoryBuilder<T> register(String name,
Supplier<CreateRecipeCategory<T>> supplier) { Supplier<CreateRecipeCategory<T>> supplier) {
return new CategoryBuilder<T>(name, supplier); return new CategoryBuilder<T>(name, supplier);
} }
@Override
public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) {
registration.addRecipeTransferHandler(new BlueprintTransferHandler(), VanillaRecipeCategoryUid.CRAFTING);
}
@Override @Override
public void registerCategories(IRecipeCategoryRegistration registration) { public void registerCategories(IRecipeCategoryRegistration registration) {
allCategories.forEach(registration::addRecipeCategories); allCategories.forEach(registration::addRecipeCategories);
@ -238,7 +245,8 @@ public class CreateJEI implements IModPlugin {
registration.addGuiContainerHandler(SchematicTableScreen.class, slotMover); registration.addGuiContainerHandler(SchematicTableScreen.class, slotMover);
registration.addGuiContainerHandler(FilterScreen.class, slotMover); registration.addGuiContainerHandler(FilterScreen.class, slotMover);
registration.addGuiContainerHandler(AttributeFilterScreen.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<T extends IRecipe<?>> { private class CategoryBuilder<T extends IRecipe<?>> {
@ -278,12 +286,12 @@ public class CreateJEI implements IModPlugin {
return recipeList(list, null); return recipeList(list, null);
} }
public CategoryBuilder<T> recipeList(Supplier<List<? extends IRecipe<?>>> list, Function<IRecipe<?>, T> converter) { public CategoryBuilder<T> recipeList(Supplier<List<? extends IRecipe<?>>> list,
Function<IRecipe<?>, T> converter) {
recipeListConsumers.add(recipes -> { recipeListConsumers.add(recipes -> {
List<? extends IRecipe<?>> toAdd = list.get(); List<? extends IRecipe<?>> toAdd = list.get();
if (converter != null) if (converter != null)
toAdd = toAdd toAdd = toAdd.stream()
.stream()
.map(converter) .map(converter)
.collect(Collectors.toList()); .collect(Collectors.toList());
recipes.addAll(toAdd); recipes.addAll(toAdd);

View file

@ -5,12 +5,10 @@ import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault; 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.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 com.simibubi.create.foundation.networking.AllPackets;
import mcp.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
@ -18,21 +16,20 @@ import mezz.jei.api.gui.handlers.IGhostIngredientHandler;
import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.client.renderer.Rectangle2d;
import net.minecraft.inventory.container.Slot; import net.minecraft.inventory.container.Slot;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public class FilterGhostIngredientHandler<T extends AbstractFilterContainer> public class GhostIngredientHandler<T extends GhostItemContainer<?>>
implements IGhostIngredientHandler<AbstractFilterScreen<T>> { implements IGhostIngredientHandler<AbstractSimiContainerScreen<T>> {
@Override @Override
public <I> List<Target<I>> getTargets(AbstractFilterScreen<T> gui, I ingredient, boolean doStart) { public <I> List<Target<I>> getTargets(AbstractSimiContainerScreen<T> gui, I ingredient, boolean doStart) {
List<Target<I>> targets = new ArrayList<>(); List<Target<I>> targets = new ArrayList<>();
boolean isAttributeFilter = gui instanceof AttributeFilterScreen; boolean isAttributeFilter = gui instanceof AttributeFilterScreen;
if (ingredient instanceof ItemStack) { if (ingredient instanceof ItemStack) {
for (int i = 36; i < gui.getContainer().inventorySlots.size(); i++) { 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 // Only accept items in 1st slot. 2nd is used for functionality, don't wanna override that one
if (isAttributeFilter) if (isAttributeFilter)
@ -44,7 +41,8 @@ public class FilterGhostIngredientHandler<T extends AbstractFilterContainer>
} }
@Override @Override
public void onComplete() {} public void onComplete() {
}
@Override @Override
public boolean shouldHighlightTargets() { public boolean shouldHighlightTargets() {
@ -52,14 +50,14 @@ public class FilterGhostIngredientHandler<T extends AbstractFilterContainer>
return true; return true;
} }
private static class FilterGhostTarget<I, T extends AbstractFilterContainer> implements Target<I> { private static class GhostTarget<I, T extends GhostItemContainer<?>> implements Target<I> {
private final Rectangle2d area; private final Rectangle2d area;
private final AbstractFilterScreen<T> gui; private final AbstractSimiContainerScreen<T> gui;
private final int slotIndex; private final int slotIndex;
private final boolean isAttributeFilter; private final boolean isAttributeFilter;
public FilterGhostTarget(AbstractFilterScreen<T> gui, int slotIndex, boolean isAttributeFilter) { public GhostTarget(AbstractSimiContainerScreen<T> gui, int slotIndex, boolean isAttributeFilter) {
this.gui = gui; this.gui = gui;
this.slotIndex = slotIndex; this.slotIndex = slotIndex;
this.isAttributeFilter = isAttributeFilter; this.isAttributeFilter = isAttributeFilter;
@ -75,19 +73,14 @@ public class FilterGhostIngredientHandler<T extends AbstractFilterContainer>
@Override @Override
public void accept(I ingredient) { public void accept(I ingredient) {
ItemStack stack = ((ItemStack) ingredient).copy(); ItemStack stack = ((ItemStack) ingredient).copy();
LogManager.getLogger()
.info(stack);
stack.setCount(1); stack.setCount(1);
gui.getContainer().filterInventory.setStackInSlot(slotIndex, stack); gui.getContainer().ghostInventory.setStackInSlot(slotIndex, stack);
if (isAttributeFilter) if (isAttributeFilter)
return; return;
// sync new filter contents with server // sync new filter contents with server
CompoundNBT data = new CompoundNBT(); AllPackets.channel.sendToServer(new GhostItemSubmitPacket(stack, slotIndex));
data.putInt("Slot", slotIndex);
data.put("Item", stack.serializeNBT());
AllPackets.channel.sendToServer(new FilterScreenPacket(FilterScreenPacket.Option.UPDATE_FILTER_ITEM, data));
} }
} }
} }

View file

@ -16,6 +16,7 @@ import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.CocoaBlock; import net.minecraft.block.CocoaBlock;
@ -151,11 +152,15 @@ public class HarvesterMovementBehaviour extends MovementBehaviour {
} }
private BlockState cutCrop(World world, BlockPos pos, BlockState state) { private BlockState cutCrop(World world, BlockPos pos, BlockState state) {
if (state.getBlock() instanceof CropsBlock) { Block block = state.getBlock();
CropsBlock crop = (CropsBlock) state.getBlock(); if (block instanceof CropsBlock) {
CropsBlock crop = (CropsBlock) block;
return crop.withAge(0); 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() if (state.getFluidState()
.isEmpty()) .isEmpty())
return Blocks.AIR.getDefaultState(); return Blocks.AIR.getDefaultState();
@ -163,7 +168,7 @@ public class HarvesterMovementBehaviour extends MovementBehaviour {
.getBlockState(); .getBlockState();
} }
if (state.getCollisionShape(world, pos) if (state.getCollisionShape(world, pos)
.isEmpty() || state.getBlock() instanceof CocoaBlock) { .isEmpty() || block instanceof CocoaBlock) {
for (Property<?> property : state.getProperties()) { for (Property<?> property : state.getProperties()) {
if (!(property instanceof IntegerProperty)) if (!(property instanceof IntegerProperty))
continue; continue;

View file

@ -101,7 +101,7 @@ public class SeatBlock extends Block {
if (world.isRemote) if (world.isRemote)
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
BlockState newState = AllBlocks.SEATS[color.ordinal()].getDefaultState(); BlockState newState = AllBlocks.SEATS.get(color).getDefaultState();
if (newState != state) if (newState != state)
world.setBlockState(pos, newState); world.setBlockState(pos, newState);
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;

View file

@ -66,10 +66,24 @@ public class CuckooClockTileEntity extends KineticTileEntity {
if (getSpeed() == 0) if (getSpeed() == 0)
return; 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 hours = (dayTime / 1000 + 6) % 24;
int minutes = (dayTime % 1000) * 60 / 1000; 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 (!world.isRemote) {
if (animationType == Animation.NONE) { if (animationType == Animation.NONE) {
if (hours == 12 && minutes < 5) if (hours == 12 && minutes < 5)

View file

@ -48,7 +48,7 @@ public class ValveHandleBlock extends HandCrankBlock {
if (worldIn.isRemote) if (worldIn.isRemote)
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
BlockState newState = AllBlocks.DYED_VALVE_HANDLES[color.ordinal()] BlockState newState = AllBlocks.DYED_VALVE_HANDLES.get(color)
.getDefaultState() .getDefaultState()
.with(FACING, state.get(FACING)); .with(FACING, state.get(FACING));
if (newState != state) if (newState != state)

View file

@ -92,7 +92,6 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
if (AllBlocks.CRUSHING_WHEEL.has(otherState)) { if (AllBlocks.CRUSHING_WHEEL.has(otherState)) {
controllerShouldExist = true; controllerShouldExist = true;
try {
CrushingWheelTileEntity te = getTileEntity(world, pos); CrushingWheelTileEntity te = getTileEntity(world, pos);
CrushingWheelTileEntity otherTe = getTileEntity(world, otherWheelPos); CrushingWheelTileEntity otherTe = getTileEntity(world, otherWheelPos);
@ -116,10 +115,6 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
} }
if (otherState.get(AXIS) != state.get(AXIS)) if (otherState.get(AXIS) != state.get(AXIS))
controllerShouldExist = false; controllerShouldExist = false;
} catch (TileEntityException e) {
controllerShouldExist = false;
}
} }
if (!controllerShouldExist) { if (!controllerShouldExist) {
@ -149,27 +144,25 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
@Override @Override
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { 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()) if (entityIn.getY() < pos.getY() + 1.25f || !entityIn.isOnGround())
return; return;
float speed = getTileEntityOptional(worldIn, pos).map(CrushingWheelTileEntity::getSpeed)
.orElse(0f);
double x = 0; double x = 0;
double z = 0; double z = 0;
if (state.get(AXIS) == Axis.X) { if (state.get(AXIS) == Axis.X) {
z = te.getSpeed() / 20f; z = speed / 20f;
x += (pos.getX() + .5f - entityIn.getX()) * .1f; x += (pos.getX() + .5f - entityIn.getX()) * .1f;
} }
if (state.get(AXIS) == Axis.Z) { if (state.get(AXIS) == Axis.Z) {
x = te.getSpeed() / -20f; x = speed / -20f;
z += (pos.getZ() + .5f - entityIn.getZ()) * .1f; z += (pos.getZ() + .5f - entityIn.getZ()) * .1f;
} }
entityIn.setMotion(entityIn.getMotion() entityIn.setMotion(entityIn.getMotion()
.add(x, 0, z)); .add(x, 0, z));
} catch (TileEntityException e) {
}
} }
@Override @Override

View file

@ -91,9 +91,10 @@ public class CrushingWheelControllerBlock extends DirectionalBlock
}); });
} }
public void checkEntityForProcessing(World worldIn, BlockPos pos, Entity entityIn){ public void checkEntityForProcessing(World worldIn, BlockPos pos, Entity entityIn) {
try {
CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos);
if (te == null)
return;
if (te.crushingspeed == 0) if (te.crushingspeed == 0)
return; return;
if (entityIn instanceof ItemEntity) if (entityIn instanceof ItemEntity)
@ -112,7 +113,6 @@ public class CrushingWheelControllerBlock extends DirectionalBlock
return; return;
te.startCrushing(entityIn); te.startCrushing(entityIn);
} catch (TileEntityException e) {}
} }
@Override @Override
@ -167,26 +167,26 @@ public class CrushingWheelControllerBlock extends DirectionalBlock
@Override @Override
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) { ISelectionContext context) {
VoxelShape standardShape = AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING));
if (!state.get(VALID)) if (!state.get(VALID))
return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING)); return standardShape;
Entity entity = context.getEntity(); Entity entity = context.getEntity();
if (entity != null) { if (entity == null)
return standardShape;
CompoundNBT data = entity.getPersistentData(); CompoundNBT data = entity.getPersistentData();
if (data.contains("BypassCrushingWheel")) { if (data.contains("BypassCrushingWheel"))
if (pos.equals(NBTUtil.readBlockPos(data.getCompound("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. if (state.get(FACING) != Direction.UP) // Allow output items to land on top of the block rather than falling back through.
return VoxelShapes.empty(); return VoxelShapes.empty();
}
try {
CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos);
if (te.processingEntity == entity) if (te != null && te.processingEntity == entity)
return VoxelShapes.empty(); return VoxelShapes.empty();
} catch (TileEntityException e) {}
} return standardShape;
return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING));
} }
@Override @Override

View file

@ -274,7 +274,7 @@ public class DeployerHandler {
// Use on block // Use on block
if (useBlock != DENY && flag1 if (useBlock != DENY && flag1
&& safeOnUse(clickedState, world, clickedPos, player, hand, result) == ActionResultType.SUCCESS) && safeOnUse(clickedState, world, clickedPos, player, hand, result).isAccepted())
return; return;
if (stack.isEmpty()) if (stack.isEmpty())
return; return;
@ -299,7 +299,7 @@ public class DeployerHandler {
// 'Inert' item use behaviour & block placement // 'Inert' item use behaviour & block placement
ActionResultType onItemUse = stack.onItemUse(itemusecontext); ActionResultType onItemUse = stack.onItemUse(itemusecontext);
if (onItemUse == ActionResultType.SUCCESS) if (onItemUse.isAccepted())
return; return;
if (item == Items.ENDER_PEARL) if (item == Items.ENDER_PEARL)
return; return;

View file

@ -99,13 +99,10 @@ public class MillstoneBlock extends KineticBlock implements ITE<MillstoneTileEnt
return; return;
MillstoneTileEntity millstone = null; MillstoneTileEntity millstone = null;
for (BlockPos pos : Iterate.hereAndBelow(entityIn.getBlockPos())) { for (BlockPos pos : Iterate.hereAndBelow(entityIn.getBlockPos()))
try { if (millstone == null)
millstone = getTileEntity(worldIn, pos); millstone = getTileEntity(worldIn, pos);
} catch (TileEntityException e) {
continue;
}
}
if (millstone == null) if (millstone == null)
return; return;

View file

@ -1,6 +1,7 @@
package com.simibubi.create.content.contraptions.components.structureMovement; package com.simibubi.create.content.contraptions.components.structureMovement;
import com.simibubi.create.AllTileEntities; 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.AdjustableCrateBlock;
import com.simibubi.create.content.logistics.block.inventories.BottomlessItemHandler; import com.simibubi.create.content.logistics.block.inventories.BottomlessItemHandler;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
@ -44,7 +45,8 @@ public class MountedStorage {
return true; return true;
LazyOptional<IItemHandler> capability = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); LazyOptional<IItemHandler> 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) { public MountedStorage(TileEntity te) {

View file

@ -177,7 +177,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity
} }
protected float getHourTarget(boolean cycle24) { 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 hours = (dayTime / 1000 + 6) % 24;
int offset = getBlockState().get(ClockworkBearingBlock.FACING) int offset = getBlockState().get(ClockworkBearingBlock.FACING)
.getAxisDirection() .getAxisDirection()
@ -187,7 +188,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity
} }
protected float getMinuteTarget() { 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 minutes = (dayTime % 1000) * 60 / 1000;
int offset = getBlockState().get(ClockworkBearingBlock.FACING) int offset = getBlockState().get(ClockworkBearingBlock.FACING)
.getAxisDirection() .getAxisDirection()

View file

@ -97,7 +97,7 @@ public class SailBlock extends ProperDirectionalBlock {
protected void applyDye(BlockState state, World world, BlockPos pos, @Nullable DyeColor color) { protected void applyDye(BlockState state, World world, BlockPos pos, @Nullable DyeColor color) {
BlockState newState = 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)); .with(FACING, state.get(FACING));
// Dye the block itself // Dye the block itself

View file

@ -182,6 +182,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat
public boolean onValidSurface() { public boolean onValidSurface() {
BlockPos pos = hangingPosition; BlockPos pos = hangingPosition;
BlockPos pos2 = hangingPosition.offset(getFacingDirection().getOpposite()); BlockPos pos2 = hangingPosition.offset(getFacingDirection().getOpposite());
if (pos2.getY() >= 256)
return false;
if (!world.isAreaLoaded(pos, 0) || !world.isAreaLoaded(pos2, 0)) if (!world.isAreaLoaded(pos, 0) || !world.isAreaLoaded(pos2, 0))
return true; return true;
if (!isValidFace(world, pos2, getFacingDirection()) if (!isValidFace(world, pos2, getFacingDirection())

View file

@ -2,8 +2,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mo
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.UUID;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -11,21 +9,12 @@ import javax.annotation.Nullable;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; 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.components.tracks.ControllerRailBlock;
import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement;
import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement;
import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType;
import com.simibubi.create.foundation.block.ITE; 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.AbstractRailBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -41,7 +30,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext; import net.minecraft.item.ItemUseContext;
import net.minecraft.loot.LootContext; import net.minecraft.loot.LootContext;
import net.minecraft.loot.LootParameters; import net.minecraft.loot.LootParameters;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.pathfinding.PathType; import net.minecraft.pathfinding.PathType;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.EnumProperty; import net.minecraft.state.EnumProperty;
@ -60,17 +48,14 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents; import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; 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.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3i;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.common.util.LazyOptional;
public class CartAssemblerBlock extends AbstractRailBlock public class CartAssemblerBlock extends AbstractRailBlock
implements ITE<CartAssemblerTileEntity>, IWrenchable, ISpecialBlockItemRequirement { implements ITE<CartAssemblerTileEntity>, IWrenchable, ISpecialBlockItemRequirement {
@ -138,42 +123,7 @@ public class CartAssemblerBlock extends AbstractRailBlock
if (world.isRemote) if (world.isRemote)
return; return;
withTileEntityDo(world, pos, te -> { withTileEntityDo(world, pos, te -> te.assembleNextTick(cart));
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);
}
});
} }
public enum CartAssemblerAction { public enum CartAssemblerAction {
@ -245,124 +195,6 @@ public class CartAssemblerBlock extends AbstractRailBlock
return ActionResultType.PASS; return ActionResultType.PASS;
} }
protected void assemble(World world, BlockPos pos, AbstractMinecartEntity cart) {
if (!cart.getPassengers()
.isEmpty())
return;
LazyOptional<MinecartController> optional =
cart.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY);
if (optional.isPresent() && optional.orElse(null)
.isCoupledThroughContraption())
return;
Optional<CartAssemblerTileEntity> 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<Direction> 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<MinecartController> 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 @Override
public void neighborChanged(@Nonnull BlockState state, @Nonnull World worldIn, @Nonnull BlockPos pos, public void neighborChanged(@Nonnull BlockState state, @Nonnull World worldIn, @Nonnull BlockPos pos,
@Nonnull Block blockIn, @Nonnull BlockPos fromPos, boolean isMoving) { @Nonnull Block blockIn, @Nonnull BlockPos fromPos, boolean isMoving) {

View file

@ -1,9 +1,17 @@
package com.simibubi.create.content.contraptions.components.structureMovement.mounted; package com.simibubi.create.content.contraptions.components.structureMovement.mounted;
import java.util.List; 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.AssemblyException;
import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; 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.gui.AllIcons;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; 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.ValueBoxTransform;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; 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.Lang;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; 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.nbt.CompoundNBT;
import net.minecraft.state.properties.RailShape; import net.minecraft.state.properties.RailShape;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; 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.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 { public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplayAssemblyExceptions {
private static final int assemblyCooldown = 8; private static final int assemblyCooldown = 8;
@ -28,6 +47,8 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay
private int ticksSinceMinecartUpdate; private int ticksSinceMinecartUpdate;
protected AssemblyException lastException; protected AssemblyException lastException;
protected AbstractMinecartEntity cartToAssemble;
public CartAssemblerTileEntity(TileEntityType<? extends CartAssemblerTileEntity> type) { public CartAssemblerTileEntity(TileEntityType<? extends CartAssemblerTileEntity> type) {
super(type); super(type);
ticksSinceMinecartUpdate = assemblyCooldown; ticksSinceMinecartUpdate = assemblyCooldown;
@ -39,6 +60,166 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay
if (ticksSinceMinecartUpdate < assemblyCooldown) { if (ticksSinceMinecartUpdate < assemblyCooldown) {
ticksSinceMinecartUpdate++; 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<MinecartController> 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<Direction> 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<MinecartController> 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 @Override
@ -91,7 +272,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay
} }
public static enum CartMovementMode implements INamedIconOptions { public enum CartMovementMode implements INamedIconOptions {
ROTATE(AllIcons.I_CART_ROTATE), ROTATE(AllIcons.I_CART_ROTATE),
ROTATE_PAUSED(AllIcons.I_CART_ROTATE_PAUSED), ROTATE_PAUSED(AllIcons.I_CART_ROTATE_PAUSED),
@ -102,7 +283,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay
private String translationKey; private String translationKey;
private AllIcons icon; private AllIcons icon;
private CartMovementMode(AllIcons icon) { CartMovementMode(AllIcons icon) {
this.icon = icon; this.icon = icon;
translationKey = "contraptions.cart_movement_mode." + Lang.asId(name()); translationKey = "contraptions.cart_movement_mode." + Lang.asId(name());
} }
@ -122,6 +303,11 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay
ticksSinceMinecartUpdate = 0; ticksSinceMinecartUpdate = 0;
} }
public void assembleNextTick(AbstractMinecartEntity cart) {
if (cartToAssemble == null)
cartToAssemble = cart;
}
public boolean isMinecartUpdateValid() { public boolean isMinecartUpdateValid() {
return ticksSinceMinecartUpdate >= assemblyCooldown; return ticksSinceMinecartUpdate >= assemblyCooldown;
} }

View file

@ -36,8 +36,7 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE<ItemDrainT
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
ItemStack heldItem = player.getHeldItem(handIn); ItemStack heldItem = player.getHeldItem(handIn);
try { return onTileEntityUse(worldIn, pos, te -> {
ItemDrainTileEntity te = getTileEntity(worldIn, pos);
if (!heldItem.isEmpty()) { if (!heldItem.isEmpty()) {
te.internalTank.allowInsertion(); te.internalTank.allowInsertion();
ActionResultType tryExchange = tryExchange(worldIn, player, handIn, heldItem, te); ActionResultType tryExchange = tryExchange(worldIn, player, handIn, heldItem, te);
@ -53,10 +52,7 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE<ItemDrainT
te.notifyUpdate(); te.notifyUpdate();
} }
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} catch (TileEntityException e) { });
}
return ActionResultType.PASS;
} }
protected ActionResultType tryExchange(World worldIn, PlayerEntity player, Hand handIn, ItemStack heldItem, protected ActionResultType tryExchange(World worldIn, PlayerEntity player, Hand handIn, ItemStack heldItem,

View file

@ -1,5 +1,6 @@
package com.simibubi.create.content.contraptions.fluids.pipes; package com.simibubi.create.content.contraptions.fluids.pipes;
import java.util.Arrays;
import java.util.Optional; import java.util.Optional;
import java.util.Random; import java.util.Random;
@ -231,6 +232,12 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren
if (bracket != null && bracket.isBracketPresent()) if (bracket != null && bracket.isBracketPresent())
return state; return state;
BlockState prevState = state;
int prevStateSides = (int) Arrays.stream(Iterate.directions)
.map(FACING_TO_PROPERTY_MAP::get)
.filter(prevState::get)
.count();
// Update sides that are not ignored // Update sides that are not ignored
for (Direction d : Iterate.directions) for (Direction d : Iterate.directions)
if (d != ignore) { if (d != ignore) {
@ -252,6 +259,10 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren
if (connectedDirection != null) if (connectedDirection != null)
return state.with(FACING_TO_PROPERTY_MAP.get(connectedDirection.getOpposite()), true); return state.with(FACING_TO_PROPERTY_MAP.get(connectedDirection.getOpposite()), true);
// If we can't connect to anything and weren't connected before, do nothing
if (prevStateSides == 2)
return prevState;
// Use preferred // Use preferred
return state.with(FACING_TO_PROPERTY_MAP.get(preferredDirection), true) return state.with(FACING_TO_PROPERTY_MAP.get(preferredDirection), true)
.with(FACING_TO_PROPERTY_MAP.get(preferredDirection.getOpposite()), true); .with(FACING_TO_PROPERTY_MAP.get(preferredDirection.getOpposite()), true);

View file

@ -92,8 +92,7 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
ItemStack heldItem = player.getHeldItem(handIn); ItemStack heldItem = player.getHeldItem(handIn);
try { return onTileEntityUse(worldIn, pos, te -> {
BasinTileEntity te = getTileEntity(worldIn, pos);
if (!heldItem.isEmpty()) { if (!heldItem.isEmpty()) {
if (FluidHelper.tryEmptyItemIntoTE(worldIn, player, handIn, heldItem, te)) if (FluidHelper.tryEmptyItemIntoTE(worldIn, player, handIn, heldItem, te))
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
@ -128,10 +127,8 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
worldIn.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .2f, worldIn.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .2f,
1f + Create.RANDOM.nextFloat()); 1f + Create.RANDOM.nextFloat());
te.onEmptied(); te.onEmptied();
} catch (TileEntityException e) {
}
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
});
} }
@Override @Override

View file

@ -102,11 +102,8 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
if (face.getAxis() != getRotationAxis(state)) if (face.getAxis() != getRotationAxis(state))
return false; return false;
try { return getTileEntityOptional(world, pos).map(BeltTileEntity::hasPulley)
return getTileEntity(world, pos).hasPulley(); .orElse(false);
} catch (TileEntityException e) {
}
return false;
} }
@Override @Override
@ -367,22 +364,18 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
return VoxelShapes.empty(); return VoxelShapes.empty();
VoxelShape shape = getShape(state, worldIn, pos, context); VoxelShape shape = getShape(state, worldIn, pos, context);
try { return getTileEntityOptional(worldIn, pos).map(te -> {
if (context.getEntity() == null) if (context.getEntity() == null)
return shape; return shape;
BeltTileEntity belt = getTileEntity(worldIn, pos); BeltTileEntity controller = te.getControllerTE();
BeltTileEntity controller = belt.getControllerTE();
if (controller == null) if (controller == null)
return shape; 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 BeltShapes.getCollisionShape(state);
}
} catch (TileEntityException e) {
}
return shape; return shape;
}).orElse(shape);
} }
@Override @Override

View file

@ -1,8 +1,8 @@
package com.simibubi.create.content.contraptions.wrench; package com.simibubi.create.content.contraptions.wrench;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer;
import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.contraptions.wrench; 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.model.IBakedModel;
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;

View file

@ -7,6 +7,8 @@ import java.util.Map;
import javax.annotation.Nonnull; 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.CrossPlaneMirror;
import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror;
import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror;
@ -229,8 +231,17 @@ public class SymmetryWandItem extends Item {
continue; continue;
if (toReplace.getBlockHardness(world, position) == -1) if (toReplace.getBlockHardness(world, position) == -1)
continue; 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) if (BlockHelper.findAndRemoveInInventory(blockState, player, 1) == 0)
continue; continue;
}
BlockSnapshot blocksnapshot = BlockSnapshot.create(world.getRegistryKey(), world, position); BlockSnapshot blocksnapshot = BlockSnapshot.create(world.getRegistryKey(), world, position);
FluidState ifluidstate = world.getFluidState(position); FluidState ifluidstate = world.getFluidState(position);

View file

@ -1,8 +1,8 @@
package com.simibubi.create.content.curiosities.symmetry.client; package com.simibubi.create.content.curiosities.symmetry.client;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer;
import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.curiosities.symmetry.client; 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.model.IBakedModel;
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;

View file

@ -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) {
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);
}
}

View file

@ -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<BlueprintSection> 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<ICraftingRecipe> 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();
}
}
}

View file

@ -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<? extends HangingEntity>) 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<BlueprintEntity> entityBuilder = (EntityType.Builder<BlueprintEntity>) 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<ICraftingRecipe> recipe = Optional.empty();
do {
Map<Integer, ItemStack> stacksTaken = new HashMap<>();
Map<Integer, ItemStack> 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<ItemStack> 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<Integer, ItemStack> 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<Integer, ItemStack> 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<Integer, BlueprintSection> sectionCache = new HashMap<>();
public BlueprintSection getSection(int index) {
return sectionCache.computeIfAbsent(index, i -> new BlueprintSection(i));
}
class BlueprintSection implements INamedContainerProvider {
int index;
Couple<ItemStack> cachedDisplayItems;
public boolean inferredIcon = false;
public BlueprintSection(int index) {
this.index = index;
}
public Couple<ItemStack> 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();
}
}

View file

@ -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<Ingredient> 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<ItemStack> 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;
}
}

View file

@ -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<Pair<ItemStack, Boolean>> 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<ICraftingRecipe> recipe = Optional.empty();
Map<Integer, ItemStack> craftingGrid = new HashMap<>();
ingredients.clear();
ItemStackHandler missingItems = new ItemStackHandler(64);
ItemStackHandler availableItems = new ItemStackHandler(64);
List<ItemStack> newlyAdded = new ArrayList<>();
List<ItemStack> 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<ItemStack, Boolean> 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);
}
}
}

View file

@ -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<BlueprintEntity> {
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<ItemStack> 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;
}
}

View file

@ -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<BlueprintContainer> {
protected AllGuiTextures background;
private List<Rectangle2d> 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).<GuiGameElement
.GuiRenderBuilder>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<ITextComponent> getTooltipFromItem(ItemStack stack) {
List<ITextComponent> list = super.getTooltipFromItem(stack);
if (hoveredSlot.inventory == container.playerInventory)
return list;
return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex(), false) : list;
}
private List<ITextComponent> addToTooltip(List<ITextComponent> 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<IconButton> 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<IFormattableTextComponent> 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<Rectangle2d> getExtraAreas() {
return extraAreas;
}
}

View file

@ -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.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.event.entity.living.LivingKnockBackEvent; import net.minecraftforge.event.entity.living.LivingKnockBackEvent;
import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@ -65,14 +66,15 @@ public class ExtendoGripItem extends Item {
.rarity(Rarity.UNCOMMON)); .rarity(Rarity.UNCOMMON));
} }
public static final String EXTENDO_MARKER = "createExtendo";
public static final String DUAL_EXTENDO_MARKER = "createDualExtendo";
@SubscribeEvent @SubscribeEvent
public static void holdingExtendoGripIncreasesRange(LivingUpdateEvent event) { public static void holdingExtendoGripIncreasesRange(LivingUpdateEvent event) {
if (!(event.getEntity() instanceof PlayerEntity)) if (!(event.getEntity() instanceof PlayerEntity))
return; return;
PlayerEntity player = (PlayerEntity) event.getEntityLiving(); PlayerEntity player = (PlayerEntity) event.getEntityLiving();
String marker = "createExtendo";
String dualMarker = "createDualExtendo";
CompoundNBT persistentData = player.getPersistentData(); CompoundNBT persistentData = player.getPersistentData();
boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemOffhand()); boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemOffhand());
@ -80,19 +82,19 @@ public class ExtendoGripItem extends Item {
boolean holdingDualExtendo = inOff && inMain; boolean holdingDualExtendo = inOff && inMain;
boolean holdingExtendo = inOff ^ inMain; boolean holdingExtendo = inOff ^ inMain;
holdingExtendo &= !holdingDualExtendo; holdingExtendo &= !holdingDualExtendo;
boolean wasHoldingExtendo = persistentData.contains(marker); boolean wasHoldingExtendo = persistentData.contains(EXTENDO_MARKER);
boolean wasHoldingDualExtendo = persistentData.contains(dualMarker); boolean wasHoldingDualExtendo = persistentData.contains(DUAL_EXTENDO_MARKER);
if (holdingExtendo != wasHoldingExtendo) { if (holdingExtendo != wasHoldingExtendo) {
if (!holdingExtendo) { if (!holdingExtendo) {
player.getAttributes().removeModifiers(rangeModifier.getValue()); player.getAttributes().removeModifiers(rangeModifier.getValue());
persistentData.remove(marker); persistentData.remove(EXTENDO_MARKER);
} else { } else {
if (player instanceof ServerPlayerEntity) if (player instanceof ServerPlayerEntity)
AllTriggers.EXTENDO.trigger((ServerPlayerEntity) player); AllTriggers.EXTENDO.trigger((ServerPlayerEntity) player);
player.getAttributes() player.getAttributes()
.addTemporaryModifiers(rangeModifier.getValue()); .addTemporaryModifiers(rangeModifier.getValue());
persistentData.putBoolean(marker, true); persistentData.putBoolean(EXTENDO_MARKER, true);
} }
} }
@ -100,18 +102,29 @@ public class ExtendoGripItem extends Item {
if (!holdingDualExtendo) { if (!holdingDualExtendo) {
player.getAttributes() player.getAttributes()
.removeModifiers(doubleRangeModifier.getValue()); .removeModifiers(doubleRangeModifier.getValue());
persistentData.remove(dualMarker); persistentData.remove(DUAL_EXTENDO_MARKER);
} else { } else {
if (player instanceof ServerPlayerEntity) if (player instanceof ServerPlayerEntity)
AllTriggers.GIGA_EXTENDO.trigger((ServerPlayerEntity) player); AllTriggers.GIGA_EXTENDO.trigger((ServerPlayerEntity) player);
player.getAttributes() player.getAttributes()
.addTemporaryModifiers(doubleRangeModifier.getValue()); .addTemporaryModifiers(doubleRangeModifier.getValue());
persistentData.putBoolean(dualMarker, true); 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 @SubscribeEvent
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public static void dontMissEntitiesWhenYouHaveHighReachDistance(ClickInputEvent event) { public static void dontMissEntitiesWhenYouHaveHighReachDistance(ClickInputEvent event) {

View file

@ -2,8 +2,8 @@ package com.simibubi.create.content.curiosities.tools;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer;
import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.curiosities.tools; 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.model.IBakedModel;
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;

View file

@ -1,7 +1,7 @@
package com.simibubi.create.content.curiosities.tools; package com.simibubi.create.content.curiosities.tools;
import com.mojang.blaze3d.matrix.MatrixStack; 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 com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;

View file

@ -1,9 +1,9 @@
package com.simibubi.create.content.curiosities.zapper; package com.simibubi.create.content.curiosities.zapper;
import com.mojang.blaze3d.matrix.MatrixStack; 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.block.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer;
import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.FourWayBlock; import net.minecraft.block.FourWayBlock;

View file

@ -5,7 +5,7 @@ import static net.minecraft.util.math.MathHelper.clamp;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; 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 com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.curiosities.zapper.terrainzapper; 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.model.IBakedModel;
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;

View file

@ -204,20 +204,14 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I
return ActionResultType.PASS; return ActionResultType.PASS;
if (world.isRemote) if (world.isRemote)
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
try {
ChuteTileEntity te = getTileEntity(world, pos); return onTileEntityUse(world, pos, te -> {
if (te == null)
return ActionResultType.PASS;
if (te.item.isEmpty()) if (te.item.isEmpty())
return ActionResultType.PASS; return ActionResultType.PASS;
player.inventory.placeItemBackInInventory(world, te.item); player.inventory.placeItemBackInInventory(world, te.item);
te.setItem(ItemStack.EMPTY); te.setItem(ItemStack.EMPTY);
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
});
} catch (TileEntityException e) {
e.printStackTrace();
}
return ActionResultType.PASS;
} }
} }

View file

@ -53,24 +53,19 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE<AnalogL
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} }
try { return onTileEntityUse(worldIn, pos, te -> {
boolean sneak = player.isSneaking(); boolean sneak = player.isSneaking();
AnalogLeverTileEntity te = getTileEntity(worldIn, pos);
te.changeState(sneak); te.changeState(sneak);
float f = .25f + ((te.state + 5) / 15f) * .5f; float f = .25f + ((te.state + 5) / 15f) * .5f;
worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f);
} catch (TileEntityException e) {}
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
});
} }
@Override @Override
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
try { return getTileEntityOptional(blockAccess, pos).map(al -> al.state)
return getTileEntity(blockAccess, pos).state; .orElse(0);
} catch (TileEntityException e) {
return 0;
}
} }
@Override @Override
@ -86,27 +81,26 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE<AnalogL
@Override @Override
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) { public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
try { withTileEntityDo(worldIn, pos, te -> {
AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); if (te.state != 0 && rand.nextFloat() < 0.25F)
if (tileEntity.state != 0 && rand.nextFloat() < 0.25F)
addParticles(stateIn, worldIn, pos, 0.5F); addParticles(stateIn, worldIn, pos, 0.5F);
} catch (TileEntityException e) {} });
} }
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
try { if (isMoving || state.getBlock() == newState.getBlock())
AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); return;
if (!isMoving && state.getBlock() != newState.getBlock()) { withTileEntityDo(worldIn, pos, te -> {
if (tileEntity.state != 0) if (te.state != 0)
updateNeighbors(state, worldIn, pos); updateNeighbors(state, worldIn, pos);
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} });
} catch (TileEntityException e) {}
} }
private static void addParticles(BlockState state, IWorld worldIn, BlockPos pos, float alpha) { 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(); Direction direction1 = getFacing(state).getOpposite();
double d0 = (double) pos.getX() + 0.5D + 0.1D * (double) direction.getXOffset() double d0 = (double) pos.getX() + 0.5D + 0.1D * (double) direction.getXOffset()
+ 0.2D * (double) direction1.getXOffset(); + 0.2D * (double) direction1.getXOffset();

View file

@ -42,11 +42,12 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE<NixieTubeTile
@Override @Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) { BlockRayTraceResult ray) {
try {
ItemStack heldItem = player.getHeldItem(hand); ItemStack heldItem = player.getHeldItem(hand);
NixieTubeTileEntity nixie = getTileEntity(world, pos); NixieTubeTileEntity nixie = getTileEntity(world, pos);
if (nixie == null)
return ActionResultType.PASS;
if (player.isSneaking()) if (player.isSneaking())
return ActionResultType.PASS; return ActionResultType.PASS;
@ -87,9 +88,6 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE<NixieTubeTile
} }
} }
} catch (TileEntityException e) {
}
return ActionResultType.PASS; return ActionResultType.PASS;
} }

View file

@ -114,12 +114,8 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<Red
public int getWeakPower(BlockState state, IBlockReader blockAccess, BlockPos pos, Direction side) { public int getWeakPower(BlockState state, IBlockReader blockAccess, BlockPos pos, Direction side) {
if (!state.get(RECEIVER)) if (!state.get(RECEIVER))
return 0; return 0;
try { return getTileEntityOptional(blockAccess, pos).map(RedstoneLinkTileEntity::getReceivedSignal)
RedstoneLinkTileEntity tileEntity = getTileEntity(blockAccess, pos); .orElse(0);
return tileEntity.getReceivedSignal();
} catch (TileEntityException e) {
}
return 0;
} }
@Override @Override
@ -149,17 +145,15 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<Red
public ActionResultType toggleMode(BlockState state, World worldIn, BlockPos pos) { public ActionResultType toggleMode(BlockState state, World worldIn, BlockPos pos) {
if (worldIn.isRemote) if (worldIn.isRemote)
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
try {
RedstoneLinkTileEntity te = getTileEntity(worldIn, pos); return onTileEntityUse(worldIn, pos, te -> {
Boolean wasReceiver = state.get(RECEIVER); Boolean wasReceiver = state.get(RECEIVER);
boolean blockPowered = worldIn.isBlockPowered(pos); boolean blockPowered = worldIn.isBlockPowered(pos);
worldIn.setBlockState(pos, state.cycle(RECEIVER) worldIn.setBlockState(pos, state.cycle(RECEIVER)
.with(POWERED, blockPowered), 3); .with(POWERED, blockPowered), 3);
te.transmit(wasReceiver ? 0 : getPower(worldIn, pos)); te.transmit(wasReceiver ? 0 : getPower(worldIn, pos));
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} catch (TileEntityException e) { });
}
return ActionResultType.PASS;
} }
@Override @Override

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.logistics.block.redstone; package com.simibubi.create.content.logistics.block.redstone;
import java.util.Random;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; 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.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
@ -82,11 +85,14 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE<Stockpi
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
if (side == blockState.get(HORIZONTAL_FACING).getOpposite()) if (side == blockState.get(HORIZONTAL_FACING).getOpposite())
return 0; return 0;
try { return getTileEntityOptional(blockAccess, pos).filter(StockpileSwitchTileEntity::isPowered)
return getTileEntity(blockAccess, pos).isPowered() ? 15 : 0; .map($ -> 15)
} catch (TileEntityException e) { .orElse(0);
} }
return 0;
@Override
public void scheduledTick(BlockState blockState, ServerWorld world, BlockPos pos, Random random) {
getTileEntityOptional(world, pos).ifPresent(StockpileSwitchTileEntity::updatePowerAfterDelay);
} }
@Override @Override

View file

@ -14,6 +14,7 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.TickPriority;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
public class StockpileSwitchTileEntity extends SmartTileEntity { public class StockpileSwitchTileEntity extends SmartTileEntity {
@ -23,6 +24,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
public float currentLevel; public float currentLevel;
private boolean state; private boolean state;
private boolean inverted; private boolean inverted;
private boolean poweredAfterDelay;
private FilteringBehaviour filtering; private FilteringBehaviour filtering;
private InvManipulationBehaviour observedInventory; private InvManipulationBehaviour observedInventory;
@ -34,6 +36,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
currentLevel = -1; currentLevel = -1;
state = false; state = false;
inverted = false; inverted = false;
poweredAfterDelay = false;
setLazyTickRate(10); setLazyTickRate(10);
} }
@ -44,6 +47,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
currentLevel = compound.getFloat("Current"); currentLevel = compound.getFloat("Current");
state = compound.getBoolean("Powered"); state = compound.getBoolean("Powered");
inverted = compound.getBoolean("Inverted"); inverted = compound.getBoolean("Inverted");
poweredAfterDelay = compound.getBoolean("PoweredAfterDelay");
super.fromTag(blockState, compound, clientPacket); super.fromTag(blockState, compound, clientPacket);
} }
@ -54,6 +58,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
compound.putFloat("Current", currentLevel); compound.putFloat("Current", currentLevel);
compound.putBoolean("Powered", state); compound.putBoolean("Powered", state);
compound.putBoolean("Inverted", inverted); compound.putBoolean("Inverted", inverted);
compound.putBoolean("PoweredAfterDelay", poweredAfterDelay);
super.write(compound, clientPacket); super.write(compound, clientPacket);
} }
@ -110,8 +115,10 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
if (currentLevel > 0) if (currentLevel > 0)
displayLevel = (int) (currentLevel * 6); displayLevel = (int) (currentLevel * 6);
world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, displayLevel), update ? 3 : 2); 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) if (changed || update)
sendData(); sendData();
} }
@ -142,10 +149,19 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
return state; return state;
} }
public boolean isPowered() { public boolean shouldBePowered() {
return inverted != state; return inverted != state;
} }
public void updatePowerAfterDelay() {
poweredAfterDelay = shouldBePowered();
world.updateNeighbors(pos, getBlockState().getBlock());
}
public boolean isPowered() {
return poweredAfterDelay;
}
public boolean isInverted() { public boolean isInverted() {
return inverted; return inverted;
} }

View file

@ -5,8 +5,8 @@ import java.util.Vector;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler.Mode; import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler.Mode;
import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer;
import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.logistics.item; 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.model.IBakedModel;
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;

View file

@ -38,7 +38,8 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen<LinkedCo
@Override @Override
protected void drawMouseoverTooltip(MatrixStack ms, int x, int y) { protected void drawMouseoverTooltip(MatrixStack ms, int x, int y) {
if (!this.client.player.inventory.getItemStack() if (!this.client.player.inventory.getItemStack()
.isEmpty() || this.hoveredSlot == null || this.hoveredSlot.getHasStack()) { .isEmpty() || this.hoveredSlot == null || this.hoveredSlot.getHasStack()
|| hoveredSlot.inventory == container.playerInventory) {
super.drawMouseoverTooltip(ms, x, y); super.drawMouseoverTooltip(ms, x, y);
return; return;
} }
@ -48,6 +49,8 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen<LinkedCo
@Override @Override
public List<ITextComponent> getTooltipFromItem(ItemStack stack) { public List<ITextComponent> getTooltipFromItem(ItemStack stack) {
List<ITextComponent> list = super.getTooltipFromItem(stack); List<ITextComponent> list = super.getTooltipFromItem(stack);
if (hoveredSlot.inventory == container.playerInventory)
return list;
return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex()) : list; return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex()) : list;
} }

View file

@ -1,145 +1,58 @@
package com.simibubi.create.content.logistics.item.filter; 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.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.container.ClickType; import net.minecraft.inventory.container.ClickType;
import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.ContainerType; import net.minecraft.inventory.container.ContainerType;
import net.minecraft.inventory.container.Slot;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.api.distmarker.OnlyIn;
public abstract class AbstractFilterContainer extends Container implements IClearableContainer { public abstract class AbstractFilterContainer extends GhostItemContainer<ItemStack> {
public PlayerEntity player;
protected PlayerInventory playerInventory;
public ItemStack filterItem;
public ItemStackHandler filterInventory;
protected AbstractFilterContainer(ContainerType<?> type, int id, PlayerInventory inv, PacketBuffer extraData) { 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) { protected AbstractFilterContainer(ContainerType<?> type, int id, PlayerInventory inv, ItemStack contentHolder) {
super(type, id); super(type, id, inv, contentHolder);
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;
} }
@Override @Override
public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) {
if (slotId == playerInventory.currentItem && clickTypeIn != ClickType.THROW) if (slotId == playerInventory.currentItem && clickTypeIn != ClickType.THROW)
return ItemStack.EMPTY; return ItemStack.EMPTY;
ItemStack held = playerInventory.getItemStack();
if (slotId < 36)
return super.slotClick(slotId, dragType, clickTypeIn, player); 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;
} }
@Override @Override
public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { protected boolean allowRepeats() {
if (index < 36) { return false;
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;
} }
@Override @Override
public void onContainerClosed(PlayerEntity playerIn) { @OnlyIn(Dist.CLIENT)
super.onContainerClosed(playerIn); protected ItemStack createOnClient(PacketBuffer extraData) {
filterItem.getOrCreateTag().put("Items", filterInventory.serializeNBT()); return extraData.readItemStack();
saveData(filterItem); }
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());
} }
} }

View file

@ -66,9 +66,9 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
int invY = y + background.height + 10; int invY = y + background.height + 10;
PLAYER_INVENTORY.draw(ms, this, invX, invY); PLAYER_INVENTORY.draw(ms, this, invX, invY);
textRenderer.draw(ms, playerInventory.getDisplayName(), invX + 7, invY + 6, 0x666666); 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)
.<GuiGameElement.GuiRenderBuilder>at(x + background.width, guiTop + background.height - 60, -200) .<GuiGameElement.GuiRenderBuilder>at(x + background.width, guiTop + background.height - 60, -200)
.scale(5) .scale(5)
.render(ms); .render(ms);
@ -82,7 +82,7 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
handleIndicators(); handleIndicators();
if (!container.player.getHeldItemMainhand() if (!container.player.getHeldItemMainhand()
.equals(container.filterItem, false)) .equals(container.contentHolder, false))
client.player.closeScreen(); client.player.closeScreen();
} }

View file

@ -53,22 +53,22 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
} }
@Override @Override
protected void init() { protected void init(PlayerInventory inv, ItemStack contentHolder) {
super.init(); super.init(inv, contentHolder);
ItemStack stack = new ItemStack(Items.NAME_TAG); ItemStack stack = new ItemStack(Items.NAME_TAG);
stack.setDisplayName( stack.setDisplayName(
new StringTextComponent("Selected Tags").formatted(TextFormatting.RESET, TextFormatting.BLUE)); new StringTextComponent("Selected Tags").formatted(TextFormatting.RESET, TextFormatting.BLUE));
filterInventory.setStackInSlot(1, stack); ghostInventory.setStackInSlot(1, stack);
} }
@Override @Override
protected ItemStackHandler createFilterInventory() { protected ItemStackHandler createGhostInventory() {
return new ItemStackHandler(2); return new ItemStackHandler(2);
} }
protected void addFilterSlots() { protected void addFilterSlots() {
this.addSlot(new SlotItemHandler(filterInventory, 0, -34, 22)); this.addSlot(new SlotItemHandler(ghostInventory, 0, -34, 22));
this.addSlot(new SlotItemHandler(filterInventory, 1, -28, 57) { this.addSlot(new SlotItemHandler(ghostInventory, 1, -28, 57) {
@Override @Override
public boolean canTakeStack(PlayerEntity playerIn) { public boolean canTakeStack(PlayerEntity playerIn) {
return false; return false;
@ -102,20 +102,20 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
if (index == 37) if (index == 37)
return ItemStack.EMPTY; return ItemStack.EMPTY;
if (index == 36) { if (index == 36) {
filterInventory.setStackInSlot(37, ItemStack.EMPTY); ghostInventory.setStackInSlot(37, ItemStack.EMPTY);
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
if (index < 36) { if (index < 36) {
ItemStack stackToInsert = playerInventory.getStackInSlot(index); ItemStack stackToInsert = playerInventory.getStackInSlot(index);
ItemStack copy = stackToInsert.copy(); ItemStack copy = stackToInsert.copy();
copy.setCount(1); copy.setCount(1);
filterInventory.setStackInSlot(0, copy); ghostInventory.setStackInSlot(0, copy);
} }
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@Override @Override
protected int getInventoryOffset() { protected int getPlayerInventoryXOffset() {
return 83; return 83;
} }
@ -134,6 +134,7 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
@Override @Override
protected void saveData(ItemStack filterItem) { protected void saveData(ItemStack filterItem) {
super.saveData(filterItem);
filterItem.getOrCreateTag() filterItem.getOrCreateTag()
.putInt("WhitelistMode", whitelistMode.ordinal()); .putInt("WhitelistMode", whitelistMode.ordinal());
ListNBT attributes = new ListNBT(); ListNBT attributes = new ListNBT();
@ -141,7 +142,8 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
if (at == null) if (at == null)
return; return;
CompoundNBT compoundNBT = new CompoundNBT(); CompoundNBT compoundNBT = new CompoundNBT();
at.getFirst().serializeNBT(compoundNBT); at.getFirst()
.serializeNBT(compoundNBT);
compoundNBT.putBoolean("Inverted", at.getSecond()); compoundNBT.putBoolean("Inverted", at.getSecond());
attributes.add(compoundNBT); attributes.add(compoundNBT);
}); });

View file

@ -91,7 +91,7 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
attributeSelector = new SelectionScrollInput(x + 39, y + 21, 137, 18); attributeSelector = new SelectionScrollInput(x + 39, y + 21, 137, 18);
attributeSelector.forOptions(Arrays.asList(StringTextComponent.EMPTY)); attributeSelector.forOptions(Arrays.asList(StringTextComponent.EMPTY));
attributeSelector.removeCallback(); attributeSelector.removeCallback();
referenceItemChanged(container.filterInventory.getStackInSlot(0)); referenceItemChanged(container.ghostInventory.getStackInSlot(0));
widgets.add(attributeSelector); widgets.add(attributeSelector);
widgets.add(attributeSelectorLabel); widgets.add(attributeSelectorLabel);
@ -160,7 +160,7 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
@Override @Override
public void renderWindowForeground(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { public void renderWindowForeground(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
ItemStack stack = container.filterInventory.getStackInSlot(1); ItemStack stack = container.ghostInventory.getStackInSlot(1);
matrixStack.push(); matrixStack.push();
matrixStack.translate(0.0F, 0.0F, 32.0F); matrixStack.translate(0.0F, 0.0F, 32.0F);
this.setZOffset(200); this.setZOffset(200);
@ -177,7 +177,7 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
@Override @Override
public void tick() { public void tick() {
super.tick(); super.tick();
ItemStack stackInSlot = container.filterInventory.getStackInSlot(0); ItemStack stackInSlot = container.ghostInventory.getStackInSlot(0);
if (!stackInSlot.equals(lastItemScanned, false)) if (!stackInSlot.equals(lastItemScanned, false))
referenceItemChanged(stackInSlot); referenceItemChanged(stackInSlot);
} }

View file

@ -31,19 +31,18 @@ public class FilterContainer extends AbstractFilterContainer {
protected void addFilterSlots() { protected void addFilterSlots() {
int x = -27; int x = -27;
int y = 20; int y = 20;
for (int row = 0; row < 2; ++row) for (int row = 0; row < 2; ++row)
for (int col = 0; col < 9; ++col) for (int col = 0; col < 9; ++col)
this.addSlot(new SlotItemHandler(filterInventory, col + row * 9, x + col * 18, y + row * 18)); this.addSlot(new SlotItemHandler(ghostInventory, col + row * 9, x + col * 18, y + row * 18));
} }
@Override @Override
protected ItemStackHandler createFilterInventory() { protected ItemStackHandler createGhostInventory() {
return FilterItem.getFilterItems(filterItem); return FilterItem.getFilterItems(contentHolder);
} }
@Override @Override
protected int getInventoryOffset() { protected int getPlayerInventoryXOffset() {
return 97; return 97;
} }
@ -56,6 +55,7 @@ public class FilterContainer extends AbstractFilterContainer {
@Override @Override
protected void saveData(ItemStack filterItem) { protected void saveData(ItemStack filterItem) {
super.saveData(filterItem);
CompoundNBT tag = filterItem.getOrCreateTag(); CompoundNBT tag = filterItem.getOrCreateTag();
tag.putBoolean("RespectNBT", respectNBT); tag.putBoolean("RespectNBT", respectNBT);
tag.putBoolean("Blacklist", blacklist); tag.putBoolean("Blacklist", blacklist);

View file

@ -57,7 +57,7 @@ public class FilterScreenPacket extends SimplePacketBase {
if (option == Option.IGNORE_DATA) if (option == Option.IGNORE_DATA)
c.respectNBT = false; c.respectNBT = false;
if (option == Option.UPDATE_FILTER_ITEM) if (option == Option.UPDATE_FILTER_ITEM)
c.filterInventory.setStackInSlot( c.ghostInventory.setStackInSlot(
data.getInt("Slot"), data.getInt("Slot"),
net.minecraft.item.ItemStack.read(data.getCompound("Item"))); net.minecraft.item.ItemStack.read(data.getCompound("Item")));
} }

View file

@ -3,10 +3,10 @@ package com.simibubi.create.content.palettes;
import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.simibubi.create.AllColorHandlers;
import com.simibubi.create.AllTags; import com.simibubi.create.AllTags;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.utility.ColorHandlers;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.BlockBuilder;
import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.DataIngredient;
@ -41,7 +41,7 @@ public class PalettesVariantEntry {
if (pattern == PaletteBlockPattern.COBBLESTONE) if (pattern == PaletteBlockPattern.COBBLESTONE)
builder.item().tag(AllTags.AllItemTags.COBBLESTONE.tag); builder.item().tag(AllTags.AllItemTags.COBBLESTONE.tag);
if (pattern.hasFoliage()) if (pattern.hasFoliage())
builder.onRegister(CreateRegistrate.blockColors(() -> AllColorHandlers::getGrassyBlock)); builder.color(() -> ColorHandlers::getGrassyBlock);
pattern.createCTBehaviour(variant) pattern.createCTBehaviour(variant)
.ifPresent(b -> builder.onRegister(connectedTextures(b))); .ifPresent(b -> builder.onRegister(connectedTextures(b)));
@ -53,7 +53,7 @@ public class PalettesVariantEntry {
if (pattern.hasFoliage()) if (pattern.hasFoliage())
builder.item() builder.item()
.onRegister(CreateRegistrate.itemColors(() -> AllColorHandlers::getGrassyItem)) .color(() -> ColorHandlers::getGrassyItem)
.build(); .build();
else else
builder.simpleItem(); builder.simpleItem();

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.palettes; 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; import com.simibubi.create.foundation.utility.ColorHelper;
public class ScoriaVertexColor implements IBlockVertexColor { public class ScoriaVertexColor implements IBlockVertexColor {

View file

@ -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.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler;
import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer; 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.tools.ExtendoGripRenderHandler;
import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.curiosities.zapper.ZapperItem;
import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler;
@ -141,6 +142,7 @@ public class ClientEvents {
CreateClient.OUTLINER.tickOutlines(); CreateClient.OUTLINER.tickOutlines();
CreateClient.GHOST_BLOCKS.tickGhosts(); CreateClient.GHOST_BLOCKS.tickGhosts();
ContraptionRenderDispatcher.tick(); ContraptionRenderDispatcher.tick();
BlueprintOverlayRenderer.tick();
} }
@SubscribeEvent @SubscribeEvent
@ -218,6 +220,7 @@ public class ClientEvents {
float partialTicks) { float partialTicks) {
CreateClient.SCHEMATIC_HANDLER.renderOverlay(ms, buffer, light, overlay, partialTicks); CreateClient.SCHEMATIC_HANDLER.renderOverlay(ms, buffer, light, overlay, partialTicks);
LinkedControllerClientHandler.renderOverlay(ms, buffer, light, overlay, partialTicks); LinkedControllerClientHandler.renderOverlay(ms, buffer, light, overlay, partialTicks);
BlueprintOverlayRenderer.renderOverlay(ms, buffer, light, overlay, partialTicks);
} }
@SubscribeEvent @SubscribeEvent

View file

@ -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<T extends Block> {
private static final int COLOR_AMOUNT = DyeColor.values().length;
private final BlockEntry<?>[] values = new BlockEntry<?>[COLOR_AMOUNT];
public DyedBlockList(Function<DyeColor, BlockEntry<? extends T>> filler) {
for (DyeColor color : DyeColor.values()) {
values[color.ordinal()] = filler.apply(color);
}
}
@SuppressWarnings("unchecked")
public BlockEntry<T> get(DyeColor color) {
return (BlockEntry<T>) values[color.ordinal()];
}
@SuppressWarnings("unchecked")
public BlockEntry<T>[] toArray() {
return (BlockEntry<T>[]) Arrays.copyOf(values, values.length);
}
}

View file

@ -2,102 +2,44 @@ package com.simibubi.create.foundation.block;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
import com.simibubi.create.Create; import javax.annotation.Nullable;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.utility.WorldHelper;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ActionResultType;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
public interface ITE<T extends TileEntity> { public interface ITE<T extends TileEntity> {
Class<T> getTileEntityClass(); Class<T> getTileEntityClass();
default void withTileEntityDo(IBlockReader world, BlockPos pos, Consumer<T> action) { default void withTileEntityDo(IBlockReader world, BlockPos pos, Consumer<T> action) {
try { getTileEntityOptional(world, pos).ifPresent(action);
action.accept(getTileEntity(world, pos));
} catch (TileEntityException e) {
} }
default ActionResultType onTileEntityUse(IBlockReader world, BlockPos pos, Function<T, ActionResultType> action) {
return getTileEntityOptional(world, pos).map(action)
.orElse(ActionResultType.PASS);
} }
default Optional<T> getTileEntityOptional(IBlockReader world, BlockPos pos) { default Optional<T> getTileEntityOptional(IBlockReader world, BlockPos pos) {
try { return Optional.ofNullable(getTileEntity(world, pos));
return Optional.of(getTileEntity(world, pos));
} catch (TileEntityException e) {
}
return Optional.empty();
} }
@Nullable
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
default T getTileEntity(IBlockReader worldIn, BlockPos pos) throws TileEntityException { default T getTileEntity(IBlockReader worldIn, BlockPos pos) {
TileEntity tileEntity = worldIn.getTileEntity(pos); TileEntity tileEntity = worldIn.getTileEntity(pos);
Class<T> expectedClass = getTileEntityClass(); Class<T> expectedClass = getTileEntityClass();
IWorld world = null;
if (worldIn instanceof IWorld)
world = (IWorld) worldIn;
if (tileEntity == null) if (tileEntity == null)
throw new MissingTileEntityException(world, pos, expectedClass); return null;
if (!expectedClass.isInstance(tileEntity)) if (!expectedClass.isInstance(tileEntity))
throw new InvalidTileEntityException(world, pos, expectedClass, tileEntity.getClass()); return null;
return (T) tileEntity; 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);
}
} }

View file

@ -13,15 +13,15 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; 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 { public class ItemUseOverrides {
private static final Set<ResourceLocation> overrides = new HashSet<>(); private static final Set<ResourceLocation> OVERRIDES = new HashSet<>();
public static void addBlock(Block block) { public static void addBlock(Block block) {
overrides.add(block.getRegistryName()); OVERRIDES.add(block.getRegistryName());
} }
@SubscribeEvent @SubscribeEvent
@ -34,7 +34,7 @@ public class ItemUseOverrides {
ResourceLocation id = state.getBlock() ResourceLocation id = state.getBlock()
.getRegistryName(); .getRegistryName();
if (!overrides.contains(id)) if (!OVERRIDES.contains(id))
return; return;
BlockRayTraceResult blockTrace = BlockRayTraceResult blockTrace =
@ -46,6 +46,6 @@ public class ItemUseOverrides {
event.setCanceled(true); event.setCanceled(true);
event.setCancellationResult(result); event.setCancellationResult(result);
} }
} }

View file

@ -4,8 +4,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import com.simibubi.create.foundation.block.IBlockVertexColor;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.foundation.block; package com.simibubi.create.foundation.block.render;
@FunctionalInterface @FunctionalInterface
public interface IBlockVertexColor { public interface IBlockVertexColor {

View file

@ -3,7 +3,6 @@ package com.simibubi.create.foundation.config;
public class CCommon extends ConfigBase { public class CCommon extends ConfigBase {
public CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); public CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen);
public ConfigBool logTeErrors = b(false, "logTeErrors", Comments.logTeErrors);
@Override @Override
public String getName() { public String getName() {
@ -12,7 +11,6 @@ public class CCommon extends ConfigBase {
private static class Comments { private static class Comments {
static String worldGen = "Modify Create's impact on your terrain"; static String worldGen = "Modify Create's impact on your terrain";
static String logTeErrors = "Forward caught TileEntityExceptions to the log at debug level.";
} }
} }

View file

@ -5,12 +5,14 @@ import javax.annotation.Nullable;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.foundation.config.AllConfigs; 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.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.TextStencilElement; import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.widgets.BoxWidget;
import com.simibubi.create.foundation.item.TooltipHelper;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
@ -32,6 +34,7 @@ public class BaseConfigScreen extends ConfigScreen {
BoxWidget clientConfigWidget; BoxWidget clientConfigWidget;
BoxWidget commonConfigWidget; BoxWidget commonConfigWidget;
BoxWidget serverConfigWidget; BoxWidget serverConfigWidget;
BoxWidget goBack;
ForgeConfigSpec clientSpec; ForgeConfigSpec clientSpec;
ForgeConfigSpec commonSpec; ForgeConfigSpec commonSpec;
@ -40,6 +43,7 @@ public class BaseConfigScreen extends ConfigScreen {
String commonTile = "COMMON CONFIG"; String commonTile = "COMMON CONFIG";
String serverTile = "SERVER CONFIG"; String serverTile = "SERVER CONFIG";
String modID = Create.ID; String modID = Create.ID;
protected boolean returnOnClose;
/** /**
* If you are a Create Addon dev and want to make use of the same GUI * 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() { protected void init() {
widgets.clear(); widgets.clear();
super.init(); 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)); widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16).showingElement(clientText));
if (clientSpec != null) { 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)); clientText.withElementRenderer(BoxWidget.gradientFactory.apply(clientConfigWidget));
} else { } else {
clientConfigWidget.active = false; clientConfigWidget.active = false;
@ -120,11 +125,11 @@ public class BaseConfigScreen extends ConfigScreen {
clientText.withElementRenderer(DISABLED_RENDERER); 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)); widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16).showingElement(commonText));
if (commonSpec != null) { 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)); commonText.withElementRenderer(BoxWidget.gradientFactory.apply(commonConfigWidget));
} else { } else {
commonConfigWidget.active = false; commonConfigWidget.active = false;
@ -132,18 +137,46 @@ public class BaseConfigScreen extends ConfigScreen {
commonText.withElementRenderer(DISABLED_RENDERER); 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)); widgets.add(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16).showingElement(serverText));
if (serverSpec != null && Minecraft.getInstance().world != null) { 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)); serverText.withElementRenderer(BoxWidget.gradientFactory.apply(serverConfigWidget));
} else { } else {
serverConfigWidget.active = false; serverConfigWidget.active = false;
serverConfigWidget.updateColorsFromState(); serverConfigWidget.updateColorsFromState();
serverText.withElementRenderer(DISABLED_RENDERER); 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; 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);
}
} }

View file

@ -135,7 +135,8 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
@Override @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) { 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(); IFormattableTextComponent component = label.getComponent();
FontRenderer font = Minecraft.getInstance().fontRenderer; FontRenderer font = Minecraft.getInstance().fontRenderer;
if (font.getWidth(component) > getLabelWidth(width) - 10) { if (font.getWidth(component) > getLabelWidth(width) - 10) {

View file

@ -7,6 +7,8 @@ import java.util.stream.Collectors;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.config.AllConfigs; 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.Minecraft;
import net.minecraft.client.gui.screen.IngameMenuScreen; 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.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; 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 static ItemStack icon = AllItems.GOGGLES.asStack();
public OpenConfigButton(int x, int y) { public OpenCreateMenuButton(int x, int y) {
super(x, y, 20, 20, StringTextComponent.EMPTY, OpenConfigButton::click); super(x, y, 20, 20, StringTextComponent.EMPTY, OpenCreateMenuButton::click);
} }
@Override @Override
@ -36,7 +38,7 @@ public class OpenConfigButton extends Button {
} }
public static void click(Button b) { 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 { public static class SingleMenuRow {
@ -102,7 +104,7 @@ public class OpenConfigButton extends Button {
.filter(w -> w.getMessage().getString().equals(target)) .filter(w -> w.getMessage().getString().equals(target))
.findFirst() .findFirst()
.ifPresent(w -> event.addWidget( .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)
)); ));
} }
} }

View file

@ -1,9 +1,11 @@
package com.simibubi.create.foundation.config.ui; 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.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -14,6 +16,7 @@ import com.electronwill.nightconfig.core.AbstractConfig;
import com.electronwill.nightconfig.core.UnmodifiableConfig; import com.electronwill.nightconfig.core.UnmodifiableConfig;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.mojang.blaze3d.matrix.MatrixStack; 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.BooleanEntry;
import com.simibubi.create.foundation.config.ui.entries.EnumEntry; import com.simibubi.create.foundation.config.ui.entries.EnumEntry;
import com.simibubi.create.foundation.config.ui.entries.NumberEntry; 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.config.ui.entries.ValueEntry;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.ConfirmationScreen; 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.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
@ -161,8 +165,8 @@ public class SubMenuConfigScreen extends ConfigScreen {
.withPadding(2, 2) .withPadding(2, 2)
.withCallback((x, y) -> .withCallback((x, y) ->
new ConfirmationScreen() new ConfirmationScreen()
.at(x, y) .centered()
.withText(ITextProperties.plain("You are about to reset all settings for the " + type.toString() + " config. Are you sure?")) .withText(ITextProperties.plain("Resetting all settings of the " + type.toString() + " config. Are you sure?"))
.withAction(success -> { .withAction(success -> {
if (success) if (success)
resetConfig(spec.getValues()); 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.showingElement(AllIcons.I_CONFIG_RESET.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(resetAll)));
resetAll.getToolTip().add(new StringTextComponent("Reset All")); 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) saveChanges = new BoxWidget(listL - 30, yCenter - 25, 20, 20)
.withPadding(2, 2) .withPadding(2, 2)
@ -181,8 +185,8 @@ public class SubMenuConfigScreen extends ConfigScreen {
return; return;
new ConfirmationScreen() new ConfirmationScreen()
.at(x, y) .centered()
.withText(ITextProperties.plain("You are about to change " + changes.size() + " value" + (changes.size() != 1 ? "s" : "") + ". Are you sure?")) .withText(ITextProperties.plain("Saving " + changes.size() + " changed value" + (changes.size() != 1 ? "s" : "") + ""))
.withAction(success -> { .withAction(success -> {
if (success) if (success)
saveChanges(); saveChanges();
@ -200,8 +204,8 @@ public class SubMenuConfigScreen extends ConfigScreen {
return; return;
new ConfirmationScreen() new ConfirmationScreen()
.at(x, y) .centered()
.withText(ITextProperties.plain("You are about to discard " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + ". Are you sure?")) .withText(ITextProperties.plain("Discarding " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + ""))
.withAction(success -> { .withAction(success -> {
if (success) if (success)
clearChanges(); clearChanges();
@ -234,6 +238,10 @@ public class SubMenuConfigScreen extends ConfigScreen {
if (obj instanceof AbstractConfig) { if (obj instanceof AbstractConfig) {
SubMenuEntry entry = new SubMenuEntry(this, humanKey, spec, (UnmodifiableConfig) obj); SubMenuEntry entry = new SubMenuEntry(this, humanKey, spec, (UnmodifiableConfig) obj);
list.children().add(entry); 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<?>) { } else if (obj instanceof ForgeConfigSpec.ConfigValue<?>) {
ForgeConfigSpec.ConfigValue<?> configValue = (ForgeConfigSpec.ConfigValue<?>) obj; 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 //extras for server configs
if (type != ModConfig.Type.SERVER) if (type != ModConfig.Type.SERVER)
return; return;
if (client.isSingleplayer())
return;
list.isForServer = true; list.isForServer = true;
boolean canEdit = client != null && client.player != null && client.player.hasPermissionLevel(2); boolean canEdit = client != null && client.player != null && client.player.hasPermissionLevel(2);
@ -275,6 +299,7 @@ public class SubMenuConfigScreen extends ConfigScreen {
.withPadding(2, 2) .withPadding(2, 2)
.showingElement(stencil); .showingElement(stencil);
if (!canEdit) { if (!canEdit) {
list.children().forEach(e -> e.setEditable(false)); list.children().forEach(e -> e.setEditable(false));
resetAll.active = 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)); stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, red));
serverLocked.withBorderColors(red); serverLocked.withBorderColors(red);
serverLocked.getToolTip().add(new StringTextComponent("Locked").formatted(TextFormatting.BOLD)); 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 { } else {
stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_UNLOCKED.draw(ms, 0, 0)); 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)); 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) { protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
super.renderWindow(ms, mouseX, mouseY, partialTicks); super.renderWindow(ms, mouseX, mouseY, partialTicks);
int x = width/2; 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)); 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); list.render(ms, mouseX, mouseY, partialTicks);
} }
@ -338,42 +363,49 @@ public class SubMenuConfigScreen extends ConfigScreen {
} }
private void attemptBackstep() { private void attemptBackstep() {
if (!changes.isEmpty() && parent instanceof BaseConfigScreen) { if (changes.isEmpty() || !(parent instanceof BaseConfigScreen)) {
new ConfirmationScreen() ScreenOpener.open(parent);
.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; return;
}
Consumer<ConfirmationScreen.Response> action = success -> {
if (success == Response.Cancel)
return;
if (success == Response.Confirm)
saveChanges();
changes.clear(); changes.clear();
ScreenOpener.open(parent); ScreenOpener.open(parent);
}) };
.open(this);
} else { showLeavingPrompt(action);
ScreenOpener.open(parent);
}
} }
@Override @Override
public void onClose() { public void onClose() {
if (changes.isEmpty()) { if (changes.isEmpty()) {
super.onClose(); super.onClose();
ScreenOpener.open(parent);
return; return;
} }
new ConfirmationScreen() Consumer<ConfirmationScreen.Response> action = success -> {
.centered() if (success == Response.Cancel)
.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; return;
if (success == Response.Confirm)
saveChanges();
changes.clear(); changes.clear();
super.onClose(); super.onClose();
}) };
showLeavingPrompt(action);
}
public void showLeavingPrompt(Consumer<ConfirmationScreen.Response> action) {
new ConfirmationScreen().centered()
.addText(ITextProperties.plain("Leaving with " + changes.size() + " unsaved change"
+ (changes.size() != 1 ? "s" : "") + " for this config"))
.withThreeActions(action)
.open(this); .open(this);
} }
} }

View file

@ -1,5 +1,7 @@
package com.simibubi.create.foundation.config.ui.entries; package com.simibubi.create.foundation.config.ui.entries;
import java.util.Locale;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.BoxElement; import com.simibubi.create.foundation.gui.BoxElement;
@ -78,7 +80,7 @@ public class EnumEntry extends ValueEntry<Enum<?>> {
cycleLeft.y = y + 10; cycleLeft.y = y + 10;
cycleLeft.render(ms, mouseX, mouseY, partialTicks); cycleLeft.render(ms, mouseX, mouseY, partialTicks);
valueText.at(cycleLeft.x + cycleWidth - 8, y + 11, 200) valueText.at(cycleLeft.x + cycleWidth - 8, y + 10, 200)
.withBounds(width - getLabelWidth(width) - 2 * cycleWidth - resetWidth - 4, 16) .withBounds(width - getLabelWidth(width) - 2 * cycleWidth - resetWidth - 4, 16)
.render(ms); .render(ms);
@ -97,6 +99,10 @@ public class EnumEntry extends ValueEntry<Enum<?>> {
@Override @Override
public void onValueChange(Enum<?> newValue) { public void onValueChange(Enum<?> newValue) {
super.onValueChange(newValue); super.onValueChange(newValue);
valueText.withText(newValue.name()); valueText.withText(newValue.name()
.substring(0, 1)
+ newValue.name()
.substring(1)
.toLowerCase(Locale.ROOT));
} }
} }

View file

@ -10,6 +10,7 @@ import javax.annotation.Nonnull;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import com.google.common.base.Predicates;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.config.ui.ConfigHelper; import com.simibubi.create.foundation.config.ui.ConfigHelper;
import com.simibubi.create.foundation.config.ui.ConfigScreen; 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.AllIcons;
import com.simibubi.create.foundation.gui.DelegatedStencilElement; import com.simibubi.create.foundation.gui.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; 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.IFormattableTextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
@ -52,7 +54,7 @@ public class ValueEntry<T> extends ConfigScreenList.LabeledEntry {
listeners.add(resetButton); listeners.add(resetButton);
List<String> path = value.getPath(); List<String> 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(); String comment = spec.getComment();
if (comment == null || comment.isEmpty()) if (comment == null || comment.isEmpty())
return; return;
@ -76,8 +78,14 @@ public class ValueEntry<T> extends ConfigScreenList.LabeledEntry {
u = "in SU"; u = "in SU";
unit = u; unit = u;
} }
//add comment to tooltip // add comment to tooltip
labelTooltip.addAll(Arrays.stream(commentLines).map(StringTextComponent::new).collect(Collectors.toList())); 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 @Override

View file

@ -14,11 +14,11 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.content.AllSections; import com.simibubi.create.content.AllSections;
import com.simibubi.create.content.contraptions.fluids.VirtualFluid; import com.simibubi.create.content.contraptions.fluids.VirtualFluid;
import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; 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.CTModel;
import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour;
import com.simibubi.create.foundation.block.render.ColoredVertexModel; 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.AbstractRegistrate;
import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.BlockBuilder;
import com.tterrag.registrate.builders.Builder; 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.AbstractBlock.Properties;
import net.minecraft.block.Block; 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.client.renderer.model.IBakedModel;
import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluid;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.IItemProvider;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidAttributes;
@ -114,7 +111,7 @@ public class CreateRegistrate extends AbstractRegistrate<CreateRegistrate> {
public <T extends TileEntity> CreateTileEntityBuilder<T, CreateRegistrate> tileEntity(String name, public <T extends TileEntity> CreateTileEntityBuilder<T, CreateRegistrate> tileEntity(String name,
NonNullFunction<TileEntityType<T>, ? extends T> factory) { NonNullFunction<TileEntityType<T>, ? extends T> factory) {
return this.tileEntity(this.self(), name, (NonNullFunction) factory); return this.tileEntity(this.self(), name, factory);
} }
@Override @Override
@ -177,28 +174,20 @@ public class CreateRegistrate extends AbstractRegistrate<CreateRegistrate> {
return entry -> onClient(() -> () -> registerCasingConnectivity(entry, consumer)); return entry -> onClient(() -> () -> registerCasingConnectivity(entry, consumer));
} }
public static <T extends Block> NonNullConsumer<? super T> blockVertexColors(IBlockVertexColor colorFunc) {
return entry -> onClient(() -> () -> registerBlockVertexColor(entry, colorFunc));
}
public static <T extends Block> NonNullConsumer<? super T> blockModel( public static <T extends Block> NonNullConsumer<? super T> blockModel(
Supplier<NonNullFunction<IBakedModel, ? extends IBakedModel>> func) { Supplier<NonNullFunction<IBakedModel, ? extends IBakedModel>> func) {
return entry -> onClient(() -> () -> registerBlockModel(entry, func)); return entry -> onClient(() -> () -> registerBlockModel(entry, func));
} }
public static <T extends Block> NonNullConsumer<? super T> blockColors(Supplier<Supplier<IBlockColor>> colorFunc) {
return entry -> onClient(() -> () -> registerBlockColor(entry, colorFunc));
}
public static <T extends Block> NonNullConsumer<? super T> blockVertexColors(IBlockVertexColor colorFunc) {
return entry -> onClient(() -> () -> registerBlockVertexColor(entry, colorFunc));
}
public static <T extends Item> NonNullConsumer<? super T> itemModel( public static <T extends Item> NonNullConsumer<? super T> itemModel(
Supplier<NonNullFunction<IBakedModel, ? extends IBakedModel>> func) { Supplier<NonNullFunction<IBakedModel, ? extends IBakedModel>> func) {
return entry -> onClient(() -> () -> registerItemModel(entry, func)); return entry -> onClient(() -> () -> registerItemModel(entry, func));
} }
public static <T extends Item> NonNullConsumer<? super T> itemColors(Supplier<Supplier<IItemColor>> colorFunc) {
return entry -> onClient(() -> () -> registerItemColor(entry, colorFunc));
}
public static <T extends Item, P> NonNullUnaryOperator<ItemBuilder<T, P>> customRenderedItem( public static <T extends Item, P> NonNullUnaryOperator<ItemBuilder<T, P>> customRenderedItem(
Supplier<NonNullFunction<IBakedModel, ? extends CustomRenderedItemModel>> func) { Supplier<NonNullFunction<IBakedModel, ? extends CustomRenderedItemModel>> func) {
return b -> b.properties(p -> p.setISTER(() -> () -> func.get() return b -> b.properties(p -> p.setISTER(() -> () -> func.get()
@ -250,18 +239,4 @@ public class CreateRegistrate extends AbstractRegistrate<CreateRegistrate> {
.register(entry.delegate, func.get()); .register(entry.delegate, func.get());
} }
@OnlyIn(Dist.CLIENT)
private static void registerBlockColor(Block entry, Supplier<Supplier<IBlockColor>> colorFunc) {
CreateClient.getColorHandler()
.register(entry, colorFunc.get()
.get());
}
@OnlyIn(Dist.CLIENT)
private static void registerItemColor(IItemProvider entry, Supplier<Supplier<IItemColor>> colorFunc) {
CreateClient.getColorHandler()
.register(entry, colorFunc.get()
.get());
}
} }

View file

@ -1,6 +1,6 @@
package com.simibubi.create.foundation.gui; package com.simibubi.create.foundation.gui;
import java.awt.Color; import java.awt.*;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.Create; import com.simibubi.create.Create;
@ -20,6 +20,8 @@ public enum AllGuiTextures implements IScreenRenderable {
TERRAINZAPPER("curiosities.png", 234, 103), TERRAINZAPPER("curiosities.png", 234, 103),
TERRAINZAPPER_INACTIVE_PARAM("curiosities.png", 238, 0, 18, 18), TERRAINZAPPER_INACTIVE_PARAM("curiosities.png", 238, 0, 18, 18),
LOGO("logo.png", 256, 256),
SCHEMATIC("schematics.png", 192, 121), SCHEMATIC("schematics.png", 192, 121),
SCHEMATIC_SLOT("widgets.png", 54, 0, 16, 16), SCHEMATIC_SLOT("widgets.png", 54, 0, 16, 16),
SCHEMATIC_PROMPT("schematics_2.png", 213, 77), SCHEMATIC_PROMPT("schematics_2.png", 213, 77),
@ -59,6 +61,7 @@ public enum AllGuiTextures implements IScreenRenderable {
SEQUENCER_AWAIT("sequencer.png", 0, 160, 162, 22), SEQUENCER_AWAIT("sequencer.png", 0, 160, 162, 22),
LINKED_CONTROLLER("curiosities2.png", 180, 109), LINKED_CONTROLLER("curiosities2.png", 180, 109),
BLUEPRINT("curiosities2.png", 0, 109, 179, 109),
PROJECTOR("projector.png", 235, 185), PROJECTOR("projector.png", 235, 185),
PROJECTOR_FILTER_STRENGTH("projector.png", 0, 14, 162, 22), 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_YELLOW("widgets.png", 54, 18, 18, 6),
INDICATOR_RED("widgets.png", 72, 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_BACKGROUND("widgets.png", 0, 24, 8, 8),
SPEECH_TOOLTIP_COLOR("widgets.png", 8, 24, 8, 8), SPEECH_TOOLTIP_COLOR("widgets.png", 8, 24, 8, 8),
// PlacementIndicator // 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; public static final int FONT_COLOR = 0x575F7A;

View file

@ -20,18 +20,25 @@ import net.minecraft.util.text.Style;
public class ConfirmationScreen extends AbstractSimiScreen { public class ConfirmationScreen extends AbstractSimiScreen {
private Screen source; private Screen source;
private Consumer<Boolean> action = _success -> {}; private Consumer<Response> action = _success -> {
};
private List<ITextProperties> text = new ArrayList<>(); private List<ITextProperties> text = new ArrayList<>();
private boolean centered = false; private boolean centered = false;
private int x; private int x;
private int y; private int y;
private int textWidth; private int textWidth;
private int textHeight; private int textHeight;
private boolean tristate;
private BoxWidget confirm; private BoxWidget confirm;
private BoxWidget confirmDontSave;
private BoxWidget cancel; private BoxWidget cancel;
private BoxElement textBackground; 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
* */ * */
@ -70,7 +77,13 @@ public class ConfirmationScreen extends AbstractSimiScreen {
} }
public ConfirmationScreen withAction(Consumer<Boolean> action) { public ConfirmationScreen withAction(Consumer<Boolean> action) {
this.action = r -> action.accept(r == Response.Confirm);
return this;
}
public ConfirmationScreen withThreeActions(Consumer<Response> action) {
this.action = action; this.action = action;
this.tristate = true;
return this; return this;
} }
@ -115,32 +128,46 @@ public class ConfirmationScreen extends AbstractSimiScreen {
y = height - textHeight - 30; y = height - textHeight - 30;
} }
TextStencilElement confirmText = new TextStencilElement(client.fontRenderer, "Confirm").centered(true, true); int buttonX = x + textWidth / 2 - 6 - (int) (70 * (tristate ? 1.5f : 1));
confirm = new BoxWidget(x + 4, y + textHeight + 2 , textWidth/2 - 10, 20)
.withCallback(() -> accept(true)); 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))); 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); TextStencilElement cancelText = new TextStencilElement(client.fontRenderer, "Cancel").centered(true, true);
cancel = new BoxWidget(x + textWidth/2 + 6, y + textHeight + 2, textWidth/2 - 10, 20) cancel = new BoxWidget(buttonX, y + textHeight + 6, 70, 16)
.withCallback(() -> accept(false)); .withCallback(() -> accept(Response.Cancel));
cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel))); cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel)));
widgets.add(confirm);
widgets.add(cancel); widgets.add(cancel);
textBackground = new BoxElement() textBackground = new BoxElement()
.gradientBorder(Theme.p(Theme.Key.BUTTON_DISABLE)) .gradientBorder(Theme.p(Theme.Key.BUTTON_DISABLE))
.withBounds(textWidth, textHeight) .withBounds(width + 10, textHeight + 35)
.at(x, y); .at(-5, y - 5);
} }
@Override @Override
public void onClose() { public void onClose() {
accept(false); accept(Response.Cancel);
} }
private void accept(boolean success) { private void accept(Response success) {
client.currentScreen = source; client.currentScreen = source;
action.accept(success); action.accept(success);
} }
@ -157,11 +184,12 @@ public class ConfirmationScreen extends AbstractSimiScreen {
for (ITextProperties line : text) { for (ITextProperties line : text) {
lineY = lineY + offset; lineY = lineY + offset;
if (line == null) if (line == null)
continue; continue;
int textX = x;
client.fontRenderer.draw(ms, line.getString(), x, lineY, 0xeaeaea); if (text.size() == 1)
x = (width - client.fontRenderer.getWidth(line)) / 2;
client.fontRenderer.draw(ms, line.getString(), textX, lineY, 0xeaeaea);
} }
ms.pop(); ms.pop();
@ -175,7 +203,7 @@ public class ConfirmationScreen extends AbstractSimiScreen {
ms.push(); ms.push();
UIRenderHelper.framebuffer.bindFramebuffer(true); 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(); UIRenderHelper.framebuffer.unbindFramebuffer();
Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer(); Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer();
ms.pop(); ms.pop();

Some files were not shown because too many files have changed in this diff Show more