Merge branch 'mc1.15/dev' of https://github.com/Creators-of-Create/Create into mc1.15/dev

This commit is contained in:
Snownee 2021-03-18 18:49:43 +08:00
commit 3b36526443
79 changed files with 3771 additions and 208 deletions

View file

@ -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

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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<DeployerTileEntity> DEPLOYER = Create.registrate()
.tileEntity("deployer", DeployerTileEntity::new)
.instance(() -> ShaftInstance::new)
.instance(() -> DeployerInstance::new)
.validBlocks(AllBlocks.DEPLOYER)
.renderer(() -> DeployerRenderer::new)
.register();

View file

@ -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;

View file

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

View file

@ -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<ContraptionActorData> drillHead;
private Direction facing;
public DrillActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context);
RenderMaterial<?, InstancedModel<ContraptionActorData>> 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;
}
}

View file

@ -22,23 +22,6 @@ public class DrillInstance extends SingleRotatingInstance {
super(modelManager, tile);
}
public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) {
RenderMaterial<?, InstancedModel<ContraptionActorData>> renderMaterial = contraption.getActorMaterial();
BlockState state = context.state;
InstancedModel<ContraptionActorData> 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<RotatingData> getModel() {
return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState());

View file

@ -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

View file

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

View file

@ -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<ContraptionActorData> harvester;
private Direction facing;
public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context);
RenderMaterial<?, InstancedModel<ContraptionActorData>> 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));
}
}

View file

@ -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

View file

@ -43,24 +43,6 @@ public class HarvesterRenderer extends SafeTileEntityRenderer<HarvesterTileEntit
.renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped()));
}
public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) {
RenderMaterial<?, InstancedModel<ContraptionActorData>> renderMaterial = contraption.getActorMaterial();
BlockState state = context.state;
InstancedModel<ContraptionActorData> 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<HarvesterTileEntit
.rotate(Direction.WEST, AngleHelper.rad(angle))
.translate(-rotOffset.x, -rotOffset.y, -rotOffset.z);
}
public static void transformHead(MatrixStack ms, float angle) {}
}

View file

@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FarmlandBlock;
import net.minecraft.block.FlowingFluidBlock;
import net.minecraft.item.ItemStack;
@ -22,6 +23,9 @@ import net.minecraft.util.math.RayTraceResult.Type;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraft.world.storage.loot.LootContext;
import net.minecraft.world.storage.loot.LootParameter;
import net.minecraft.world.storage.loot.LootParameters;
public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour {
@ -75,6 +79,20 @@ public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour {
.getBlock() instanceof FarmlandBlock);
}
@Override
protected void onBlockBroken(MovementContext context, BlockPos pos, BlockState brokenState) {
super.onBlockBroken(context, pos, brokenState);
if (brokenState.getBlock() == Blocks.SNOW && context.world instanceof ServerWorld) {
ServerWorld world = (ServerWorld) context.world;
brokenState.getDrops(new LootContext.Builder(world).withParameter(LootParameters.BLOCK_STATE, brokenState)
.withParameter(LootParameters.POSITION, pos)
.withParameter(LootParameters.THIS_ENTITY, getPlayer(context))
.withParameter(LootParameters.TOOL, new ItemStack(Items.IRON_SHOVEL)))
.forEach(s -> dropItem(context, s));
}
}
@Override
public void stopMoving(MovementContext context) {
super.stopMoving(context);

View file

@ -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<ModelData> pole;
InstanceKey<ModelData> hand;
InstanceKey<RotatingData> shaft;
public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context);
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> 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);
}
}

View file

@ -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<ModelData> pole;
AllBlockPartials currentHand;
InstanceKey<ModelData> 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<ModelData> pole, InstanceKey<ModelData> 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());
}
}

View file

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

View file

@ -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<DeployerTileEntity>
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<DeployerTileEntity>
}
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<DeployerTileEntity>
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<DeployerTileEntity>
.renderInto(ms, builder);
}
static AllBlockPartials getHandPose(DeployerTileEntity.Mode mode) {
return mode == DeployerTileEntity.Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING;
}
}

View file

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

View file

@ -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;

View file

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

View file

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

View file

@ -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<ContraptionProgram> {
protected ArrayList<ActorInstance> 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<Contraptio
materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(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<Template.BlockInfo, MovementContext> 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<?, InstancedModel<ContraptionActorData>> getActorMaterial() {
return getMaterial(KineticRenderMaterials.ACTORS);
}
@Override
public BlockPos getOriginCoordinate() {
return BlockPos.ZERO;

View file

@ -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<?, InstancedModel<ContraptionActorData>> 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<MutablePair<Template.BlockInfo, MovementContext>> actors = contraption.getActors();
for (MutablePair<Template.BlockInfo, MovementContext> 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) {

View file

@ -41,11 +41,12 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedContro
BlockPos pos = tileEntityIn.getPos();
World world = tileEntityIn.getWorld();
BlockState blockState = tileEntityIn.getBlockState();
boolean alongX = blockState.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X;
SuperByteBuffer bracket = AllBlockPartials.SPEED_CONTROLLER_BRACKET.renderOn(blockState);
bracket.translate(0, 1, 0);
bracket.rotateCentered(Direction.UP,
(float) (blockState.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Math.PI : 0));
(float) (alongX ? Math.PI : Math.PI / 2));
bracket.light(WorldRenderer.getLightmapCoordinates(world, pos.up()));
bracket.renderInto(ms, builder);
}

View file

@ -122,6 +122,11 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
.isHorizontal();
}
@Override
public boolean shouldRenderAsTE() {
return true;
}
private class ControllerValueBoxTransform extends ValueBoxTransform.Sided {
@Override

View file

@ -150,6 +150,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity {
@Override
public float getRotationSpeedModifier(Direction face) {
if (isVirtual())
return 1;
return (!hasSource() || face == getSourceFacing()) ? 1 : getModifier();
}

View file

@ -1,19 +1,23 @@
package com.simibubi.create.content.logistics.block.funnel;
import java.util.List;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.logistics.item.filter.FilterItem;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemHelper;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemHandlerHelper;
import java.util.List;
public class FunnelMovementBehaviour extends MovementBehaviour {
private final boolean hasFilter;
@ -32,14 +36,67 @@ public class FunnelMovementBehaviour extends MovementBehaviour {
@Override
public Vec3d getActiveAreaOffset(MovementContext context) {
return new Vec3d(FunnelBlock.getFunnelFacing(context.state)
.getDirectionVec()).scale(.65);
Direction facing = FunnelBlock.getFunnelFacing(context.state);
Vec3d vec = new Vec3d(facing.getDirectionVec());
if (facing != Direction.UP)
return vec.scale(context.state.get(FunnelBlock.EXTRACTING) ? .15 : .65);
return vec.scale(.65);
}
@Override
public void visitNewPosition(MovementContext context, BlockPos pos) {
super.visitNewPosition(context, pos);
if (context.state.get(FunnelBlock.EXTRACTING))
extract(context, pos);
else
succ(context, pos);
}
private void extract(MovementContext context, BlockPos pos) {
World world = context.world;
Vec3d entityPos = context.position;
if (context.state.get(FunnelBlock.FACING) != Direction.DOWN)
entityPos = entityPos.add(0, -.5f, 0);
if (!world.getBlockState(pos).getCollisionShape(world, pos).isEmpty())
return;//only drop items if the target block is a empty space
if (!world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(new BlockPos(entityPos))).isEmpty())
return;//don't drop items if there already are any in the target block space
ItemStack filter = getFilter(context);
int filterAmount = context.tileData.getInt("FilterAmount");
if (filterAmount <= 0)
filterAmount = hasFilter ? AllConfigs.SERVER.logistics.defaultExtractionLimit.get() : 1;
ItemStack extract = ItemHelper.extract(
context.contraption.inventory,
s -> 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<ItemEntity> 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) {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 <T extends AnimatedSceneElement> void hideElement(ElementLink<T> 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<MinecartElement> createCart(Vec3d location, float angle, MinecartConstructor type) {
ElementLink<MinecartElement> 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<MinecartElement> link, float yRotation, int duration) {
addInstruction(AnimateMinecartInstruction.rotate(link, yRotation, duration));
}
public void moveCart(ElementLink<MinecartElement> 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<WorldSectionElement> 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<WorldSectionElement> 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));
}

View file

@ -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<MinecartElement> 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<WorldSectionElement> plank =
scene.world.makeSectionIndependent(util.select.position(assemblerPos.up()));
ElementLink<WorldSectionElement> 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<WorldSectionElement> 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<EntityElement> 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<WorldSectionElement> 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<MinecartElement> 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<WorldSectionElement> 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<MinecartElement> cart =
scene.special.createCart(util.vector.topOf(assembler1.down()), 0, MinecartEntity::new);
ElementLink<MinecartElement> 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<WorldSectionElement> 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<WorldSectionElement> 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<MinecartElement> cart = scene.special.createCart(util.vector.topOf(assembler.east(2)
.down()), 0, MinecartEntity::new);
ElementLink<WorldSectionElement> anchor =
scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN);
ElementLink<WorldSectionElement> 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);
}
}

View file

@ -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<DeployerTileEntity> 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<EntityElement> 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<EntityElement> 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<WorldSectionElement> 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<WorldSectionElement> 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);
}
}
}

View file

@ -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;
@ -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<WorldSectionElement> 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<WorldSectionElement> 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<WorldSectionElement> 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<WorldSectionElement> rsc =
scene.world.showIndependentSection(util.select.position(0, 1, 1), Direction.DOWN);
scene.world.moveSection(rsc, util.vector.of(1, 0, 0), 0);
ElementLink<WorldSectionElement> 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);
}
}

View file

@ -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))

View file

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

View file

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

View file

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

View file

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

View file

@ -73,7 +73,8 @@ public class TextWindowElement extends AnimatedOverlayElement {
}
public Builder attachKeyFrame() {
scene.builder().addLazyKeyframe();
scene.builder()
.addLazyKeyframe();
return this;
}
@ -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();
}

View file

@ -47,6 +47,7 @@ public class AnimateElementInstruction<T extends PonderSceneElement> extends Tic
if (element == null)
return;
if (remainingTicks == 0) {
setter.accept(element, target);
setter.accept(element, target);
return;
}

View file

@ -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<MinecartElement> {
public static AnimateMinecartInstruction rotate(ElementLink<MinecartElement> 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<MinecartElement> link, Vec3d offset, int ticks) {
return new AnimateMinecartInstruction(link, offset, ticks, (wse, v) -> wse.setPositionOffset(v, ticks == 0),
MinecartElement::getPositionOffset);
}
protected AnimateMinecartInstruction(ElementLink<MinecartElement> link, Vec3d totalDelta, int ticks,
BiConsumer<MinecartElement, Vec3d> setter, Function<MinecartElement, Vec3d> getter) {
super(link, totalDelta, ticks, setter, getter);
}
}

View file

@ -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<PonderWorld, Float> setter, Function<PonderWorld, Float> 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 <T> Optional<T> castIfPresent(PonderWorld world, BlockPos pos, Class<T> teType) {

View file

@ -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<MinecartElement> {
public CreateMinecartInstruction(int fadeInTicks, Direction fadeInFrom, MinecartElement element) {
super(fadeInTicks, fadeInFrom, element);
}
@Override
protected Class<MinecartElement> getElementClass() {
return MinecartElement.class;
}
}

View file

@ -23,6 +23,7 @@ public abstract class FadeIntoSceneInstruction<T extends AnimatedSceneElement> 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<T extends AnimatedSceneElement> 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<T> createLink(PonderScene scene) {

View file

@ -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<RenderType, BufferBuilder> createEntityBuilders() {
return Util.make(new Object2ObjectLinkedOpenHashMap<>(), (map) -> {
map.put(Atlases.getEntitySolid(), blockBuilders.get(RenderType.getSolid()));
@ -87,7 +92,6 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer {
});
}
private static void assign(Object2ObjectLinkedOpenHashMap<RenderType, BufferBuilder> 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();
}
}
}
}
}
}

View file

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

View file

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

View file

@ -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"}
}
},
{

View file

@ -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"}
}
},
{

View file

@ -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"}
}
}

View file

@ -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() {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.