diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1ec53cafb..4c93571f0 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -f7bdf2fb1af4cae8bca1735861d603cce0870985 assets/create/lang/en_us.json -f83d2acecd5ce6ebe8dfddffde3c5c3a68abd492 assets/create/lang/unfinished/de_de.json -35e50f9ba61af0ef900154213b0b25d1dc5469d3 assets/create/lang/unfinished/es_es.json -98c26496201d8f12be5f6fc0ddaf919d9098f825 assets/create/lang/unfinished/es_mx.json -161ac9821b2445c96c6d594885c2d32cd784e8c5 assets/create/lang/unfinished/fr_fr.json -0c1baeb251ff32329a8d34a7200101de2cb724c4 assets/create/lang/unfinished/it_it.json -b0ccadbcc765e7ddee1089b3ca65414f5aa1ad95 assets/create/lang/unfinished/ja_jp.json -9551b6b6df919ff7e2b7e14361e8061b65cd4857 assets/create/lang/unfinished/ko_kr.json -552b3ef71a2898d7e263035ade5b47fb0bcfec23 assets/create/lang/unfinished/nl_nl.json -1661f76a0ba088209fcd837a8a1676dbed186368 assets/create/lang/unfinished/pt_br.json -621af99986c9e334d224f9a356c25d7468a1ef47 assets/create/lang/unfinished/ru_ru.json -6340ad62aedc1fec27abb6b490c36b1fd1317214 assets/create/lang/unfinished/zh_cn.json -56a1fedad3d453a36c456085c836fcfbf9740b1d assets/create/lang/unfinished/zh_tw.json +e371fd4fccf90c4ee6f2fbea91ea5d70e3d6c652 assets/create/lang/en_us.json +610a33e7074c3fb8e88370bed76549bfcfe0eddb assets/create/lang/unfinished/de_de.json +29339e0bf9743251639a2598d17f194cd406602c assets/create/lang/unfinished/es_es.json +e7138596de0babd4fc90a4b8ffb8fdea13088086 assets/create/lang/unfinished/es_mx.json +a95f57787534ae5d4920fe8e4825fe3012fdcd70 assets/create/lang/unfinished/fr_fr.json +7956b67df2d19a9f890f893c9d736516cc6e8629 assets/create/lang/unfinished/it_it.json +95394f8cc9d53397e030c46a9abef4fa4348e2ad assets/create/lang/unfinished/ja_jp.json +edcd5ffe8239f13cedbd63ab11c8334a38b90c90 assets/create/lang/unfinished/ko_kr.json +1749d2d020f02a2ccca4698d85bfdc4dcf849e3f assets/create/lang/unfinished/nl_nl.json +83c43209c295b3d3d85f7bebaa9a8ce7b79d47da assets/create/lang/unfinished/pt_br.json +a1a67295a2fe537080254fc8b353699d4d30989a assets/create/lang/unfinished/ru_ru.json +a525852b4f3aa0af52816e02e5cf4181de0c60c5 assets/create/lang/unfinished/zh_cn.json +51242fa9de9994103e9373e5c8dd6941438ec9a8 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f9fdd6089..5b572a2a7 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1907,6 +1907,26 @@ "create.ponder.brass_funnel.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "All shafts connected like this will rotate in the same direction", @@ -1947,6 +1967,37 @@ "create.ponder.creative_motor.text_1": "Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "Using the Deployer", + "create.ponder.deployer.text_1": "Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "Items can also be inserted automatically", + "create.ponder.deployer.text_12": "Deployers carry a filter slot", + "create.ponder.deployer.text_13": "When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "Deployers can:", + "create.ponder.deployer.text_5": "Place Blocks,", + "create.ponder.deployer.text_6": "Use Items,", + "create.ponder.deployer.text_7": "Activate Blocks,", + "create.ponder.deployer.text_8": "Harvest blocks", + "create.ponder.deployer.text_9": "and Attack Mobs", + + "create.ponder.deployer_contraption.header": "Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "Strength and Direction of Flow depends on the Rotational Input", @@ -1965,6 +2016,11 @@ "create.ponder.fan_source.text_1": "Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "Funnel compatibility", "create.ponder.funnel_compat.text_1": "Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "Vertical Saws", @@ -1989,6 +2045,11 @@ "create.ponder.funnel_transfer.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "Gantry setups can move attached Blocks.", @@ -2059,6 +2120,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "Speed and direction of movement depend on the Rotational Input", @@ -2068,6 +2133,12 @@ "create.ponder.mechanical_piston_modes.text_1": "Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2134,9 +2205,9 @@ "create.ponder.redstone_link.text_1": "Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2151,6 +2222,17 @@ "create.ponder.rope_pulley_modes.text_1": "Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index d3f057fa5..82ea9ce8f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1302", + "_": "Missing Localizations: 1370", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 0b0652617..477c1075f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 333", + "_": "Missing Localizations: 401", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index e232209e0..5b8a24ac5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1232", + "_": "Missing Localizations: 1300", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 061ec4e47..54fec9d1c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1014", + "_": "Missing Localizations: 1082", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 871dae9bd..8f188d3ce 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 350", + "_": "Missing Localizations: 418", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index e08d19db8..6a407c0a5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 357", + "_": "Missing Localizations: 425", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 0de6cbdc1..735d654f7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 403", + "_": "Missing Localizations: 471", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 6f11b4c0e..f3dbea0b4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1501", + "_": "Missing Localizations: 1569", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4316c6e3e..659fc213b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1567", + "_": "Missing Localizations: 1635", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index d891d5922..bbfb96413 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 353", + "_": "Missing Localizations: 421", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index d806010de..68ae1cb13 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 351", + "_": "Missing Localizations: 419", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 691488640..fff451d2d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 356", + "_": "Missing Localizations: 424", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1948,6 +1968,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -1966,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", @@ -1990,6 +2046,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2060,6 +2121,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2134,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2206,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", @@ -2152,6 +2223,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 256d46aa9..88b073b28 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.components.crank.HandCrankRender import com.simibubi.create.content.contraptions.components.crank.HandCrankTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelTileEntity; +import com.simibubi.create.content.contraptions.components.deployer.DeployerInstance; import com.simibubi.create.content.contraptions.components.deployer.DeployerRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.fan.EncasedFanRenderer; @@ -476,7 +477,7 @@ public class AllTileEntities { public static final TileEntityEntry DEPLOYER = Create.registrate() .tileEntity("deployer", DeployerTileEntity::new) - .instance(() -> ShaftInstance::new) + .instance(() -> DeployerInstance::new) .validBlocks(AllBlocks.DEPLOYER) .renderer(() -> DeployerRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java index f707b0532..a118962b4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java @@ -12,6 +12,7 @@ public enum ActorVertexAttributes implements IVertexAttrib { AXIS("aAxis", CommonAttributes.NORMAL), INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), ROTATION_CENTER("aRotationCenter", CommonAttributes.NORMAL), + SPEED("aSpeed", CommonAttributes.FLOAT), ; private final String name; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java index 56853e9d1..6e41d205c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java @@ -30,6 +30,8 @@ public class ContraptionActorData extends InstanceData { private byte rotationCenterY = 64; private byte rotationCenterZ = 64; + private float speed; + protected ContraptionActorData(InstancedModel owner) { super(owner); } @@ -57,6 +59,11 @@ public class ContraptionActorData extends InstanceData { return this; } + public ContraptionActorData setSpeed(float speed) { + this.speed = speed; + return this; + } + public ContraptionActorData setRotationAxis(Vector3f axis) { setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); return this; @@ -101,6 +108,7 @@ public class ContraptionActorData extends InstanceData { putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); putVec3(buf, localRotationX, localRotationY, localRotationZ); putVec3(buf, rotationCenterX, rotationCenterY, rotationCenterZ); + put(buf, speed); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java new file mode 100644 index 000000000..958670ede --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; + +public class DrillActorInstance extends ActorInstance { + + InstanceKey drillHead; + private Direction facing; + + public DrillActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> renderMaterial = modelManager.getActorMaterial(); + + BlockState state = context.state; + + facing = state.get(DrillBlock.FACING); + float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); + float eulerY = facing.getHorizontalAngle(); + + drillHead = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state).createInstance(); + + drillHead.getInstance() + .setPosition(context.localPos) + .setBlockLight(localBlockLight()) + .setRotationOffset(0) + .setRotationAxis(0, 0, 1) + .setLocalRotation(eulerX, eulerY, 0) + .setSpeed(getSpeed(facing)); + } + + @Override + protected void tick() { + drillHead.getInstance().setSpeed(getSpeed(facing)); + } + + @Override + protected float getSpeed(Direction facing) { + if (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite())) + return context.getAnimationSpeed(); + return 0; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index 72b85d279..cb9a66d2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -22,23 +22,6 @@ public class DrillInstance extends SingleRotatingInstance { super(modelManager, tile); } - public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { - RenderMaterial> renderMaterial = contraption.getActorMaterial(); - - BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); - - Direction facing = state.get(DrillBlock.FACING); - float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); - float eulerY = facing.getHorizontalAngle(); - model.getInstance(model.createInstance()) - .setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationAxis(0, 0, 1) - .setLocalRotation(eulerX, eulerY, 0); - } - @Override protected InstancedModel getModel() { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index 965d6c3c0..fd9a3959a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.VecHelper; @@ -15,6 +17,8 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import javax.annotation.Nullable; + public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @Override @@ -42,9 +46,10 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { return true; } + @Nullable @Override - public void addInstance(RenderedContraption contraption, MovementContext context) { - DrillInstance.addInstanceForContraption(contraption, context); + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new DrillActorInstance(kr, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index ad434c4eb..825ba510e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -42,7 +42,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { Direction facing = state.get(DrillBlock.FACING); float speed = (float) (context.contraption.stalled - || !VecHelper.isVecPointingTowards(context.relativeMotion, state.get(FACING) + || !VecHelper.isVecPointingTowards(context.relativeMotion, facing .getOpposite()) ? context.getAnimationSpeed() : 0); float time = AnimationTickHolder.getRenderTime() / 20; float angle = (float) (((time * speed) % 360)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java new file mode 100644 index 000000000..f0431d63a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; + +import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; + +public class HarvesterActorInstance extends ActorInstance { + + InstanceKey harvester; + private Direction facing; + + public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> renderMaterial = modelManager.getActorMaterial(); + + BlockState state = context.state; + + facing = state.get(HORIZONTAL_FACING); + float originOffset = 1 / 16f; + Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); + + harvester = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance(); + + harvester.getInstance() + .setPosition(context.localPos) + .setBlockLight(localBlockLight()) + .setRotationOffset(0) + .setRotationCenter(rotOffset) + .setRotationAxis(-1, 0, 0) + .setLocalRotation(0, facing.getHorizontalAngle(), 0) + .setSpeed(getSpeed(facing)); + } + + @Override + protected void tick() { + harvester.getInstance().setSpeed(getSpeed(facing)); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index ea53b2b2c..2878d19da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import org.apache.commons.lang3.mutable.MutableBoolean; import com.mojang.blaze3d.matrix.MatrixStack; @@ -29,6 +31,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; +import javax.annotation.Nullable; + public class HarvesterMovementBehaviour extends MovementBehaviour { @Override @@ -42,9 +46,10 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { return true; } + @Nullable @Override - public void addInstance(RenderedContraption contraption, MovementContext context) { - HarvesterRenderer.addInstanceForContraption(contraption, context); + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new HarvesterActorInstance(kr, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index cd130936c..b22a1ba12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -43,24 +43,6 @@ public class HarvesterRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); - - BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); - - Direction facing = state.get(HORIZONTAL_FACING); - float originOffset = 1 / 16f; - Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); - model.getInstance(model.createInstance()) - .setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationCenter(rotOffset) - .setRotationAxis(-1, 0, 0) - .setLocalRotation(0, facing.getHorizontalAngle(), 0); - } - public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { BlockState blockState = context.state; @@ -90,7 +72,4 @@ public class HarvesterRenderer extends SafeTileEntityRenderer dropItem(context, s)); + } + } + @Override public void stopMoving(MovementContext context) { super.stopMoving(context); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java new file mode 100644 index 000000000..6b307b176 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java @@ -0,0 +1,98 @@ +package com.simibubi.create.content.contraptions.components.deployer; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.*; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram; +import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.*; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; +import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; + +public class DeployerActorInstance extends ActorInstance { + + Direction facing; + boolean stationaryTimer; + + float yRot; + float zRot; + float zRotPole; + + InstanceKey pole; + InstanceKey hand; + InstanceKey shaft; + + public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> mat = modelManager.basicMaterial(); + + BlockState state = context.state; + DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class); + AllBlockPartials handPose = DeployerRenderer.getHandPose(mode); + + stationaryTimer = context.data.contains("StationaryTimer"); + facing = state.get(FACING); + + boolean rotatePole = state.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + yRot = AngleHelper.horizontalAngle(facing); + zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; + zRotPole = rotatePole ? 90 : 0; + + pole = mat.getModel(AllBlockPartials.DEPLOYER_POLE, state).createInstance(); + hand = mat.getModel(handPose, state).createInstance(); + + Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state); + shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING) + .getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileInstance.shaft(axis)) + .createInstance(); + + int blockLight = localBlockLight(); + + shaft.getInstance() + .setBlockLight(blockLight) + .setRotationAxis(axis) + .setPosition(context.localPos); + + pole.getInstance().setBlockLight(blockLight); + hand.getInstance().setBlockLight(blockLight); + } + + @Override + protected void tick() { + double factor; + if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { + factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; + } else { + Vec3d center = VecHelper.getCenterOf(new BlockPos(context.position)); + double distance = context.position.distanceTo(center); + double nextDistance = context.position.add(context.motion) + .distanceTo(center); + factor = .5f - MathHelper.clamp(MathHelper.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); + } + + Vec3d offset = new Vec3d(facing.getDirectionVec()).scale(factor); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(context.localPos) + .translate(offset); + + DeployerInstance.transformModel(msr, pole, hand, yRot, zRot, zRotPole); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java new file mode 100644 index 000000000..8ac245d1c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java @@ -0,0 +1,132 @@ +package com.simibubi.create.content.contraptions.components.deployer; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; +import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; + +public class DeployerInstance extends ShaftInstance implements ITickableInstance { + + DeployerTileEntity tile; + + Direction facing; + + InstanceKey pole; + + AllBlockPartials currentHand; + InstanceKey hand; + + float yRot; + float zRot; + float zRotPole; + + public DeployerInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + this.tile = (DeployerTileEntity) super.tile; + facing = lastState.get(FACING); + + boolean rotatePole = lastState.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + + yRot = AngleHelper.horizontalAngle(facing); + zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; + zRotPole = rotatePole ? 90 : 0; + + pole = modelManager.basicMaterial().getModel(AllBlockPartials.DEPLOYER_POLE, lastState).createInstance(); + + updateHandPose(); + relight(pos, pole.getInstance()); + } + + @Override + public void tick() { + + updateHandPose(); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(getFloatingPos()) + .translate(getHandOffset(AnimationTickHolder.getPartialTicks())); + + transformModel(msr, pole, hand, yRot, zRot, zRotPole); + + } + + @Override + public void updateLight() { + super.updateLight(); + relight(pos, hand.getInstance(), pole.getInstance()); + } + + @Override + public void remove() { + super.remove(); + hand.delete(); + pole.delete(); + currentHand = null; // updateHandPose() uses an invalid key after a block update otherwise. + hand = null; + } + + private boolean updateHandPose() { + AllBlockPartials handPose = tile.getHandPose(); + + if (currentHand == handPose) return false; + currentHand = handPose; + + if (hand != null) hand.delete(); + + hand = modelManager.basicMaterial().getModel(currentHand, lastState).createInstance(); + + relight(pos, hand.getInstance()); + + return true; + } + + protected Vec3d getHandOffset(float partialTicks) { + float progress = 0; + if (tile.state == DeployerTileEntity.State.EXPANDING) + progress = 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + if (tile.state == DeployerTileEntity.State.RETRACTING) + progress = (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + + float handLength = tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 + : tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; + float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f); + Vec3d offset = new Vec3d(facing.getDirectionVec()).scale(distance); + return offset; + } + + static void transformModel(MatrixStacker msr, InstanceKey pole, InstanceKey hand, float yRot, float zRot, float zRotPole) { + + msr.centre(); + msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI)); + msr.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI)); + + msr.push(); + msr.rotate(Direction.SOUTH, (float) ((zRotPole) / 180 * Math.PI)); + msr.unCentre(); + pole.getInstance().setTransform(msr.unwrap()); + msr.pop(); + + msr.unCentre(); + + hand.getInstance().setTransform(msr.unwrap()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index aa8f4240e..83738f6dd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.contraptions.components.deployer; import java.util.Arrays; import java.util.List; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import org.apache.commons.lang3.tuple.Pair; import com.mojang.blaze3d.matrix.MatrixStack; @@ -24,6 +27,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.util.Constants.NBT; +import javax.annotation.Nullable; + public class DeployerMovementBehaviour extends MovementBehaviour { @Override @@ -167,7 +172,18 @@ public class DeployerMovementBehaviour extends MovementBehaviour { @Override public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { - DeployerRenderer.renderInContraption(context, ms, msLocal, buffers); + if (!FastRenderDispatcher.available()) + DeployerRenderer.renderInContraption(context, ms, msLocal, buffers); } + @Override + public boolean hasSpecialInstancedRendering() { + return true; + } + + @Nullable + @Override + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new DeployerActorInstance(kr, context); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 267763ce0..5438be5ac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; -import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -50,11 +49,17 @@ public class DeployerRenderer extends SafeTileEntityRenderer int light, int overlay) { renderItem(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); + + if (FastRenderDispatcher.available(te.getWorld())) return; + renderComponents(te, partialTicks, ms, buffer, light, overlay); } protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + if (te.heldItem.isEmpty()) return; + BlockState deployerState = te.getBlockState(); Vec3d offset = getHandOffset(te, partialTicks, deployerState).add(VecHelper.getCenterOf(BlockPos.ZERO)); ms.push(); @@ -123,15 +128,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer } protected Vec3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { - float progress = 0; - if (te.state == State.EXPANDING) - progress = 1 - (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - if (te.state == State.RETRACTING) - progress = (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - - float handLength = te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 - : te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; - float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (te.reach + handLength), 21 / 16f); + float distance = te.getHandOffset(partialTicks); Vec3d offset = new Vec3d(blockState.get(FACING) .getDirectionVec()).scale(distance); return offset; @@ -166,8 +163,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer BlockPos pos = BlockPos.ZERO; Mode mode = NBTHelper.readEnum(context.tileData, "Mode", Mode.class); World world = context.world; - AllBlockPartials handPose = - mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; + AllBlockPartials handPose = getHandPose(mode); SuperByteBuffer pole = AllBlockPartials.DEPLOYER_POLE.renderOn(blockState); SuperByteBuffer hand = handPose.renderOn(blockState); @@ -198,4 +194,8 @@ public class DeployerRenderer extends SafeTileEntityRenderer .renderInto(ms, builder); } + static AllBlockPartials getHandPose(DeployerTileEntity.Mode mode) { + return mode == DeployerTileEntity.Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 4af470f72..531411595 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; @@ -53,6 +54,8 @@ public class DeployerTileEntity extends KineticTileEntity { private LazyOptional invHandler; private ListNBT deferredInventoryList; + private LerpedFloat animatedOffset; + enum State { WAITING, EXPANDING, RETRACTING, DUMPING; } @@ -67,6 +70,8 @@ public class DeployerTileEntity extends KineticTileEntity { mode = Mode.USE; heldItem = ItemStack.EMPTY; redstoneLocked = false; + animatedOffset = LerpedFloat.linear() + .startWithValue(0); } @Override @@ -106,7 +111,7 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public void tick() { super.tick(); - + if (getSpeed() == 0) return; if (!world.isRemote && player != null && player.blockBreakingProgress != null) { @@ -365,11 +370,11 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (isItemHandlerCap(cap) && invHandler != null) + if (isItemHandlerCap(cap) && invHandler != null) return invHandler.cast(); return super.getCapability(cap, side); } - + @Override public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { if (super.addToTooltip(tooltip, isPlayerSneaking)) @@ -386,4 +391,28 @@ public class DeployerTileEntity extends KineticTileEntity { public boolean shouldRenderAsTE() { return true; } + + public float getHandOffset(float partialTicks) { + if (isVirtual()) + return animatedOffset.getValue(partialTicks); + + float progress = 0; + int timerSpeed = getTimerSpeed(); + AllBlockPartials handPose = getHandPose(); + + if (state == State.EXPANDING) + progress = 1 - (timer - partialTicks * timerSpeed) / 1000f; + if (state == State.RETRACTING) + progress = (timer - partialTicks * timerSpeed) / 1000f; + float handLength = handPose == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 + : handPose == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; + float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (reach + handLength), 21 / 16f); + + return distance; + } + + public void setAnimatedOffset(float offset) { + animatedOffset.setValue(offset); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index 2dab48a50..07dedf3b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -76,7 +76,8 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { super.tick(); if (world.isRemote) { - visualSpeed.target(getGeneratedSpeed()); + float targetSpeed = isVirtual() ? speed : getGeneratedSpeed(); + visualSpeed.target(targetSpeed); visualSpeed.tick(); angle += visualSpeed.value * 3 / 10f; angle %= 360; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index 062a1601a..17a7c0af2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -8,10 +10,13 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; +import javax.annotation.Nullable; + public abstract class MovementBehaviour { public boolean isActive(MovementContext context) { @@ -61,7 +66,10 @@ public abstract class MovementBehaviour { IRenderTypeBuffer buffer) {} @OnlyIn(Dist.CLIENT) - public void addInstance(RenderedContraption contraption, MovementContext context) {} + @Nullable + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return null; + } public void onSpeedChanged(MovementContext context, Vec3d oldMotion, Vec3d motion) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java new file mode 100644 index 000000000..97d7ecc34 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.render; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; + +public abstract class ActorInstance { + protected final ContraptionKineticRenderer modelManager; + protected final MovementContext context; + + public ActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + this.modelManager = modelManager; + this.context = context; + } + + protected void tick() { } + + protected float getSpeed(Direction facing) { + if (context.contraption.stalled) + return 0; + + return !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()) ? context.getAnimationSpeed() : 0; + } + + protected int localBlockLight() { + return modelManager.contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index 8413118f7..56d968c93 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -1,20 +1,41 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; +import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.content.logistics.block.FlapInstancedModel; import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.RenderMaterials; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.impl.BasicInstancedModel; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.feature.template.Template; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class ContraptionKineticRenderer extends InstancedTileRenderer { + protected ArrayList actors = new ArrayList<>(); + + public final RenderedContraption contraption; + + ContraptionKineticRenderer(RenderedContraption contraption) { + this.contraption = contraption; + } + @Override public void registerMaterials() { materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, BasicInstancedModel::new)); @@ -25,6 +46,36 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer(this, AllProgramSpecs.C_ACTOR, RotatingActorModel::new)); } + + @Override + public void beginFrame(double cameraX, double cameraY, double cameraZ) { + super.beginFrame(cameraX, cameraY, cameraZ); + + actors.forEach(ActorInstance::tick); + } + + @Nullable + public ActorInstance createActor(Pair actor) { + Template.BlockInfo blockInfo = actor.getLeft(); + MovementContext context = actor.getRight(); + + MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); + + if (movementBehaviour != null && movementBehaviour.hasSpecialInstancedRendering()) { + ActorInstance instance = movementBehaviour.createInstance(this, context); + + actors.add(instance); + + return instance; + } + + return null; + } + + public RenderMaterial> getActorMaterial() { + return getMaterial(KineticRenderMaterials.ACTORS); + } + @Override public BlockPos getOriginCoordinate() { return BlockPos.ZERO; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index 23cdc0c55..9beb21f64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -64,7 +64,7 @@ public class RenderedContraption { public RenderedContraption(World world, Contraption contraption) { this.contraption = contraption; this.lighter = contraption.makeLighter(); - this.kinetics = new ContraptionKineticRenderer(); + this.kinetics = new ContraptionKineticRenderer(this); this.renderWorld = setupRenderWorld(world, contraption); buildLayers(); @@ -86,10 +86,6 @@ public class RenderedContraption { return lighter; } - public RenderMaterial> getActorMaterial() { - return kinetics.getMaterial(KineticRenderMaterials.ACTORS); - } - public void doRenderLayer(RenderType layer, ContraptionProgram shader) { ContraptionModel structure = renderLayers.get(layer); if (structure != null) { @@ -172,18 +168,7 @@ public class RenderedContraption { } private void buildActors() { - List> actors = contraption.getActors(); - - for (MutablePair actor : actors) { - Template.BlockInfo blockInfo = actor.left; - MovementContext context = actor.right; - - MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); - - if (movementBehaviour != null) { - movementBehaviour.addInstance(this, context); - } - } + contraption.getActors().forEach(kinetics::createActor); } private static ContraptionModel buildStructureModel(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index f4e324071..786a4b8b4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -41,11 +41,12 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer FilterItem.test(world, s, filter), + ItemHelper.ExtractionCountMode.UPTO, + filterAmount, + false); + + if (extract.isEmpty()) + return; + + if (world.isRemote) + return; + + + + ItemEntity entity = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, extract); + entity.setMotion(Vec3d.ZERO); + entity.setPickupDelay(5); + world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1/16f, .1f); + world.addEntity(entity); + } + + private void succ(MovementContext context, BlockPos pos) { World world = context.world; List items = world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(pos)); ItemStack filter = getFilter(context); @@ -61,7 +118,6 @@ public class FunnelMovementBehaviour extends MovementBehaviour { item.setItem(remainder); } - } private ItemStack getFilter(MovementContext context) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index bf5373a8c..b32718469 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -329,7 +329,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn extractionCooldown = compound.getInt("TransferCooldown"); if (clientPacket) - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); } @Override @@ -383,4 +383,10 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn TooltipHelper.addHint(tooltip, "hint.horizontal_funnel"); return true; } + + @Override + public boolean shouldRenderAsTE() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java index 4226aded7..d99d115b1 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java @@ -1,13 +1,5 @@ package com.simibubi.create.foundation.ponder; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableInt; -import org.lwjgl.glfw.GLFW; - import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.IScreenRenderable; @@ -17,11 +9,18 @@ import com.simibubi.create.foundation.ponder.content.PonderTagScreen; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.animation.LerpedFloat; - import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableInt; +import org.lwjgl.glfw.GLFW; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; public abstract class NavigatableSimiScreen extends AbstractSimiScreen { @@ -31,6 +30,9 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { public final LerpedFloat transition = LerpedFloat.linear() .startWithValue(0) .chase(0, .1f, LerpedFloat.Chaser.LINEAR); + protected final LerpedFloat arrowAnimation = LerpedFloat.linear() + .startWithValue(0) + .chase(0, 0.075f, LerpedFloat.Chaser.LINEAR); protected PonderButton backTrack; public NavigatableSimiScreen() { @@ -50,6 +52,7 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { public void tick() { super.tick(); transition.tickChaser(); + arrowAnimation.tickChaser(); } @Override @@ -90,8 +93,13 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { RenderSystem.pushMatrix(); RenderSystem.translated(0, 0, 500); - if (backTrack.isHovered()) + if (backTrack.isHovered()) { drawString(font, Lang.translate(THINK_BACK), 15, height - 16, 0xffa3a3a3); + if (MathHelper.epsilonEquals(arrowAnimation.getValue(), arrowAnimation.getChaseTarget())) { + arrowAnimation.setValue(1); + arrowAnimation.setValue(1);//called twice to also set the previous value to 1 + } + } RenderSystem.popMatrix(); } @@ -149,8 +157,14 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { RenderSystem.translated(-depthPointX, -depthPointY, 0); if (backTrack != null) { - UIRenderHelper.breadcrumbArrow(21, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); - UIRenderHelper.breadcrumbArrow(-19, height - 51, 40, 20, 5, 0x40aa9999, 0x10aa9999); + int x = (int) MathHelper.lerp(arrowAnimation.getValue(partialTicks), -9, 21); + int maxX = backTrack.x + backTrack.getWidth(); + + if (x + 30 < backTrack.x) + UIRenderHelper.breadcrumbArrow(x + 30, height - 51, maxX - (x + 30), 20, 5, 0x40aa9999, 0x10aa9999); + + UIRenderHelper.breadcrumbArrow(x, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); + UIRenderHelper.breadcrumbArrow(x - 30, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 6c7bf9cbb..9c2d866f9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -109,8 +109,10 @@ public class PonderRegistry { String filepath = "ponder/" + path + ".nbt"; InputStream resourceAsStream = Create.class.getClassLoader() .getResourceAsStream(filepath); - if (resourceAsStream == null) - throw new IllegalStateException("Could not find ponder schematic: " + filepath); + if (resourceAsStream == null) { + Create.logger.error("Ponder schematic missing: " + path); + return t; + } try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index 545dfbd1b..b9feddb16 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -83,6 +83,9 @@ public class PonderUI extends NavigatableSimiScreen { private ClipboardHelper clipboardHelper; private BlockPos copiedBlockPos; + private LerpedFloat finishingFlash; + private int finishingFlashWarmup = 0; + private LerpedFloat lazyIndex; private int index = 0; private PonderTag referredToByTag; @@ -133,6 +136,9 @@ public class PonderUI extends NavigatableSimiScreen { .startWithValue(0) .chase(1, .1f, Chaser.EXP); clipboardHelper = new ClipboardHelper(); + finishingFlash = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .1f, Chaser.EXP); } @Override @@ -250,10 +256,22 @@ public class PonderUI extends NavigatableSimiScreen { if (skipCooling == 0) activeScene.tick(); } + lazyIndex.tickChaser(); fadeIn.tickChaser(); + finishingFlash.tickChaser(); progressBar.tick(); + if (activeScene.currentTime == activeScene.totalTime - 1) + finishingFlashWarmup = 30; + if (finishingFlashWarmup > 0) { + finishingFlashWarmup--; + if (finishingFlashWarmup == 0) { + finishingFlash.setValue(1); + finishingFlash.setValue(1); + } + } + if (!identifyMode) { float lazyIndexValue = lazyIndex.getValue(); if (Math.abs(lazyIndexValue - index) > 1 / 512f) @@ -351,6 +369,7 @@ public class PonderUI extends NavigatableSimiScreen { } protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) { + SuperRenderTypeBuffer.vertexSortingOrigin = new BlockPos(0, 0, 800); renderScene(mouseX, mouseY, index, partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks); if (Math.abs(lazyIndexValue - index) > 1 / 512f) @@ -388,10 +407,26 @@ public class PonderUI extends NavigatableSimiScreen { RenderSystem.pushMatrix(); RenderSystem.translated(story.basePlateOffsetX, 0, story.basePlateOffsetZ); RenderSystem.scaled(1, -1, 1); + + float flash = finishingFlash.getValue(partialTicks) * .9f; + float alpha = flash; + flash *= flash; + flash = ((flash * 2) - 1); + flash *= flash; + flash = 1 - flash; + for (int f = 0; f < 4; f++) { RenderSystem.translated(story.basePlateSize, 0, 0); RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 1 / 1024f); + RenderSystem.translated(0, 0, -1 / 1024f); + if (flash > 0) { + RenderSystem.pushMatrix(); + RenderSystem.scaled(1, .5 + flash * .75, 1); + GuiUtils.drawGradientRect(0, 0, -1, -story.basePlateSize, 0, 0x00_c6ffc9, + ColorHelper.applyAlpha(0xaa_c6ffc9, alpha)); + RenderSystem.popMatrix(); + } + RenderSystem.translated(0, 0, 2 / 1024f); GuiUtils.drawGradientRect(0, 0, 0, -story.basePlateSize, 4, 0x66_000000, 0x00_000000); RenderSystem.popMatrix(); RenderSystem.rotatef(-90, 0, 1, 0); @@ -897,4 +932,10 @@ public class PonderUI extends NavigatableSimiScreen { skipCooling = 15; } + @Override + public void removed() { + super.removed(); + SuperRenderTypeBuffer.vertexSortingOrigin = BlockPos.ZERO; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java index 1edc3b83d..bed230311 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -12,6 +12,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.schematics.SchematicWorld; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -106,6 +107,7 @@ public class PonderWorld extends SchematicWorld { if (originalBlocks.containsKey(p)) blocks.put(p, originalBlocks.get(p)); }); + scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); } public void pushFakeLight(int light) { @@ -280,7 +282,7 @@ public class PonderWorld extends SchematicWorld { } } } - + @Override protected BlockState processBlockStateForPrinting(BlockState state) { return state; @@ -295,5 +297,5 @@ public class PonderWorld extends SchematicWorld { public boolean isBlockPresent(BlockPos pos) { return true; // fix particle lighting } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index 811aa75a9..92450e9d8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -17,18 +17,23 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.ponder.content.PonderPalette; +import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import com.simibubi.create.foundation.ponder.elements.BeltItemElement; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement.MinecartConstructor; import com.simibubi.create.foundation.ponder.elements.ParrotElement; import com.simibubi.create.foundation.ponder.elements.ParrotElement.ParrotPose; import com.simibubi.create.foundation.ponder.elements.ParrotElement.SpinOnComponentPose; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.AnimateMinecartInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateParrotInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateTileEntityInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction; import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction; +import com.simibubi.create.foundation.ponder.instructions.CreateMinecartInstruction; import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction; import com.simibubi.create.foundation.ponder.instructions.DelayInstruction; import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction; @@ -177,7 +182,7 @@ public class SceneBuilder { public void showBasePlate() { world.showSection( scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.basePlateOffsetX, 0, scene.basePlateOffsetZ), - new Vec3i(scene.basePlateSize, 0, scene.basePlateSize)), + new Vec3i(scene.basePlateSize - 1, 0, scene.basePlateSize - 1)), Direction.UP); } @@ -328,12 +333,15 @@ public class SceneBuilder { } public void showCenteredScrollInput(BlockPos pos, Direction side, int duration) { + showScrollInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), side, duration); + } + + public void showScrollInput(Vec3d location, Direction side, int duration) { Axis axis = side.getAxis(); float s = 1 / 16f; float q = 1 / 4f; Vec3d expands = new Vec3d(axis == Axis.X ? s : q, axis == Axis.Y ? s : q, axis == Axis.Z ? s : q); - addInstruction(new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), - expands, duration)); + addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); } public void showRepeaterScrollInput(BlockPos pos, int duration) { @@ -359,6 +367,10 @@ public class SceneBuilder { addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration)); } + public void hideElement(ElementLink link, Direction direction) { + addInstruction(new FadeOutOfSceneInstruction<>(15, direction, link)); + } + } public class SpecialInstructions { @@ -402,6 +414,22 @@ public class SceneBuilder { addInstruction(AnimateParrotInstruction.move(link, offset, duration)); } + public ElementLink createCart(Vec3d location, float angle, MinecartConstructor type) { + ElementLink link = new ElementLink<>(MinecartElement.class); + MinecartElement cart = new MinecartElement(location, angle, type); + addInstruction(new CreateMinecartInstruction(10, Direction.DOWN, cart)); + addInstruction(scene -> scene.linkElement(cart, link)); + return link; + } + + public void rotateCart(ElementLink link, float yRotation, int duration) { + addInstruction(AnimateMinecartInstruction.rotate(link, yRotation, duration)); + } + + public void moveCart(ElementLink link, Vec3d offset, int duration) { + addInstruction(AnimateMinecartInstruction.move(link, offset, duration)); + } + } public class WorldInstructions { @@ -445,6 +473,13 @@ public class SceneBuilder { return instruction.createLink(scene); } + public ElementLink showIndependentSectionImmediately(Selection selection) { + DisplayWorldSectionInstruction instruction = + new DisplayWorldSectionInstruction(0, Direction.DOWN, selection, Optional.empty()); + addInstruction(instruction); + return instruction.createLink(scene); + } + public void hideSection(Selection selection, Direction fadeOutDirection) { WorldSectionElement worldSectionElement = new WorldSectionElement(selection); ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); @@ -514,6 +549,10 @@ public class SceneBuilder { addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); } + public void moveDeployer(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); + } + public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java new file mode 100644 index 000000000..037078293 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java @@ -0,0 +1,534 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssembleRailType; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.elements.EntityElement; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.ChestMinecartEntity; +import net.minecraft.entity.item.minecart.FurnaceMinecartEntity; +import net.minecraft.entity.item.minecart.MinecartEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.state.properties.RailShape; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class CartAssemblerScenes { + + public static void anchor(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler", "Moving Structures using Cart Assemblers"); + scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos assemblerPos = util.grid.at(2, 1, 2); + scene.world.setBlock(assemblerPos, Blocks.RAIL.getDefaultState(), false); + for (int z = 0; z < 5; z++) { + scene.world.showSection(util.select.position(2, 1, z), Direction.DOWN); + scene.idle(2); + } + + BlockPos leverPos = util.grid.at(0, 1, 2); + Selection toggle = util.select.fromTo(assemblerPos, leverPos); + + scene.idle(10); + + scene.overlay + .showControls(new InputWindowElement(util.vector.centerOf(assemblerPos), Pointing.DOWN).rightClick() + .withItem(AllBlocks.CART_ASSEMBLER.asStack()), 30); + scene.idle(7); + scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.NORTH_SOUTH) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(20); + scene.world.showSection(util.select.fromTo(0, 1, 2, 1, 1, 2), Direction.EAST); + scene.idle(20); + scene.world.toggleRedstonePower(toggle); + scene.effects.indicateRedstone(leverPos); + scene.idle(10); + + scene.overlay.showText(70) + .text("Powered Cart Assemblers mount attached structures to passing Minecarts") + .attachKeyFrame() + .pointAt(util.vector.topOf(assemblerPos)) + .placeNearTarget(); + scene.idle(80); + + ElementLink cart = + scene.special.createCart(util.vector.topOf(2, 0, 4), 90, MinecartEntity::new); + scene.world.showSection(util.select.position(assemblerPos.up()), Direction.DOWN); + scene.idle(10); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + ElementLink plank = + scene.world.makeSectionIndependent(util.select.position(assemblerPos.up())); + ElementLink anchor = + scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.east())); + scene.world.moveSection(anchor, util.vector.of(-1, 0, 0), 0); + scene.effects.indicateSuccess(assemblerPos); + scene.idle(1); + scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); + scene.world.moveSection(plank, util.vector.of(0, 0, -2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + + scene.world.toggleRedstonePower(toggle); + scene.idle(10); + + scene.overlay.showText(70) + .text("Without a redstone signal, it disassembles passing cart contraptions back into blocks") + .colored(PonderPalette.RED) + .attachKeyFrame() + .pointAt(util.vector.topOf(assemblerPos)) + .placeNearTarget(); + scene.idle(80); + + scene.world.rotateSection(anchor, 0, 180, 0, 6); + scene.world.rotateSection(plank, 0, 180, 0, 6); + scene.idle(3); + + scene.world.moveSection(anchor, util.vector.of(0, 0, 2), 20); + scene.world.moveSection(plank, util.vector.of(0, 0, 2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.idle(21); + scene.world.moveSection(anchor, util.vector.of(0, -2, 0), 0); + scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.idle(30); + + scene.world.destroyBlock(assemblerPos.up()); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(1, 4, 2, 3, 3, 2), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(0, -1, 0), 0); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(3, 3, 1), Direction.SOUTH, contraption); + scene.idle(15); + scene.effects.superGlue(util.grid.at(3, 2, 1), Direction.SOUTH, true); + scene.overlay.showText(80) + .attachKeyFrame() + .sharedText("movement_anchors") + .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.NORTH)) + .placeNearTarget(); + scene.idle(80); + scene.world.toggleRedstonePower(toggle); + scene.effects.indicateRedstone(leverPos); + + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + scene.world.moveSection(anchor, util.vector.of(0, 2, 0), 0); + scene.idle(1); + scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); + scene.world.moveSection(contraption, util.vector.of(0, 0, -2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(25); + + Vec3d cartCenter = util.vector.centerOf(assemblerPos.north(2)); + scene.overlay.showControls(new InputWindowElement(cartCenter, Pointing.LEFT).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.special.moveCart(cart, util.vector.of(0, -100, 4), 0); + scene.world.moveSection(anchor, util.vector.of(0, -100, 4), 0); + scene.world.moveSection(contraption, util.vector.of(0, -100, 4), 0); + ItemStack asStack = AllItems.MINECART_CONTRAPTION.asStack(); + ElementLink itemEntity = + scene.world.createItemEntity(cartCenter, util.vector.of(0, .1, 0), asStack); + scene.idle(40); + scene.overlay.showText(80) + .attachKeyFrame() + .text("Using a Wrench on the Minecart will let you carry the Contraption elsewhere") + .pointAt(cartCenter) + .placeNearTarget(); + scene.idle(80); + scene.world.modifyEntity(itemEntity, Entity::remove); + + scene.overlay.showControls(new InputWindowElement(cartCenter.add(0, 0, 4), Pointing.DOWN).rightClick() + .withItem(asStack), 20); + scene.idle(20); + scene.special.moveCart(cart, util.vector.of(0, 100.5, 0), 0); + scene.world.moveSection(anchor, util.vector.of(0, 100.5, 0), 0); + scene.world.moveSection(contraption, util.vector.of(0, 100.5, 0), 0); + scene.idle(1); + scene.special.moveCart(cart, util.vector.of(0, -.5, 0), 5); + scene.world.moveSection(anchor, util.vector.of(0, -.5, 0), 5); + scene.world.moveSection(contraption, util.vector.of(0, -.5, 0), 5); + } + + public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_modes", "Orientation Settings for Minecart Contraptions"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int z = 0; z < 4; z++) { + scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.idle(2); + } + for (int x = 2; x < 5; x++) { + scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.idle(2); + } + + BlockPos assemblerPos = util.grid.at(3, 1, 3); + scene.idle(5); + scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(3, 2, 3), Direction.DOWN); + scene.idle(10); + scene.world.glueBlockOnto(util.grid.at(2, 2, 3), Direction.EAST, contraption); + scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); + scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.idle(10); + + ElementLink cart = + scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, MinecartEntity::new); + scene.idle(20); + scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.idle(10); + ElementLink anchor = + scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.idle(16); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); + scene.world.rotateSection(anchor, 0, -90, 0, 12); + scene.world.rotateSection(contraption, 0, -90, 0, 12); + scene.idle(9); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.idle(15); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + + scene.overlay.showText(80) + .attachKeyFrame() + .text("Cart Contraptions will rotate to face towards their carts' motion") + .pointAt(util.vector.of(1.5, 2.5, 0)) + .placeNearTarget(); + scene.idle(90); + + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.world.hideIndependentSection(anchor, Direction.UP); + scene.overlay.hideElement(cart, Direction.UP); + scene.idle(25); + + Vec3d blockSurface = util.vector.blockSurface(assemblerPos, Direction.NORTH) + .add(0, 0, -2 / 16f); + scene.overlay.showScrollInput(blockSurface, Direction.NORTH, 60); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() + .withWrench(), 60); + scene.idle(10); + scene.overlay.showText(60) + .pointAt(util.vector.of(3, 1.5, 3)) + .placeNearTarget() + .sharedText("behaviour_modify_wrench"); + scene.idle(70); + + contraption = scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN); + cart = scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, MinecartEntity::new); + scene.idle(10); + scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.idle(10); + anchor = scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.idle(16); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); + scene.idle(9); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.idle(15); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + + scene.overlay.showText(80) + .attachKeyFrame() + .text("If the Assembler is set to Lock Rotation, the contraptions' orientation will never change") + .pointAt(util.vector.of(0, 2.5, 1.5)) + .placeNearTarget(); + scene.idle(90); + } + + public static void dual(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_dual", "Assembling Carriage Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int z = 0; z < 5; z++) { + scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.idle(2); + } + for (int x = 2; x < 6; x++) { + scene.world.showSection(util.select.position(x, 1, 4), Direction.DOWN); + scene.idle(2); + } + + BlockPos assembler1 = util.grid.at(2, 1, 4); + BlockPos assembler2 = util.grid.at(5, 1, 4); + Selection chassis = util.select.fromTo(5, 2, 4, 2, 2, 4); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 2), Direction.SOUTH); + scene.idle(5); + ElementLink cart = + scene.special.createCart(util.vector.topOf(assembler1.down()), 0, MinecartEntity::new); + ElementLink cart2 = + scene.special.createCart(util.vector.topOf(assembler2.down()), 0, ChestMinecartEntity::new); + scene.idle(15); + scene.world.setBlock(assembler1, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.CONTROLLER_RAIL), true); + scene.idle(5); + scene.world.setBlock(assembler2, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(5); + + ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + scene.idle(15); + scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(assembler2), 60); + scene.overlay.showSelectionWithText(util.select.position(assembler1), 60) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 4), Direction.NORTH)) + .placeNearTarget() + .text("Whenever two Cart Assembers share an attached structure...") + .attachKeyFrame(); + scene.idle(70); + + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 4), Direction.NORTH)) + .placeNearTarget() + .text("Powering either of them will create a Carriage Contraption"); + scene.idle(70); + + scene.effects.indicateRedstone(util.grid.at(2, 1, 2)); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 2, 1, 4)); + ElementLink anchors = + scene.world.showIndependentSectionImmediately(util.select.fromTo(assembler1.south(), assembler2.south())); + scene.world.moveSection(anchors, util.vector.of(0, 0, -1), 0); + scene.world.configureCenterOfRotation(anchors, util.vector.centerOf(util.grid.at(2, 2, 5))); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(util.grid.at(2, 2, 4))); + scene.idle(5); + + Vec3d m = util.vector.of(-0.5, 0, 0); + scene.special.moveCart(cart, m, 5); + scene.special.moveCart(cart2, m, 5); + scene.world.moveSection(contraption, m, 5); + scene.world.moveSection(anchors, m, 5); + scene.idle(5); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart2, util.vector.of(-.3, 0, 0), 8); + m = util.vector.of(-.5, 0, -.5); + scene.special.moveCart(cart, m, 8); + scene.world.moveSection(anchors, m, 8); + scene.world.moveSection(contraption, m, 8); + scene.world.rotateSection(anchors, 0, -10, 0, 8); + scene.world.rotateSection(contraption, 0, -10, 0, 8); + scene.idle(8); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart2, util.vector.of(-.4, 0, 0), 5); + m = util.vector.of(0, 0, -3.5); + scene.special.moveCart(cart, m, 25); + scene.world.moveSection(anchors, m, 25); + scene.world.moveSection(contraption, m, 25); + scene.world.rotateSection(anchors, 0, -33, 0, 10); + scene.world.rotateSection(contraption, 0, -33, 0, 10); + scene.idle(5); + scene.special.moveCart(cart2, util.vector.of(-0.8, 0, 0), 5); + scene.idle(5); + scene.special.moveCart(cart2, util.vector.of(-1.5, 0, 0), 9); + scene.world.rotateSection(anchors, 0, -42, 0, 9); + scene.world.rotateSection(contraption, 0, -42, 0, 9); + scene.idle(9); + m = util.vector.of(-.5, 0, -.5); + scene.special.moveCart(cart2, m, 2); + scene.special.rotateCart(cart2, -45, 2); + scene.world.rotateSection(anchors, 0, -5, 0, 5); + scene.world.rotateSection(contraption, 0, -5, 0, 5); + scene.idle(2); + scene.special.moveCart(cart2, util.vector.of(0, 0, -.5), 5); + scene.special.rotateCart(cart2, -45, 2); + scene.idle(10); + + scene.overlay.showText(70) + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.WEST)) + .placeNearTarget() + .text("The carts will behave like those connected via Minecart Coupling"); + scene.idle(80); + + } + + public static void rails(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_rails", "Other types of Minecarts and Rails"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int x = 0; x < 6; x++) { + scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.idle(2); + } + + BlockPos assembler = util.grid.at(3, 1, 3); + + Selection chassis = util.select.fromTo(4, 2, 3, 2, 2, 3); + + scene.idle(5); + scene.overlay.showText(70) + .attachKeyFrame() + .pointAt(util.vector.blockSurface(assembler, Direction.DOWN)) + .placeNearTarget() + .text("Cart Assemblers on Regular Tracks will not affect the passing carts' motion"); + scene.idle(10); + scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(70); + + ElementLink cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, MinecartEntity::new); + ElementLink anchor = + scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(assembler.south() + .up()), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); + scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.idle(10); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); + scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); + scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 25); + scene.idle(30); + scene.overlay.hideElement(cart, Direction.UP); + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.world.moveSection(anchor, util.vector.of(0, -3, 0), 0); + scene.idle(30); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler), Pointing.DOWN) + .withItem(new ItemStack(Items.POWERED_RAIL)), 50); + scene.idle(7); + scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.POWERED_RAIL), true); + scene.overlay.showText(100) + .attachKeyFrame() + .pointAt(util.vector.topOf(assembler)) + .placeNearTarget() + .text("When on Powered or Controller Rail, the carts will be held in place until it's Powered"); + scene.idle(110); + + scene.world.hideIndependentSection(anchor, Direction.DOWN); + cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, MinecartEntity::new); + anchor = scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); + contraption = scene.world.showIndependentSection(util.select.position(assembler.south() + .up()), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); + scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.idle(10); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); + scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); + scene.special.moveCart(cart, util.vector.of(-2, 0, 0), 10); + scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + scene.idle(30); + + scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); + scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.idle(5); + + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 15); + scene.special.moveCart(cart, util.vector.of(-3, 0, 0), 15); + + scene.idle(30); + scene.overlay.hideElement(cart, Direction.UP); + scene.world.hideIndependentSection(anchor, Direction.UP); + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.idle(20); + + cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, FurnaceMinecartEntity::new); + scene.idle(10); + scene.overlay.showText(50) + .attachKeyFrame() + .pointAt(util.vector.topOf(assembler.east(2))) + .placeNearTarget() + .text("Other types of Minecarts can be used as the anchor"); + scene.idle(50); + contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + scene.idle(5); + scene.world.glueBlockOnto(assembler.up(2), Direction.DOWN, contraption); + scene.idle(15); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler.up()), Pointing.UP) + .withItem(new ItemStack(Items.CHARCOAL)), 40); + scene.idle(7); + scene.overlay.showText(80) + .pointAt(util.vector.blockSurface(assembler.up(2), Direction.WEST)) + .placeNearTarget() + .text("Furnace Carts will keep themselves powered, pulling fuel from any attached inventories"); + scene.idle(85); + + Emitter smoke = Emitter.simple(ParticleTypes.LARGE_SMOKE, util.vector.of(0, 0, 0)); + + scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 50); + scene.idle(20); + anchor = scene.world.showIndependentSectionImmediately(util.select.position(assembler.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 30); + scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 30); + + Vec3d vec = util.vector.centerOf(assembler) + .add(.25, .25, -0.5); + for (int i = 0; i < 7; i++) { + scene.effects.emitParticles(vec = vec.add(-.5, 0, 0), smoke, 2, 1); + scene.idle(5); + } + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java new file mode 100644 index 000000000..720bd870d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java @@ -0,0 +1,460 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.elements.EntityElement; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.SheepEntity; +import net.minecraft.item.DyeColor; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class DeployerScenes { + + public static void filter(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer", "Using the Deployer"); + scene.configureBasePlate(0, 0, 5); + + BlockPos potPosition = util.grid.at(1, 1, 2); + BlockPos deployerPos = util.grid.at(3, 1, 2); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.setBlock(potPosition, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(util.select.layer(0) + .add(util.select.position(1, 1, 2)), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + scene.world.showSection(deployerSelection, Direction.SOUTH); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.topOf(deployerPos)) + .text("Given Rotational Force, a Deployer can imitate player interactions"); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(44); + + scene.overlay.showSelectionWithText(util.select.position(deployerPos.west(2)), 60) + .text("It will always interact with the position 2 blocks in front of itself") + .attachKeyFrame() + .placeNearTarget() + .colored(PonderPalette.GREEN) + .attachKeyFrame(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.DOWN); + scene.idle(24); + + scene.overlay.showText(50) + .pointAt(util.vector.topOf(deployerPos.west())) + .text("Blocks directly in front will not obstruct it") + .placeNearTarget(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(34); + scene.world.hideSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.UP); + scene.idle(20); + + String[] actions = + new String[] { "Place Blocks,", "Use Items,", "Activate Blocks,", "Harvest blocks", "and Attack Mobs" }; + + scene.overlay.showText(80) + .attachKeyFrame() + .independent(40) + .placeNearTarget() + .text("Deployers can:"); + + int y = 60; + for (String s : actions) { + scene.idle(15); + scene.overlay.showText(50) + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .independent(y) + .text(s); + y += 16; + } + scene.idle(50); + + ItemStack pot = new ItemStack(Items.FLOWER_POT); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.DOWN).rightClick() + .withItem(pot), 40); + scene.idle(7); + Class teType = DeployerTileEntity.class; + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", pot.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(frontVec) + .text("Right-click the front to give it an Item to use"); + scene.idle(40); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.restoreBlocks(util.select.position(potPosition)); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + + scene.world.showSection(util.select.position(deployerPos.up()), Direction.DOWN); + + ItemStack tulip = new ItemStack(Items.RED_TULIP); + Vec3d entitySpawn = util.vector.topOf(deployerPos.up(3)); + + ElementLink entity1 = + scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), tulip); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", tulip.serializeNBT())); + scene.idle(10); + scene.overlay.showText(40) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Items can also be inserted automatically"); + scene.idle(30); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.setBlock(potPosition, Blocks.POTTED_RED_TULIP.getDefaultState(), false); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(25); + scene.world.hideSection(util.select.position(potPosition), Direction.UP); + scene.world.hideSection(util.select.position(deployerPos.up()), Direction.EAST); + scene.idle(20); + + Vec3d filterSlot = frontVec.add(0.375, 0.25, 0); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("Deployers carry a filter slot"); + scene.idle(50); + + ItemStack shears = new ItemStack(Items.SHEARS); + + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).rightClick() + .withItem(shears), 40); + scene.idle(7); + scene.world.setFilterData(deployerSelection, teType, shears); + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(filterSlot) + .text("When a filter is set, it activates only while holding a matching item"); + scene.idle(70); + + ElementLink sheep = scene.world.createEntity(w -> { + SheepEntity entity = EntityType.SHEEP.create(w); + entity.setFleeceColor(DyeColor.PINK); + Vec3d p = util.vector.topOf(util.grid.at(1, 0, 2)); + entity.setPosition(p.x, p.y, p.z); + entity.prevPosX = p.x; + entity.prevPosY = p.y; + entity.prevPosZ = p.z; + entity.limbSwing = 0; + entity.prevRotationYaw = 210; + entity.rotationYaw = 210; + entity.prevRotationYawHead = 210; + entity.rotationYawHead = 210; + return entity; + }); + scene.idle(20); + scene.world.showSection(util.select.position(deployerPos.up()), Direction.WEST); + entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), shears); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", shears.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Only items matching the filter can now be inserted..."); + + scene.idle(70); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.modifyEntity(sheep, e -> ((SheepEntity) e).setSheared(true)); + scene.effects.emitParticles(util.vector.topOf(deployerPos.west(2)) + .add(0, -.25, 0), + Emitter.withinBlockSpace(new BlockParticleData(ParticleTypes.BLOCK, Blocks.PINK_WOOL.getDefaultState()), + util.vector.of(0, 0, 0)), + 25, 1); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.world.showSection(util.select.position(deployerPos.north()), Direction.SOUTH); + scene.idle(25); + + scene.overlay.showText(80) + .placeNearTarget() + .pointAt(util.vector.of(3.5, 1.25, 1.25)) + .text("...and only non-matching items will be extracted"); + scene.world.flapFunnel(deployerPos.north(), true); + scene.world.createItemEntity(util.vector.centerOf(deployerPos.north()) + .subtract(0, .45, 0), util.vector.of(0, 0, -0.1), new ItemStack(Items.PINK_WOOL)); + + scene.markAsFinished(); + for (int i = 0; i < 10; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(26); + } + } + + public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_modes", "Modes of the Deployer"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + BlockPos deployerPos = util.grid.at(3, 1, 2); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + Selection grassBlock = util.select.position(1, 1, 2); + + Selection deployerSelection = util.select.position(deployerPos); + scene.world.showSection(deployerSelection, Direction.DOWN); + scene.idle(10); + scene.world.showSection(grassBlock, Direction.DOWN); + scene.idle(10); + + ItemStack tool = new ItemStack(Items.GOLDEN_HOE); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(deployerPos), Pointing.DOWN).withItem(tool), + 30); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, + nbt -> nbt.put("HeldItem", tool.serializeNBT())); + scene.idle(45); + + scene.world.setKineticSpeed(util.select.position(2, 0, 5), 16); + scene.world.setKineticSpeed(util.select.layer(1), -32); + scene.world.moveDeployer(deployerPos, 1, 25); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("By default, a Deployer imitates a Right-click interaction"); + + scene.idle(26); + scene.world.replaceBlocks(grassBlock, Blocks.FARMLAND.getDefaultState(), false); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(46); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); + scene.idle(45); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("Using a Wrench, it can be set to imitate a Left-click instead"); + + BlockPos breakingPos = deployerPos.west(2); + for (int i = 0; i < 4; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.moveDeployer(deployerPos, -1, 25); + if (i == 3) + scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, 0, 0), + new ItemStack(Blocks.DIRT)); + scene.idle(26); + + if (i == 0) + scene.markAsFinished(); + } + } + + public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_redstone", "Controlling Deployers with Redstone"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 5, 3, 1, 3), Direction.DOWN); + + BlockPos deployerPos = util.grid.at(3, 1, 3); + Selection redstone = util.select.fromTo(3, 1, 1, 3, 1, 2); + BlockPos leverPos = util.grid.at(3, 1, 1); + + scene.world.toggleRedstonePower(redstone); + + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + scene.world.showSection(redstone, Direction.SOUTH); + scene.idle(31); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(10); + + scene.overlay.showText(60) + .colored(PonderPalette.RED) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("When powered by Redstone, Deployers will not activate"); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(10); + scene.world.moveDeployer(deployerPos, 1f, 30); + scene.idle(10); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(21); + + scene.overlay.showText(60) + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Before stopping, the Deployer will finish any started cycles"); + + scene.world.moveDeployer(deployerPos, -1f, 30); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(3); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.overlay.showText(100) + .colored(PonderPalette.GREEN) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + + } + + public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_contraption", "Using Deployers on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + Selection flowers = util.select.fromTo(4, 1, 1, 1, 1, 1); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 3); + BlockPos deployerPos = util.grid.at(4, 1, 3); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.showSection(util.select.layer(0) + .add(flowers), Direction.UP); + scene.idle(5); + + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 2, 8, 1, 2), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.world.showSection(kinetics, Direction.DOWN); + scene.idle(5); + + ElementLink contraption = + scene.world.showIndependentSection(deployerSelection, Direction.DOWN); + scene.idle(5); + scene.world.glueBlockOnto(util.grid.at(4, 2, 3), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(deployerPos, Direction.WEST)) + .text("Whenever Deployers are moved as part of an animated Contraption..."); + scene.idle(70); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.restoreBlocks(util.select.position(4 - x, 1, 1)); + scene.idle(18); + } + + scene.overlay.showSelectionWithText(flowers, 90) + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .text("They activate at each visited location, using items from inventories anywhere on the contraption"); + scene.idle(100); + + scene.world.hideSection(flowers, Direction.UP); + scene.idle(15); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(flowers, Direction.UP); + + Vec3d frontVec = util.vector.blockSurface(deployerPos.west(3), Direction.NORTH) + .add(0, 0, -.125); + Vec3d filterSlot = frontVec.add(0, 0.25, 0.375); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("The Filter slot can be used to specify which items to pull"); + scene.idle(70); + + ItemStack poppy = new ItemStack(Items.POPPY); + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(poppy), 30); + scene.idle(7); + scene.world.setFilterData(deployerSelection, DeployerTileEntity.class, poppy); + scene.idle(25); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(kinetics, -16); + scene.world.moveSection(pistonHead, util.vector.of(3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.setBlock(util.grid.at(1 + x, 1, 1), Blocks.POPPY.getDefaultState(), false); + scene.idle(18); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 03ab44c64..2e6dfe173 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -3,21 +3,28 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; +import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; +import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.utility.Pointing; import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FurnaceBlock; +import net.minecraft.block.RedstoneWireBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; @@ -280,7 +287,7 @@ public class KineticsScenes { scene.title("gearbox", "Relaying rotational force using Gearboxes"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - + scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.fromTo(4, 1, 6, 3, 2, 5), Direction.UP); scene.idle(10); @@ -689,4 +696,318 @@ public class KineticsScenes { scene.idle(90); } + public static void sequencedGearshift(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("sequenced_gearshift", "Controlling Rotational Speed using Sequenced Gearshifts"); + scene.configureBasePlate(1, 0, 5); + scene.showBasePlate(); + + Selection redstone = util.select.fromTo(3, 1, 0, 3, 1, 1); + + scene.world.showSection(util.select.position(6, 0, 3) + .add(redstone), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(6, 1, 2, 4, 1, 2), Direction.DOWN); + + BlockPos gearshiftPos = util.grid.at(3, 1, 2); + Selection gearshiftSelection = util.select.position(gearshiftPos); + BlockPos bearingPos = util.grid.at(1, 1, 2); + BlockPos buttonPos = util.grid.at(3, 1, 0); + Selection outputKinetics = util.select.fromTo(3, 1, 2, 1, 1, 2); + + scene.world.setKineticSpeed(gearshiftSelection, 0); + scene.idle(10); + + scene.world.showSection(gearshiftSelection, Direction.DOWN); + scene.idle(10); + + scene.world.showSection(util.select.fromTo(2, 1, 2, 1, 1, 2), Direction.EAST); + scene.idle(10); + + Vec3d top = util.vector.topOf(gearshiftPos); + scene.overlay.showText(60) + .text("Seq. Gearshifts relay rotation by following a timed list of instructions") + .attachKeyFrame() + .pointAt(top) + .placeNearTarget(); + scene.idle(80); + + scene.overlay.showControls(new InputWindowElement(top, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.overlay.showSelectionWithText(gearshiftSelection, 50) + .colored(PonderPalette.BLUE) + .text("Right-click it to open the Configuration UI") + .pointAt(top) + .placeNearTarget(); + scene.idle(60); + + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(0, 3, 2, 0, 0, 2), Direction.EAST); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(buttonPos); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.idle(20); + + scene.overlay.showText(80) + .text("Upon receiving a Redstone Signal, it will start running its configured sequence") + .attachKeyFrame() + .pointAt(top); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, -32); + scene.world.rotateBearing(bearingPos, -180, 40); + scene.world.rotateSection(contraption, -180, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + scene.idle(20); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + + scene.idle(20); + scene.overlay.showText(70) + .text("Once finished, it waits for the next Redstone Signal and starts over") + .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + scene.idle(80); + + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(buttonPos); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(20); + + scene.overlay.showText(60) + .text("A redstone comparator can be used to read the current progress") + .attachKeyFrame() + .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + + scene.world.hideSection(redstone, Direction.NORTH); + scene.idle(15); + + BlockPos wire = util.grid.at(5, 1, 0); + Selection nixie = util.select.position(4, 1, 0); + ElementLink comparator = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 4, 1, 0), Direction.SOUTH); + scene.world.moveSection(comparator, util.vector.of(-2, 0, 0), 0); + scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 1)); + + scene.idle(5); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, -32); + scene.world.rotateBearing(bearingPos, -180, 40); + scene.world.rotateSection(contraption, -180, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 2)); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 3)); + scene.idle(20); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 4)); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.modifyBlock(wire, s -> s.with(RedstoneWireBlock.POWER, 0), false); + scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); + scene.world.setKineticSpeed(outputKinetics, 0); + } + + public static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util) { + furnaceEngine(scene, util, false); + } + + public static void flywheel(SceneBuilder scene, SceneBuildingUtil util) { + furnaceEngine(scene, util, true); + } + + private static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util, boolean flywheel) { + scene.title(flywheel ? "flywheel" : "furnace_engine", + "Generating Rotational Force using the " + (flywheel ? "Flywheel" : "Furnace Engine")); + scene.configureBasePlate(0, 0, 6); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos furnacePos = util.grid.at(4, 1, 3); + BlockPos cogPos = util.grid.at(1, 1, 2); + BlockPos gaugePos = util.grid.at(1, 1, 1); + + scene.idle(5); + Selection furnaceSelect = util.select.position(furnacePos); + scene.world.showSection(furnaceSelect, Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(furnacePos.west()), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(furnacePos.west(3)), Direction.EAST); + scene.idle(10); + + String text = flywheel ? "Flywheels are required for generating rotational force with the Furnace Engine" + : "Furnace Engines generate Rotational Force while their attached Furnace is running"; + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(furnacePos.west(flywheel ? 3 : 1))) + .text(text); + scene.idle(90); + + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(furnacePos), Pointing.DOWN).withItem(new ItemStack(Items.OAK_LOG)), + 30); + scene.idle(5); + scene.overlay + .showControls(new InputWindowElement(util.vector.blockSurface(furnacePos, Direction.NORTH), Pointing.RIGHT) + .withItem(new ItemStack(Items.COAL)), 30); + scene.idle(7); + scene.world.cycleBlockProperty(furnacePos, FurnaceBlock.LIT); + scene.effects.emitParticles(util.vector.of(4.5, 1.2, 2.9), Emitter.simple(ParticleTypes.LAVA, Vec3d.ZERO), 4, + 1); + scene.world.setKineticSpeed(util.select.fromTo(1, 1, 3, 1, 1, 1), 16); + scene.idle(40); + + scene.world.showSection(util.select.position(cogPos), Direction.SOUTH); + scene.idle(15); + scene.effects.rotationSpeedIndicator(cogPos); + scene.world.showSection(util.select.position(gaugePos), Direction.SOUTH); + scene.idle(15); + + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(gaugePos, Direction.WEST)) + .text("The provided Rotational Force has a very large stress capacity"); + scene.idle(90); + + ElementLink engine = + scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 3, 1, 1, 1)); + scene.world.moveSection(engine, util.vector.of(0, 1, 0), 15); + scene.idle(10); + scene.world.hideSection(furnaceSelect, Direction.NORTH); + scene.idle(15); + scene.world.setBlock(furnacePos, Blocks.BLAST_FURNACE.getDefaultState() + .with(FurnaceBlock.FACING, Direction.NORTH) + .with(FurnaceBlock.LIT, true), false); + scene.world.showSection(furnaceSelect, Direction.NORTH); + scene.idle(10); + scene.world.moveSection(engine, util.vector.of(0, -1, 0), 15); + scene.idle(10); + scene.world.setKineticSpeed(util.select.fromTo(1, 1, 3, 1, 1, 1), 32); + scene.idle(5); + scene.effects.rotationSpeedIndicator(cogPos); + + scene.overlay.showText(80) + .placeNearTarget() + .colored(PonderPalette.MEDIUM) + .pointAt(util.vector.topOf(furnacePos.west())) + .text("Using a Blast Furnace will double the efficiency of the Engine"); + + } + + public static void speedController(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("rotation_speed_controller", "Using the Rotational Speed Controller"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos cogPos = util.grid.at(1, 2, 1); + Selection gaugeSelect = util.select.position(1, 2, 3); + + scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.5f); + scene.world.setKineticSpeed(gaugeSelect, 0); + scene.world.showSection(util.select.fromTo(5, 1, 1, 2, 1, 1), Direction.DOWN); + scene.world.showSection(util.select.fromTo(1, 1, 3, 1, 2, 3), Direction.DOWN); + scene.idle(10); + ElementLink rsc = + scene.world.showIndependentSection(util.select.position(0, 1, 1), Direction.DOWN); + scene.world.moveSection(rsc, util.vector.of(1, 0, 0), 0); + ElementLink rsc2 = + scene.world.showIndependentSection(util.select.position(1, 1, 1), Direction.DOWN); + scene.world.moveSection(rsc2, util.vector.of(0, -100, 0), 0); + scene.idle(10); + scene.world.showSection(util.select.position(1, 2, 1), Direction.DOWN); + scene.idle(15); + scene.effects.indicateSuccess(cogPos); + scene.world.moveSection(rsc2, util.vector.of(0, 100, 0), 0); + scene.world.moveSection(rsc, util.vector.of(0, -100, 0), 0); + scene.idle(5); + scene.world.showSection(util.select.position(1, 2, 2), Direction.DOWN); + scene.idle(10); + scene.world.setKineticSpeed(gaugeSelect, 8); + scene.effects.indicateSuccess(util.grid.at(1, 2, 3)); + + scene.overlay.showText(90) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.blockSurface(cogPos, Direction.NORTH)) + .text("Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them"); + scene.idle(100); + + Vec3d inputVec = util.vector.of(1.5, 1.75, 1); + scene.overlay.showFilterSlotInput(inputVec, 60); + + scene.overlay.showText(70) + .placeNearTarget() + .attachKeyFrame() + .pointAt(inputVec) + .text("Using the scroll input on its side, the conveyed speed can be configured"); + scene.idle(80); + + InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).scroll(); + scene.overlay.showControls(input, 40); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(55); + scene.markAsFinished(); + + scene.overlay.showControls(input, 30); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(55); + + scene.overlay.showControls(input, 30); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), -.05f); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(35); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index fb6aa603f..aa8d10831 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -173,6 +173,7 @@ public class MechanicalSawScenes { public static void treeCutting(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) @@ -265,6 +266,7 @@ public class MechanicalSawScenes { public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); scene.configureBasePlate(1, 0, 6); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index 8c262ceca..20b35a35a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -1,19 +1,27 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FlappyPose; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.CropsBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -189,4 +197,313 @@ public class MovementActorScenes { scene.markAsFinished(); } + public static void harvester(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_harvester", "Using Mechanical Harvesters on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection crops = util.select.fromTo(4, 1, 2, 3, 1, 2) + .add(util.select.fromTo(3, 1, 1, 2, 1, 1) + .add(util.select.position(2, 1, 3)) + .add(util.select.position(1, 1, 2))); + + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos bearingPos = util.grid.at(4, 1, 4); + + scene.idle(5); + scene.world.showSection(crops, Direction.UP); + scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 2, 4, 2, 2, 5) + .add(util.select.fromTo(2, 1, 5, 0, 1, 5)), Direction.DOWN); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.idle(10); + + for (int i = 0; i < 3; i++) { + scene.world.showSectionAndMerge(util.select.position(i, 1, 4), Direction.SOUTH, contraption); + scene.idle(5); + } + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 4), Direction.SOUTH)) + .text("Whenever Harvesters are moved as part of an animated Contraption..."); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + BlockState harvested = Blocks.WHEAT.getDefaultState(); + ItemStack wheatItem = new ItemStack(Items.WHEAT); + + scene.idle(5); + BlockPos current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.2, 0.3, 0), wheatItem); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(1, 0, 2)) + .text("They will harvest and reset any mature crops on their way") + .placeNearTarget(); + + scene.idle(101); + scene.world.hideSection(crops, Direction.DOWN); + scene.idle(15); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(crops, Direction.UP); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + scene.idle(10); + + scene.world.cycleBlockProperty(util.grid.at(1, 1, 5), LinearChassisBlock.STICKY_TOP); + scene.world.glueBlockOnto(util.grid.at(1, 2, 5), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 5), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + scene.idle(5); + current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + + scene.idle(116); + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(1, 2, 5), Pointing.DOWN).withItem(wheatItem), 50); + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + } + + public static void plough(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_plough", "Using Mechanical Ploughs on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection garbage = util.select.fromTo(2, 1, 3, 1, 1, 2); + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 2); + Selection dynamic = util.select.fromTo(4, 0, 6, 5, 1, 6); + + scene.showBasePlate(); + ElementLink cogs = + scene.world.showIndependentSection(util.select.fromTo(4, 0, 6, 5, 1, 6), Direction.UP); + scene.idle(5); + scene.world.showSection(kinetics.substract(dynamic), Direction.DOWN); + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 1, 3, 4, 1, 2), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(3, 1, 3), Direction.EAST, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 1, 2), Direction.EAST, contraption); + scene.idle(20); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Whenever Ploughs are moved as part of an animated Contraption..."); + scene.idle(50); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + + Vec3d m = util.vector.of(-0.1, .2, 0); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 3), m, new ItemStack(Items.LEVER)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 2), m, new ItemStack(Items.TORCH)); + + scene.idle(30); + + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 3), m, new ItemStack(Items.RAIL)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 2), m, new ItemStack(Items.REDSTONE)); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.EAST)) + .text("...they will break blocks without a solid collision hitbox"); + scene.idle(50); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world.hideSection(garbage, Direction.UP); + scene.idle(40); + scene.world.setBlocks(garbage, Blocks.SNOW.getDefaultState(), false); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + ElementLink chest = + scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(15); + scene.effects.superGlue(util.grid.at(4, 2, 2), Direction.DOWN, true); + scene.idle(45); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.idle(30); + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.idle(15); + + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(2, 2, 2), Pointing.DOWN).withItem(new ItemStack(Items.SNOWBALL)), + 40); + scene.idle(40); + scene.world.hideIndependentSection(chest, Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.idle(40); + + Selection dirt = util.select.fromTo(2, 0, 3, 1, 0, 2); + scene.world.hideSection(dirt, Direction.DOWN); + scene.idle(15); + scene.world.setBlocks(dirt, Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.showSection(dirt, Direction.UP); + scene.overlay.showText(60) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Additionally, ploughs can create farmland"); + scene.idle(30); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.setBlocks(util.select.fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(30); + scene.world.setBlocks(util.select.fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + + scene.idle(50); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world.hideSection(kinetics.substract(dynamic), Direction.EAST); + scene.world.hideSection(dirt, Direction.DOWN); + scene.world.hideIndependentSection(pistonHead, Direction.EAST); + scene.world.moveSection(cogs, util.vector.of(-1, 0, 0), 15); + scene.idle(15); + scene.world.restoreBlocks(dirt); + scene.world.showSection(dirt, Direction.UP); + scene.world.showSection(util.select.fromTo(4, 1, 6, 4, 3, 4), Direction.NORTH); + scene.idle(15); + scene.world.showSectionAndMerge(util.select.fromTo(4, 3, 3, 4, 2, 3), Direction.DOWN, contraption); + scene.idle(15); + + BlockPos bearingPos = util.grid.at(4, 3, 4); + scene.addKeyframe(); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(util.select.position(5, 1, 6), -16); + scene.world.setKineticSpeed(util.select.position(4, 3, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 1, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 2, 5), 16); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world.rotateSection(contraption, 0, 0, 90, 20); + scene.world.rotateBearing(bearingPos, 90, 20); + + scene.idle(10); + ElementLink birb = scene.special.createBirb(util.vector.topOf(3, 0, 2) + .add(0, 0, 0.5), FlappyPose::new); + scene.idle(11); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.rotateSection(contraption, 0, 0, -135, 10); + scene.world.rotateBearing(bearingPos, -135, 10); + scene.idle(7); + scene.special.moveParrot(birb, util.vector.of(-20, 15, 0), 20); + scene.special.rotateParrot(birb, 0, 360, 0, 20); + scene.idle(3); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.idle(20); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.centerOf(util.grid.at(1, 3, 2))) + .text("...they can also launch entities without hurting them"); + scene.idle(30); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index d1c4b0a5d..fa3411878 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -45,6 +45,9 @@ public class PonderIndex { PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, PonderTag.KINETIC_RELAYS); + PonderRegistry.forComponents(AllBlocks.SEQUENCED_GEARSHIFT) + .addStoryBoard("sequenced_gearshift", KineticsScenes::sequencedGearshift); + PonderRegistry.forComponents(AllBlocks.ENCASED_FAN) .addStoryBoard("fan/direction", FanScenes::direction, PonderTag.KINETIC_APPLIANCES) .addStoryBoard("fan/processing", FanScenes::processing) @@ -67,6 +70,13 @@ public class PonderIndex { PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); + PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE) + .addStoryBoard("furnace_engine", KineticsScenes::furnaceEngine); + PonderRegistry.forComponents(AllBlocks.FLYWHEEL) + .addStoryBoard("furnace_engine", KineticsScenes::flywheel); + PonderRegistry.forComponents(AllBlocks.ROTATION_SPEED_CONTROLLER) + .addStoryBoard("speed_controller", KineticsScenes::speedController); + // Funnels PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); PonderRegistry.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) @@ -134,6 +144,13 @@ public class PonderIndex { .addStoryBoard("gantry/direction", GantryScenes::direction) .addStoryBoard("gantry/subgantry", GantryScenes::subgantry); + // Cart Assembler + PonderRegistry.forComponents(AllBlocks.CART_ASSEMBLER) + .addStoryBoard("cart_assembler/anchor", CartAssemblerScenes::anchor, PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("cart_assembler/modes", CartAssemblerScenes::modes) + .addStoryBoard("cart_assembler/dual", CartAssemblerScenes::dual) + .addStoryBoard("cart_assembler/rails", CartAssemblerScenes::rails); + // Movement Actors PonderRegistry.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, PonderTag.CONTRAPTION_ACTOR) @@ -148,6 +165,15 @@ public class PonderIndex { .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, PonderTag.KINETIC_APPLIANCES) .addStoryBoard("mechanical_drill/contraption", MechanicalDrillScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + PonderRegistry.forComponents(AllBlocks.DEPLOYER) + .addStoryBoard("deployer/filter", DeployerScenes::filter, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("deployer/modes", DeployerScenes::modes) + .addStoryBoard("deployer/redstone", DeployerScenes::redstone) + .addStoryBoard("deployer/contraption", DeployerScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_HARVESTER) + .addStoryBoard("harvester", MovementActorScenes::harvester); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_PLOUGH) + .addStoryBoard("plough", MovementActorScenes::plough); // Redstone PonderRegistry.forComponents(AllBlocks.PULSE_REPEATER) @@ -208,6 +234,7 @@ public class PonderIndex { .add(AllBlocks.MECHANICAL_CRAFTER) .add(AllBlocks.MECHANICAL_DRILL) .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.DEPLOYER) .add(AllBlocks.MECHANICAL_PUMP) .add(AllBlocks.MECHANICAL_ARM) .add(AllBlocks.MECHANICAL_PISTON) @@ -320,7 +347,6 @@ public class PonderIndex { .add(AllBlocks.BRASS_FUNNEL) .add(AllBlocks.SEATS[0]) .add(AllBlocks.REDSTONE_CONTACT) - .add(AllBlocks.SAIL) .add(Blocks.BELL) .add(Blocks.DISPENSER) .add(Blocks.DROPPER); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java new file mode 100644 index 000000000..e121895b9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java @@ -0,0 +1,113 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class MinecartElement extends AnimatedSceneElement { + + private Vec3d location; + private LerpedFloat rotation; + private AbstractMinecartEntity entity; + private MinecartConstructor constructor; + private float initialRotation; + + public interface MinecartConstructor { + AbstractMinecartEntity create(World w, double x, double y, double z); + } + + public MinecartElement(Vec3d location, float rotation, MinecartConstructor constructor) { + initialRotation = rotation; + this.location = location.add(0, 1 / 16f, 0); + this.constructor = constructor; + this.rotation = LerpedFloat.angular() + .startWithValue(rotation); + } + + @Override + public void reset(PonderScene scene) { + super.reset(scene); + entity.setPos(0, 0, 0); + entity.prevPosX = 0; + entity.prevPosY = 0; + entity.prevPosZ = 0; + entity.lastTickPosX = 0; + entity.lastTickPosY = 0; + entity.lastTickPosZ = 0; + rotation.startWithValue(initialRotation); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (entity == null) + entity = constructor.create(scene.getWorld(), 0, 0, 0); + + entity.ticksExisted++; + entity.onGround = true; + entity.prevPosX = entity.getX(); + entity.prevPosY = entity.getY(); + entity.prevPosZ = entity.getZ(); + entity.lastTickPosX = entity.getX(); + entity.lastTickPosY = entity.getY(); + entity.lastTickPosZ = entity.getZ(); + } + + public void setPositionOffset(Vec3d position, boolean immediate) { + if (entity == null) + return; + entity.setPosition(position.x, position.y, position.z); + if (!immediate) + return; + entity.prevPosX = position.x; + entity.prevPosY = position.y; + entity.prevPosZ = position.z; + } + + public void setRotation(float angle, boolean immediate) { + if (entity == null) + return; + rotation.setValue(angle); + if (!immediate) + return; + rotation.startWithValue(angle); + } + + public Vec3d getPositionOffset() { + return entity != null ? entity.getPositionVec() : Vec3d.ZERO; + } + + public Vec3d getRotation() { + return new Vec3d(0, rotation.getValue(), 0); + } + + @Override + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { + EntityRendererManager entityrenderermanager = Minecraft.getInstance() + .getRenderManager(); + if (entity == null) + entity = constructor.create(world, 0, 0, 0); + + ms.push(); + ms.translate(location.x, location.y, location.z); + ms.translate(MathHelper.lerp(pt, entity.prevPosX, entity.getX()), + MathHelper.lerp(pt, entity.prevPosY, entity.getY()), MathHelper.lerp(pt, entity.prevPosZ, entity.getZ())); + + MatrixStacker.of(ms) + .rotateY(rotation.getValue(pt)); + + entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java index c2ea78695..99d8081aa 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java @@ -50,13 +50,17 @@ public class ParrotElement extends AnimatedSceneElement { entity.lastTickPosX = 0; entity.lastTickPosY = 0; entity.lastTickPosZ = 0; + entity.prevRotationPitch = entity.rotationPitch = 0; + entity.prevRotationYaw = entity.rotationYaw = 180; } @Override public void tick(PonderScene scene) { super.tick(scene); - if (entity == null) - return; + if (entity == null) { + entity = pose.create(scene.getWorld()); + entity.prevRotationYaw = entity.rotationYaw = 180; + } entity.ticksExisted++; entity.prevRotationYawHead = entity.rotationYawHead; @@ -112,8 +116,10 @@ public class ParrotElement extends AnimatedSceneElement { EntityRendererManager entityrenderermanager = Minecraft.getInstance() .getRenderManager(); - if (entity == null) + if (entity == null) { entity = pose.create(world); + entity.prevRotationYaw = entity.rotationYaw = 180; + } ms.push(); ms.translate(location.x, location.y, location.z); @@ -209,10 +215,13 @@ public class ParrotElement extends AnimatedSceneElement { double d1 = p_200602_2_.y - vec3d.y; double d2 = p_200602_2_.z - vec3d.z; double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - entity.rotationPitch = + float targetPitch = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d1, d3) * (double) (180F / (float) Math.PI))); - entity.rotationYaw = + float targetYaw = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d2, d0) * (double) (180F / (float) Math.PI)) + 90); + + entity.rotationPitch = AngleHelper.angleLerp(.4f, entity.rotationPitch, targetPitch); + entity.rotationYaw = AngleHelper.angleLerp(.4f, entity.rotationYaw, targetYaw); } protected abstract Vec3d getFacedVec(PonderScene scene); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java index 2423c420e..cb985822c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java @@ -24,9 +24,9 @@ public class TextWindowElement extends AnimatedOverlayElement { // from 0 to 200 int y; - + Vec3d vec; - + boolean nearScene = false; int color = PonderPalette.WHITE.getColor(); @@ -52,7 +52,7 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.y = y; return this; } - + public Builder independent() { return independent(0); } @@ -71,12 +71,13 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.nearScene = true; return this; } - + public Builder attachKeyFrame() { - scene.builder().addLazyKeyframe(); + scene.builder() + .addLazyKeyframe(); return this; } - + } @Override @@ -86,7 +87,7 @@ public class TextWindowElement extends AnimatedOverlayElement { if (fade < 1 / 16f) return; Vec2f sceneToScreen = vec != null ? scene.getTransform() - .sceneToScreen(vec) : new Vec2f(0, (screen.height - 200) / 2 + y - 8); + .sceneToScreen(vec) : new Vec2f(screen.width / 2, (screen.height - 200) / 2 + y - 8); float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); @@ -122,7 +123,7 @@ public class TextWindowElement extends AnimatedOverlayElement { } FontHelper.drawSplitString(screen.getFontRenderer(), bakedText, targetX - 10, 3, textWidth, - ColorHelper.applyAlpha(brighterColor, fade)); + ColorHelper.applyAlpha(brighterColor, fade)); RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java index 629f31085..d2352b082 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java @@ -47,6 +47,7 @@ public class AnimateElementInstruction extends Tic if (element == null) return; if (remainingTicks == 0) { + setter.accept(element, target); setter.accept(element, target); return; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java new file mode 100644 index 000000000..8c23c2db7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java @@ -0,0 +1,28 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import java.util.function.BiConsumer; +import java.util.function.Function; + +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; + +import net.minecraft.util.math.Vec3d; + +public class AnimateMinecartInstruction extends AnimateElementInstruction { + + public static AnimateMinecartInstruction rotate(ElementLink link, float rotation, int ticks) { + return new AnimateMinecartInstruction(link, new Vec3d(0, rotation, 0), ticks, + (wse, v) -> wse.setRotation((float) v.y, ticks == 0), MinecartElement::getRotation); + } + + public static AnimateMinecartInstruction move(ElementLink link, Vec3d offset, int ticks) { + return new AnimateMinecartInstruction(link, offset, ticks, (wse, v) -> wse.setPositionOffset(v, ticks == 0), + MinecartElement::getPositionOffset); + } + + protected AnimateMinecartInstruction(ElementLink link, Vec3d totalDelta, int ticks, + BiConsumer setter, Function getter) { + super(link, totalDelta, ticks, setter, getter); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java index fd788e53d..273d520b2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.IBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.foundation.ponder.PonderScene; @@ -36,6 +37,14 @@ public class AnimateTileEntityInstruction extends TickingInstruction { .orElse(0f)); } + public static AnimateTileEntityInstruction deployer(BlockPos location, float totalDelta, int ticks) { + return new AnimateTileEntityInstruction(location, totalDelta, ticks, + (w, f) -> castIfPresent(w, location, DeployerTileEntity.class) + .ifPresent(deployer -> deployer.setAnimatedOffset(f)), + (w) -> castIfPresent(w, location, DeployerTileEntity.class).map(deployer -> deployer.getHandOffset(1)) + .orElse(0f)); + } + protected AnimateTileEntityInstruction(BlockPos location, float totalDelta, int ticks, BiConsumer setter, Function getter) { super(false, ticks); @@ -57,7 +66,11 @@ public class AnimateTileEntityInstruction extends TickingInstruction { public void tick(PonderScene scene) { super.tick(scene); PonderWorld world = scene.getWorld(); - setter.accept(world, (float) (remainingTicks == 0 ? target : getter.apply(world) + deltaPerTick)); + float current = getter.apply(world); + float next = (float) (remainingTicks == 0 ? target : current + deltaPerTick); + setter.accept(world, next); + if (remainingTicks == 0) // lock interpolation + setter.accept(world, next); } private static Optional castIfPresent(PonderWorld world, BlockPos pos, Class teType) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java new file mode 100644 index 000000000..a6216f177 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.elements.MinecartElement; + +import net.minecraft.util.Direction; + +public class CreateMinecartInstruction extends FadeIntoSceneInstruction { + + public CreateMinecartInstruction(int fadeInTicks, Direction fadeInFrom, MinecartElement element) { + super(fadeInTicks, fadeInFrom, element); + } + + @Override + protected Class getElementClass() { + return MinecartElement.class; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java index bad0f79b9..bb184144e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java @@ -23,6 +23,7 @@ public abstract class FadeIntoSceneInstruction e protected void firstTick(PonderScene scene) { super.firstTick(scene); scene.addElement(element); + element.setVisible(true); element.setFade(0); element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); if (elementLink != null) @@ -32,10 +33,13 @@ public abstract class FadeIntoSceneInstruction e @Override public void tick(PonderScene scene) { super.tick(scene); - float fade = (remainingTicks / (float) totalTicks); + float fade = totalTicks == 0 ? 1 : (remainingTicks / (float) totalTicks); element.setFade(1 - fade * fade); - if (remainingTicks == 0) + if (remainingTicks == 0) { + if (totalTicks == 0) + element.setFade(1); element.setFade(1); + } } public ElementLink createLink(PonderScene scene) { diff --git a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java index 6c2eb5e87..66cefb99d 100644 --- a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.renderState; +import java.util.Objects; +import java.util.Optional; import java.util.SortedMap; import com.mojang.blaze3d.systems.RenderSystem; @@ -13,9 +15,11 @@ import net.minecraft.client.renderer.RegionRenderCacheBuilder; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; public class SuperRenderTypeBuffer implements IRenderTypeBuffer { + public static BlockPos vertexSortingOrigin = BlockPos.ZERO; static SuperRenderTypeBuffer instance; public static SuperRenderTypeBuffer getInstance() { @@ -65,6 +69,7 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { // Visible clones from net.minecraft.client.renderer.RenderTypeBuffers static final RegionRenderCacheBuilder blockBuilders = new RegionRenderCacheBuilder(); + static final SortedMap createEntityBuilders() { return Util.make(new Object2ObjectLinkedOpenHashMap<>(), (map) -> { map.put(Atlases.getEntitySolid(), blockBuilders.get(RenderType.getSolid())); @@ -86,7 +91,6 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { }); }); } - private static void assign(Object2ObjectLinkedOpenHashMap map, RenderType type) { map.put(type, new BufferBuilder(type.getExpectedBufferSize())); @@ -96,6 +100,20 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { super(new BufferBuilder(256), createEntityBuilders()); } + public void draw(RenderType p_228462_1_) { + BlockPos v = vertexSortingOrigin; + BufferBuilder bufferbuilder = layerBuffers.getOrDefault(p_228462_1_, this.fallbackBuffer); + boolean flag = Objects.equals(this.currentLayer, p_228462_1_.asOptional()); + if (flag || bufferbuilder != this.fallbackBuffer) { + if (this.activeConsumers.remove(bufferbuilder)) { + p_228462_1_.draw(bufferbuilder, v.getX(), v.getY(), v.getZ()); + if (flag) { + this.currentLayer = Optional.empty(); + } + } + } + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index 8ebc71b26..e9610c6fe 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -109,4 +109,18 @@ public class MatrixStacker { return this; } + public MatrixStacker push() { + ms.push(); + return this; + } + + public MatrixStacker pop() { + ms.pop(); + return this; + } + + public MatrixStack unwrap() { + return ms; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index 7610ea984..611bbe2d0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -60,7 +60,8 @@ public class VecHelper { } public static boolean isVecPointingTowards(Vec3d vec, Direction direction) { - return new Vec3d(direction.getDirectionVec()).distanceTo(vec.normalize()) < .75; + return new Vec3d(direction.getDirectionVec()).dotProduct(vec.normalize()) > 0; + //return new Vec3d(direction.getDirectionVec()).distanceTo(vec.normalize()) < .75; } public static Vec3d getCenterOf(Vec3i pos) { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_holding.json b/src/main/resources/assets/create/models/block/deployer/hand_holding.json index 9a585fb63..0548e608e 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_holding.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_holding.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,15 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 16], + "to": [10, 10, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 5, 4], "rotation": 180, "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 5, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 5, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [3, 0, 5, 4], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json index 09d55a11b..b0b91369a 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -51,15 +50,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 18], + "to": [10, 9.95, 18], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "west": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "up": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "down": {"uv": [4, 8, 8, 12], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_punching.json b/src/main/resources/assets/create/models/block/deployer/hand_punching.json index e60304921..2cde3a6ae 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_punching.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_punching.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,14 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 17], + "to": [10.05, 9.95, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [4, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 3, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 6, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 6, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [4, 8, 7, 12], "rotation": 270, "texture": "#mechanical_press_head"} } }, { @@ -88,28 +88,28 @@ } }, { - "from": [9, 8, 16], + "from": [9, 8, 15], "to": [11, 10, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { "north": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, - "east": {"uv": [0, 3, 2, 4], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 8, 2, 10], "rotation": 180, "texture": "#18"}, "west": {"uv": [0, 0, 1, 2], "rotation": 180, "texture": "#18"}, - "up": {"uv": [0, 0, 1, 2], "rotation": 90, "texture": "#18"}, + "up": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#18"}, "down": {"uv": [0, 0, 1, 2], "rotation": 270, "texture": "#18"} } }, { "from": [5, 7, 15], - "to": [9, 10, 17], + "to": [10, 11, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { - "north": {"uv": [0, 3, 4, 6], "texture": "#18"}, - "east": {"uv": [1, 2, 3, 5], "texture": "#18"}, + "north": {"uv": [6, 1, 10, 6], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 6, 3, 8], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#18"}, - "west": {"uv": [0, 2, 2, 5], "texture": "#18"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#18"}, + "west": {"uv": [0, 2, 2, 6], "texture": "#18"}, + "up": {"uv": [0, 0, 2, 5], "rotation": 90, "texture": "#18"}, "down": {"uv": [1, 4, 3, 8], "rotation": 270, "texture": "#18"} } } diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index cc31d18ed..31cdd6799 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -12,6 +12,7 @@ attribute float aOffset; attribute vec3 aAxis; attribute vec3 aInstanceRot; attribute vec3 aRotationCenter; +attribute float aSpeed; varying float Diffuse; @@ -57,11 +58,10 @@ mat4 rotation(vec3 rot) { } mat4 kineticRotation() { - const float speed = -20.; - float degrees = aOffset + uTime * speed * -3./10.; + float degrees = aOffset + uTime * aSpeed / 20.; float angle = fract(degrees / 360.) * PI * 2.; - return rotate(normalize(aAxis), angle); + return rotate(normalize(aAxis), -angle); } void main() { diff --git a/src/main/resources/ponder/cart_assembler/anchor.nbt b/src/main/resources/ponder/cart_assembler/anchor.nbt new file mode 100644 index 000000000..de8bc0bd1 Binary files /dev/null and b/src/main/resources/ponder/cart_assembler/anchor.nbt differ diff --git a/src/main/resources/ponder/cart_assembler/dual.nbt b/src/main/resources/ponder/cart_assembler/dual.nbt new file mode 100644 index 000000000..b7110b581 Binary files /dev/null and b/src/main/resources/ponder/cart_assembler/dual.nbt differ diff --git a/src/main/resources/ponder/cart_assembler/modes.nbt b/src/main/resources/ponder/cart_assembler/modes.nbt new file mode 100644 index 000000000..a287d78be Binary files /dev/null and b/src/main/resources/ponder/cart_assembler/modes.nbt differ diff --git a/src/main/resources/ponder/cart_assembler/rails.nbt b/src/main/resources/ponder/cart_assembler/rails.nbt new file mode 100644 index 000000000..783075672 Binary files /dev/null and b/src/main/resources/ponder/cart_assembler/rails.nbt differ diff --git a/src/main/resources/ponder/deployer/contraption.nbt b/src/main/resources/ponder/deployer/contraption.nbt new file mode 100644 index 000000000..e92a1a98b Binary files /dev/null and b/src/main/resources/ponder/deployer/contraption.nbt differ diff --git a/src/main/resources/ponder/deployer/filter.nbt b/src/main/resources/ponder/deployer/filter.nbt new file mode 100644 index 000000000..78fc6138e Binary files /dev/null and b/src/main/resources/ponder/deployer/filter.nbt differ diff --git a/src/main/resources/ponder/deployer/modes.nbt b/src/main/resources/ponder/deployer/modes.nbt new file mode 100644 index 000000000..da15f4de6 Binary files /dev/null and b/src/main/resources/ponder/deployer/modes.nbt differ diff --git a/src/main/resources/ponder/deployer/redstone.nbt b/src/main/resources/ponder/deployer/redstone.nbt new file mode 100644 index 000000000..ea260becc Binary files /dev/null and b/src/main/resources/ponder/deployer/redstone.nbt differ diff --git a/src/main/resources/ponder/furnace_engine.nbt b/src/main/resources/ponder/furnace_engine.nbt new file mode 100644 index 000000000..fe916ecc7 Binary files /dev/null and b/src/main/resources/ponder/furnace_engine.nbt differ diff --git a/src/main/resources/ponder/harvester.nbt b/src/main/resources/ponder/harvester.nbt new file mode 100644 index 000000000..44b584700 Binary files /dev/null and b/src/main/resources/ponder/harvester.nbt differ diff --git a/src/main/resources/ponder/plough.nbt b/src/main/resources/ponder/plough.nbt new file mode 100644 index 000000000..24f190e64 Binary files /dev/null and b/src/main/resources/ponder/plough.nbt differ diff --git a/src/main/resources/ponder/sequenced_gearshift.nbt b/src/main/resources/ponder/sequenced_gearshift.nbt new file mode 100644 index 000000000..3d91ad485 Binary files /dev/null and b/src/main/resources/ponder/sequenced_gearshift.nbt differ diff --git a/src/main/resources/ponder/speed_controller.nbt b/src/main/resources/ponder/speed_controller.nbt new file mode 100644 index 000000000..cd64ee59b Binary files /dev/null and b/src/main/resources/ponder/speed_controller.nbt differ