From a897b5e78bff19fd21aa923251765cdbcf19f4fb Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Mar 2021 21:04:42 +0100 Subject: [PATCH] Scene machine - Fix funnels not rendering filter slot items - Ponder scenes for the Deployer, Harvester and Plough - Fixed uvs on Deployer model - Ploughs can now harvest snow layers --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 45 +- .../assets/create/lang/unfinished/de_de.json | 47 +- .../assets/create/lang/unfinished/es_es.json | 47 +- .../assets/create/lang/unfinished/es_mx.json | 47 +- .../assets/create/lang/unfinished/fr_fr.json | 47 +- .../assets/create/lang/unfinished/it_it.json | 47 +- .../assets/create/lang/unfinished/ja_jp.json | 47 +- .../assets/create/lang/unfinished/ko_kr.json | 47 +- .../assets/create/lang/unfinished/nl_nl.json | 47 +- .../assets/create/lang/unfinished/pt_br.json | 47 +- .../assets/create/lang/unfinished/ru_ru.json | 47 +- .../assets/create/lang/unfinished/zh_cn.json | 47 +- .../assets/create/lang/unfinished/zh_tw.json | 47 +- .../data/create/advancements/aesthetics.json | 4 +- .../actors/PloughMovementBehaviour.java | 18 + .../components/deployer/DeployerRenderer.java | 11 +- .../deployer/DeployerTileEntity.java | 35 +- .../block/funnel/FunnelTileEntity.java | 11 +- .../foundation/ponder/PonderRegistry.java | 6 +- .../create/foundation/ponder/PonderWorld.java | 6 +- .../foundation/ponder/SceneBuilder.java | 6 +- .../ponder/content/DeployerScenes.java | 460 ++++++++++++++++++ .../ponder/content/MechanicalSawScenes.java | 2 + .../ponder/content/MovementActorScenes.java | 317 ++++++++++++ .../ponder/content/PonderIndex.java | 11 +- .../ponder/elements/TextWindowElement.java | 17 +- .../AnimateTileEntityInstruction.java | 15 +- .../models/block/deployer/hand_holding.json | 11 +- .../models/block/deployer/hand_pointing.json | 9 +- .../models/block/deployer/hand_punching.json | 28 +- .../resources/ponder/deployer/contraption.nbt | Bin 0 -> 870 bytes src/main/resources/ponder/deployer/filter.nbt | Bin 0 -> 785 bytes src/main/resources/ponder/deployer/modes.nbt | Bin 0 -> 508 bytes .../resources/ponder/deployer/redstone.nbt | Bin 0 -> 726 bytes src/main/resources/ponder/harvester.nbt | Bin 0 -> 624 bytes src/main/resources/ponder/plough.nbt | Bin 0 -> 974 bytes 37 files changed, 1493 insertions(+), 111 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java create mode 100644 src/main/resources/ponder/deployer/contraption.nbt create mode 100644 src/main/resources/ponder/deployer/filter.nbt create mode 100644 src/main/resources/ponder/deployer/modes.nbt create mode 100644 src/main/resources/ponder/deployer/redstone.nbt create mode 100644 src/main/resources/ponder/harvester.nbt create mode 100644 src/main/resources/ponder/plough.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1ec53cafb..24769c6d2 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -f7bdf2fb1af4cae8bca1735861d603cce0870985 assets/create/lang/en_us.json -f83d2acecd5ce6ebe8dfddffde3c5c3a68abd492 assets/create/lang/unfinished/de_de.json -35e50f9ba61af0ef900154213b0b25d1dc5469d3 assets/create/lang/unfinished/es_es.json -98c26496201d8f12be5f6fc0ddaf919d9098f825 assets/create/lang/unfinished/es_mx.json -161ac9821b2445c96c6d594885c2d32cd784e8c5 assets/create/lang/unfinished/fr_fr.json -0c1baeb251ff32329a8d34a7200101de2cb724c4 assets/create/lang/unfinished/it_it.json -b0ccadbcc765e7ddee1089b3ca65414f5aa1ad95 assets/create/lang/unfinished/ja_jp.json -9551b6b6df919ff7e2b7e14361e8061b65cd4857 assets/create/lang/unfinished/ko_kr.json -552b3ef71a2898d7e263035ade5b47fb0bcfec23 assets/create/lang/unfinished/nl_nl.json -1661f76a0ba088209fcd837a8a1676dbed186368 assets/create/lang/unfinished/pt_br.json -621af99986c9e334d224f9a356c25d7468a1ef47 assets/create/lang/unfinished/ru_ru.json -6340ad62aedc1fec27abb6b490c36b1fd1317214 assets/create/lang/unfinished/zh_cn.json -56a1fedad3d453a36c456085c836fcfbf9740b1d assets/create/lang/unfinished/zh_tw.json +14e0e7784c59a76deddf3bfc32e334ce043396fe assets/create/lang/en_us.json +9d0c4eb5b8fcf787b1bbdd35dcb2efd37b7b9f9c assets/create/lang/unfinished/de_de.json +7e78635390f2802b325aec510ebef35345e2c9a4 assets/create/lang/unfinished/es_es.json +f87b6f876dbb50c37ebbd67d9f636f70c5e4e7f2 assets/create/lang/unfinished/es_mx.json +866086d9a9fe1f4c39208bf592b75145dd67bb47 assets/create/lang/unfinished/fr_fr.json +2f32a7fbbfaa1d78c6f9975c4aa121def52280b7 assets/create/lang/unfinished/it_it.json +2041ea4e1e516f7953be44b06092b144df0359b3 assets/create/lang/unfinished/ja_jp.json +e5057798e54fe5485a36f71b7298c6b2c73cd1b4 assets/create/lang/unfinished/ko_kr.json +e4bdb059ad70595c66c84ebfc3cac6a3929e97c4 assets/create/lang/unfinished/nl_nl.json +849db8c87d521cdf0ce8dc21652f8d95eea47194 assets/create/lang/unfinished/pt_br.json +cdafda2402e1c3259eba15fdd55a446117fece83 assets/create/lang/unfinished/ru_ru.json +8063b79a864f2a1a56c30aabe6df4bd616c938c2 assets/create/lang/unfinished/zh_cn.json +bd9961903c4e125cd3029dad62a4a7fd690149aa 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 @@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f9fdd6089..6cfdb91aa 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1947,6 +1947,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", @@ -2059,6 +2090,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 +2103,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 +2175,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index d3f057fa5..892ea386e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1302", + "_": "Missing Localizations: 1337", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 0b0652617..bf6a5fb5d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 333", + "_": "Missing Localizations: 368", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index e232209e0..53e129369 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1232", + "_": "Missing Localizations: 1267", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 061ec4e47..2218aae58 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1014", + "_": "Missing Localizations: 1049", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 871dae9bd..369acaf8d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 350", + "_": "Missing Localizations: 385", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index e08d19db8..5db9138b5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 357", + "_": "Missing Localizations: 392", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 0de6cbdc1..9471b7f33 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 403", + "_": "Missing Localizations: 438", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 6f11b4c0e..a4da4b57e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1501", + "_": "Missing Localizations: 1536", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4316c6e3e..40031e472 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1567", + "_": "Missing Localizations: 1602", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index d891d5922..e30cc25d8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 353", + "_": "Missing Localizations: 388", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index d806010de..fcfec2f15 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 351", + "_": "Missing Localizations: 386", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 691488640..1b8b2c0d9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 356", + "_": "Missing Localizations: 391", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,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", @@ -2060,6 +2091,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 +2104,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 +2176,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", diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java index 6f5216b79..527dc6f4b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java @@ -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); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 267763ce0..17aca279a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; -import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -123,15 +122,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer } protected Vec3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { - float progress = 0; - if (te.state == State.EXPANDING) - progress = 1 - (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - if (te.state == State.RETRACTING) - progress = (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - - float handLength = te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 - : te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; - float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (te.reach + handLength), 21 / 16f); + float distance = te.getHandOffset(partialTicks); Vec3d offset = new Vec3d(blockState.get(FACING) .getDirectionVec()).scale(distance); return offset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 4af470f72..531411595 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; @@ -53,6 +54,8 @@ public class DeployerTileEntity extends KineticTileEntity { private LazyOptional invHandler; private ListNBT deferredInventoryList; + private LerpedFloat animatedOffset; + enum State { WAITING, EXPANDING, RETRACTING, DUMPING; } @@ -67,6 +70,8 @@ public class DeployerTileEntity extends KineticTileEntity { mode = Mode.USE; heldItem = ItemStack.EMPTY; redstoneLocked = false; + animatedOffset = LerpedFloat.linear() + .startWithValue(0); } @Override @@ -106,7 +111,7 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public void tick() { super.tick(); - + if (getSpeed() == 0) return; if (!world.isRemote && player != null && player.blockBreakingProgress != null) { @@ -365,11 +370,11 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (isItemHandlerCap(cap) && invHandler != null) + if (isItemHandlerCap(cap) && invHandler != null) return invHandler.cast(); return super.getCapability(cap, side); } - + @Override public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { if (super.addToTooltip(tooltip, isPlayerSneaking)) @@ -386,4 +391,28 @@ public class DeployerTileEntity extends KineticTileEntity { public boolean shouldRenderAsTE() { return true; } + + public float getHandOffset(float partialTicks) { + if (isVirtual()) + return animatedOffset.getValue(partialTicks); + + float progress = 0; + int timerSpeed = getTimerSpeed(); + AllBlockPartials handPose = getHandPose(); + + if (state == State.EXPANDING) + progress = 1 - (timer - partialTicks * timerSpeed) / 1000f; + if (state == State.RETRACTING) + progress = (timer - partialTicks * timerSpeed) / 1000f; + float handLength = handPose == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 + : handPose == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; + float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (reach + handLength), 21 / 16f); + + return distance; + } + + public void setAnimatedOffset(float offset) { + animatedOffset.setValue(offset); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index 63cf669d5..b32718469 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -4,7 +4,6 @@ import java.lang.ref.WeakReference; import java.util.List; import com.simibubi.create.AllBlocks; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; @@ -13,7 +12,6 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; -import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.item.TooltipHelper; @@ -42,7 +40,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -332,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 @@ -386,4 +383,10 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn TooltipHelper.addHint(tooltip, "hint.horizontal_funnel"); return true; } + + @Override + public boolean shouldRenderAsTE() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 6c7bf9cbb..9c2d866f9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -109,8 +109,10 @@ public class PonderRegistry { String filepath = "ponder/" + path + ".nbt"; InputStream resourceAsStream = Create.class.getClassLoader() .getResourceAsStream(filepath); - if (resourceAsStream == null) - throw new IllegalStateException("Could not find ponder schematic: " + filepath); + if (resourceAsStream == null) { + Create.logger.error("Ponder schematic missing: " + path); + return t; + } try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java index 1edc3b83d..bed230311 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -12,6 +12,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.schematics.SchematicWorld; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -106,6 +107,7 @@ public class PonderWorld extends SchematicWorld { if (originalBlocks.containsKey(p)) blocks.put(p, originalBlocks.get(p)); }); + scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); } public void pushFakeLight(int light) { @@ -280,7 +282,7 @@ public class PonderWorld extends SchematicWorld { } } } - + @Override protected BlockState processBlockStateForPrinting(BlockState state) { return state; @@ -295,5 +297,5 @@ public class PonderWorld extends SchematicWorld { public boolean isBlockPresent(BlockPos pos) { return true; // fix particle lighting } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index 811aa75a9..84fc8560a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -177,7 +177,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); } @@ -513,6 +513,10 @@ public class SceneBuilder { public void movePulley(BlockPos pos, float distance, int duration) { addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); } + + public void moveDeployer(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); + } public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java new file mode 100644 index 000000000..720bd870d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java @@ -0,0 +1,460 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.elements.EntityElement; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.SheepEntity; +import net.minecraft.item.DyeColor; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class DeployerScenes { + + public static void filter(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer", "Using the Deployer"); + scene.configureBasePlate(0, 0, 5); + + BlockPos potPosition = util.grid.at(1, 1, 2); + BlockPos deployerPos = util.grid.at(3, 1, 2); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.setBlock(potPosition, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(util.select.layer(0) + .add(util.select.position(1, 1, 2)), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + scene.world.showSection(deployerSelection, Direction.SOUTH); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.topOf(deployerPos)) + .text("Given Rotational Force, a Deployer can imitate player interactions"); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(44); + + scene.overlay.showSelectionWithText(util.select.position(deployerPos.west(2)), 60) + .text("It will always interact with the position 2 blocks in front of itself") + .attachKeyFrame() + .placeNearTarget() + .colored(PonderPalette.GREEN) + .attachKeyFrame(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.DOWN); + scene.idle(24); + + scene.overlay.showText(50) + .pointAt(util.vector.topOf(deployerPos.west())) + .text("Blocks directly in front will not obstruct it") + .placeNearTarget(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(34); + scene.world.hideSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.UP); + scene.idle(20); + + String[] actions = + new String[] { "Place Blocks,", "Use Items,", "Activate Blocks,", "Harvest blocks", "and Attack Mobs" }; + + scene.overlay.showText(80) + .attachKeyFrame() + .independent(40) + .placeNearTarget() + .text("Deployers can:"); + + int y = 60; + for (String s : actions) { + scene.idle(15); + scene.overlay.showText(50) + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .independent(y) + .text(s); + y += 16; + } + scene.idle(50); + + ItemStack pot = new ItemStack(Items.FLOWER_POT); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.DOWN).rightClick() + .withItem(pot), 40); + scene.idle(7); + Class teType = DeployerTileEntity.class; + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", pot.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(frontVec) + .text("Right-click the front to give it an Item to use"); + scene.idle(40); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.restoreBlocks(util.select.position(potPosition)); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + + scene.world.showSection(util.select.position(deployerPos.up()), Direction.DOWN); + + ItemStack tulip = new ItemStack(Items.RED_TULIP); + Vec3d entitySpawn = util.vector.topOf(deployerPos.up(3)); + + ElementLink entity1 = + scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), tulip); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", tulip.serializeNBT())); + scene.idle(10); + scene.overlay.showText(40) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Items can also be inserted automatically"); + scene.idle(30); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.setBlock(potPosition, Blocks.POTTED_RED_TULIP.getDefaultState(), false); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(25); + scene.world.hideSection(util.select.position(potPosition), Direction.UP); + scene.world.hideSection(util.select.position(deployerPos.up()), Direction.EAST); + scene.idle(20); + + Vec3d filterSlot = frontVec.add(0.375, 0.25, 0); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("Deployers carry a filter slot"); + scene.idle(50); + + ItemStack shears = new ItemStack(Items.SHEARS); + + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).rightClick() + .withItem(shears), 40); + scene.idle(7); + scene.world.setFilterData(deployerSelection, teType, shears); + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(filterSlot) + .text("When a filter is set, it activates only while holding a matching item"); + scene.idle(70); + + ElementLink sheep = scene.world.createEntity(w -> { + SheepEntity entity = EntityType.SHEEP.create(w); + entity.setFleeceColor(DyeColor.PINK); + Vec3d p = util.vector.topOf(util.grid.at(1, 0, 2)); + entity.setPosition(p.x, p.y, p.z); + entity.prevPosX = p.x; + entity.prevPosY = p.y; + entity.prevPosZ = p.z; + entity.limbSwing = 0; + entity.prevRotationYaw = 210; + entity.rotationYaw = 210; + entity.prevRotationYawHead = 210; + entity.rotationYawHead = 210; + return entity; + }); + scene.idle(20); + scene.world.showSection(util.select.position(deployerPos.up()), Direction.WEST); + entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), shears); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", shears.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Only items matching the filter can now be inserted..."); + + scene.idle(70); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.modifyEntity(sheep, e -> ((SheepEntity) e).setSheared(true)); + scene.effects.emitParticles(util.vector.topOf(deployerPos.west(2)) + .add(0, -.25, 0), + Emitter.withinBlockSpace(new BlockParticleData(ParticleTypes.BLOCK, Blocks.PINK_WOOL.getDefaultState()), + util.vector.of(0, 0, 0)), + 25, 1); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.world.showSection(util.select.position(deployerPos.north()), Direction.SOUTH); + scene.idle(25); + + scene.overlay.showText(80) + .placeNearTarget() + .pointAt(util.vector.of(3.5, 1.25, 1.25)) + .text("...and only non-matching items will be extracted"); + scene.world.flapFunnel(deployerPos.north(), true); + scene.world.createItemEntity(util.vector.centerOf(deployerPos.north()) + .subtract(0, .45, 0), util.vector.of(0, 0, -0.1), new ItemStack(Items.PINK_WOOL)); + + scene.markAsFinished(); + for (int i = 0; i < 10; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(26); + } + } + + public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_modes", "Modes of the Deployer"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + BlockPos deployerPos = util.grid.at(3, 1, 2); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + Selection grassBlock = util.select.position(1, 1, 2); + + Selection deployerSelection = util.select.position(deployerPos); + scene.world.showSection(deployerSelection, Direction.DOWN); + scene.idle(10); + scene.world.showSection(grassBlock, Direction.DOWN); + scene.idle(10); + + ItemStack tool = new ItemStack(Items.GOLDEN_HOE); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(deployerPos), Pointing.DOWN).withItem(tool), + 30); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, + nbt -> nbt.put("HeldItem", tool.serializeNBT())); + scene.idle(45); + + scene.world.setKineticSpeed(util.select.position(2, 0, 5), 16); + scene.world.setKineticSpeed(util.select.layer(1), -32); + scene.world.moveDeployer(deployerPos, 1, 25); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("By default, a Deployer imitates a Right-click interaction"); + + scene.idle(26); + scene.world.replaceBlocks(grassBlock, Blocks.FARMLAND.getDefaultState(), false); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(46); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); + scene.idle(45); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("Using a Wrench, it can be set to imitate a Left-click instead"); + + BlockPos breakingPos = deployerPos.west(2); + for (int i = 0; i < 4; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.moveDeployer(deployerPos, -1, 25); + if (i == 3) + scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, 0, 0), + new ItemStack(Blocks.DIRT)); + scene.idle(26); + + if (i == 0) + scene.markAsFinished(); + } + } + + public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_redstone", "Controlling Deployers with Redstone"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 5, 3, 1, 3), Direction.DOWN); + + BlockPos deployerPos = util.grid.at(3, 1, 3); + Selection redstone = util.select.fromTo(3, 1, 1, 3, 1, 2); + BlockPos leverPos = util.grid.at(3, 1, 1); + + scene.world.toggleRedstonePower(redstone); + + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + scene.world.showSection(redstone, Direction.SOUTH); + scene.idle(31); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(10); + + scene.overlay.showText(60) + .colored(PonderPalette.RED) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("When powered by Redstone, Deployers will not activate"); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(10); + scene.world.moveDeployer(deployerPos, 1f, 30); + scene.idle(10); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(21); + + scene.overlay.showText(60) + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Before stopping, the Deployer will finish any started cycles"); + + scene.world.moveDeployer(deployerPos, -1f, 30); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(3); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.overlay.showText(100) + .colored(PonderPalette.GREEN) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + + } + + public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_contraption", "Using Deployers on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + Selection flowers = util.select.fromTo(4, 1, 1, 1, 1, 1); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 3); + BlockPos deployerPos = util.grid.at(4, 1, 3); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.showSection(util.select.layer(0) + .add(flowers), Direction.UP); + scene.idle(5); + + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 2, 8, 1, 2), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.world.showSection(kinetics, Direction.DOWN); + scene.idle(5); + + ElementLink contraption = + scene.world.showIndependentSection(deployerSelection, Direction.DOWN); + scene.idle(5); + scene.world.glueBlockOnto(util.grid.at(4, 2, 3), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(deployerPos, Direction.WEST)) + .text("Whenever Deployers are moved as part of an animated Contraption..."); + scene.idle(70); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.restoreBlocks(util.select.position(4 - x, 1, 1)); + scene.idle(18); + } + + scene.overlay.showSelectionWithText(flowers, 90) + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .text("They activate at each visited location, using items from inventories anywhere on the contraption"); + scene.idle(100); + + scene.world.hideSection(flowers, Direction.UP); + scene.idle(15); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(flowers, Direction.UP); + + Vec3d frontVec = util.vector.blockSurface(deployerPos.west(3), Direction.NORTH) + .add(0, 0, -.125); + Vec3d filterSlot = frontVec.add(0, 0.25, 0.375); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("The Filter slot can be used to specify which items to pull"); + scene.idle(70); + + ItemStack poppy = new ItemStack(Items.POPPY); + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(poppy), 30); + scene.idle(7); + scene.world.setFilterData(deployerSelection, DeployerTileEntity.class, poppy); + scene.idle(25); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(kinetics, -16); + scene.world.moveSection(pistonHead, util.vector.of(3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.setBlock(util.grid.at(1 + x, 1, 1), Blocks.POPPY.getDefaultState(), false); + scene.idle(18); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index fb6aa603f..aa8d10831 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -173,6 +173,7 @@ public class MechanicalSawScenes { public static void treeCutting(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) @@ -265,6 +266,7 @@ public class MechanicalSawScenes { public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); scene.configureBasePlate(1, 0, 6); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index 8c262ceca..20b35a35a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -1,19 +1,27 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FlappyPose; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.CropsBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -189,4 +197,313 @@ public class MovementActorScenes { scene.markAsFinished(); } + public static void harvester(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_harvester", "Using Mechanical Harvesters on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection crops = util.select.fromTo(4, 1, 2, 3, 1, 2) + .add(util.select.fromTo(3, 1, 1, 2, 1, 1) + .add(util.select.position(2, 1, 3)) + .add(util.select.position(1, 1, 2))); + + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos bearingPos = util.grid.at(4, 1, 4); + + scene.idle(5); + scene.world.showSection(crops, Direction.UP); + scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 2, 4, 2, 2, 5) + .add(util.select.fromTo(2, 1, 5, 0, 1, 5)), Direction.DOWN); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.idle(10); + + for (int i = 0; i < 3; i++) { + scene.world.showSectionAndMerge(util.select.position(i, 1, 4), Direction.SOUTH, contraption); + scene.idle(5); + } + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 4), Direction.SOUTH)) + .text("Whenever Harvesters are moved as part of an animated Contraption..."); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + BlockState harvested = Blocks.WHEAT.getDefaultState(); + ItemStack wheatItem = new ItemStack(Items.WHEAT); + + scene.idle(5); + BlockPos current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.2, 0.3, 0), wheatItem); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(1, 0, 2)) + .text("They will harvest and reset any mature crops on their way") + .placeNearTarget(); + + scene.idle(101); + scene.world.hideSection(crops, Direction.DOWN); + scene.idle(15); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(crops, Direction.UP); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + scene.idle(10); + + scene.world.cycleBlockProperty(util.grid.at(1, 1, 5), LinearChassisBlock.STICKY_TOP); + scene.world.glueBlockOnto(util.grid.at(1, 2, 5), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 5), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + scene.idle(5); + current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + + scene.idle(116); + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(1, 2, 5), Pointing.DOWN).withItem(wheatItem), 50); + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + } + + public static void plough(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_plough", "Using Mechanical Ploughs on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection garbage = util.select.fromTo(2, 1, 3, 1, 1, 2); + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 2); + Selection dynamic = util.select.fromTo(4, 0, 6, 5, 1, 6); + + scene.showBasePlate(); + ElementLink cogs = + scene.world.showIndependentSection(util.select.fromTo(4, 0, 6, 5, 1, 6), Direction.UP); + scene.idle(5); + scene.world.showSection(kinetics.substract(dynamic), Direction.DOWN); + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 1, 3, 4, 1, 2), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(3, 1, 3), Direction.EAST, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 1, 2), Direction.EAST, contraption); + scene.idle(20); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Whenever Ploughs are moved as part of an animated Contraption..."); + scene.idle(50); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + + Vec3d m = util.vector.of(-0.1, .2, 0); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 3), m, new ItemStack(Items.LEVER)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 2), m, new ItemStack(Items.TORCH)); + + scene.idle(30); + + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 3), m, new ItemStack(Items.RAIL)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 2), m, new ItemStack(Items.REDSTONE)); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.EAST)) + .text("...they will break blocks without a solid collision hitbox"); + scene.idle(50); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world.hideSection(garbage, Direction.UP); + scene.idle(40); + scene.world.setBlocks(garbage, Blocks.SNOW.getDefaultState(), false); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + ElementLink chest = + scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(15); + scene.effects.superGlue(util.grid.at(4, 2, 2), Direction.DOWN, true); + scene.idle(45); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.idle(30); + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.idle(15); + + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(2, 2, 2), Pointing.DOWN).withItem(new ItemStack(Items.SNOWBALL)), + 40); + scene.idle(40); + scene.world.hideIndependentSection(chest, Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.idle(40); + + Selection dirt = util.select.fromTo(2, 0, 3, 1, 0, 2); + scene.world.hideSection(dirt, Direction.DOWN); + scene.idle(15); + scene.world.setBlocks(dirt, Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.showSection(dirt, Direction.UP); + scene.overlay.showText(60) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Additionally, ploughs can create farmland"); + scene.idle(30); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.setBlocks(util.select.fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(30); + scene.world.setBlocks(util.select.fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + + scene.idle(50); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world.hideSection(kinetics.substract(dynamic), Direction.EAST); + scene.world.hideSection(dirt, Direction.DOWN); + scene.world.hideIndependentSection(pistonHead, Direction.EAST); + scene.world.moveSection(cogs, util.vector.of(-1, 0, 0), 15); + scene.idle(15); + scene.world.restoreBlocks(dirt); + scene.world.showSection(dirt, Direction.UP); + scene.world.showSection(util.select.fromTo(4, 1, 6, 4, 3, 4), Direction.NORTH); + scene.idle(15); + scene.world.showSectionAndMerge(util.select.fromTo(4, 3, 3, 4, 2, 3), Direction.DOWN, contraption); + scene.idle(15); + + BlockPos bearingPos = util.grid.at(4, 3, 4); + scene.addKeyframe(); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(util.select.position(5, 1, 6), -16); + scene.world.setKineticSpeed(util.select.position(4, 3, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 1, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 2, 5), 16); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world.rotateSection(contraption, 0, 0, 90, 20); + scene.world.rotateBearing(bearingPos, 90, 20); + + scene.idle(10); + ElementLink birb = scene.special.createBirb(util.vector.topOf(3, 0, 2) + .add(0, 0, 0.5), FlappyPose::new); + scene.idle(11); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.rotateSection(contraption, 0, 0, -135, 10); + scene.world.rotateBearing(bearingPos, -135, 10); + scene.idle(7); + scene.special.moveParrot(birb, util.vector.of(-20, 15, 0), 20); + scene.special.rotateParrot(birb, 0, 360, 0, 20); + scene.idle(3); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.idle(20); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.centerOf(util.grid.at(1, 3, 2))) + .text("...they can also launch entities without hurting them"); + scene.idle(30); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index d1c4b0a5d..e24c22914 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -148,6 +148,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 +217,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 +330,6 @@ public class PonderIndex { .add(AllBlocks.BRASS_FUNNEL) .add(AllBlocks.SEATS[0]) .add(AllBlocks.REDSTONE_CONTACT) - .add(AllBlocks.SAIL) .add(Blocks.BELL) .add(Blocks.DISPENSER) .add(Blocks.DROPPER); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java index 2423c420e..cb985822c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java @@ -24,9 +24,9 @@ public class TextWindowElement extends AnimatedOverlayElement { // from 0 to 200 int y; - + Vec3d vec; - + boolean nearScene = false; int color = PonderPalette.WHITE.getColor(); @@ -52,7 +52,7 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.y = y; return this; } - + public Builder independent() { return independent(0); } @@ -71,12 +71,13 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.nearScene = true; return this; } - + public Builder attachKeyFrame() { - scene.builder().addLazyKeyframe(); + scene.builder() + .addLazyKeyframe(); return this; } - + } @Override @@ -86,7 +87,7 @@ public class TextWindowElement extends AnimatedOverlayElement { if (fade < 1 / 16f) return; Vec2f sceneToScreen = vec != null ? scene.getTransform() - .sceneToScreen(vec) : new Vec2f(0, (screen.height - 200) / 2 + y - 8); + .sceneToScreen(vec) : new Vec2f(screen.width / 2, (screen.height - 200) / 2 + y - 8); float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); @@ -122,7 +123,7 @@ public class TextWindowElement extends AnimatedOverlayElement { } FontHelper.drawSplitString(screen.getFontRenderer(), bakedText, targetX - 10, 3, textWidth, - ColorHelper.applyAlpha(brighterColor, fade)); + ColorHelper.applyAlpha(brighterColor, fade)); RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java index fd788e53d..273d520b2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.IBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.foundation.ponder.PonderScene; @@ -36,6 +37,14 @@ public class AnimateTileEntityInstruction extends TickingInstruction { .orElse(0f)); } + public static AnimateTileEntityInstruction deployer(BlockPos location, float totalDelta, int ticks) { + return new AnimateTileEntityInstruction(location, totalDelta, ticks, + (w, f) -> castIfPresent(w, location, DeployerTileEntity.class) + .ifPresent(deployer -> deployer.setAnimatedOffset(f)), + (w) -> castIfPresent(w, location, DeployerTileEntity.class).map(deployer -> deployer.getHandOffset(1)) + .orElse(0f)); + } + protected AnimateTileEntityInstruction(BlockPos location, float totalDelta, int ticks, BiConsumer setter, Function getter) { super(false, ticks); @@ -57,7 +66,11 @@ public class AnimateTileEntityInstruction extends TickingInstruction { public void tick(PonderScene scene) { super.tick(scene); PonderWorld world = scene.getWorld(); - setter.accept(world, (float) (remainingTicks == 0 ? target : getter.apply(world) + deltaPerTick)); + float current = getter.apply(world); + float next = (float) (remainingTicks == 0 ? target : current + deltaPerTick); + setter.accept(world, next); + if (remainingTicks == 0) // lock interpolation + setter.accept(world, next); } private static Optional castIfPresent(PonderWorld world, BlockPos pos, Class teType) { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_holding.json b/src/main/resources/assets/create/models/block/deployer/hand_holding.json index 9a585fb63..0548e608e 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_holding.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_holding.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,15 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 16], + "to": [10, 10, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 5, 4], "rotation": 180, "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 5, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 5, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [3, 0, 5, 4], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json index 09d55a11b..b0b91369a 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -51,15 +50,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 18], + "to": [10, 9.95, 18], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "west": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "up": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "down": {"uv": [4, 8, 8, 12], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_punching.json b/src/main/resources/assets/create/models/block/deployer/hand_punching.json index e60304921..2cde3a6ae 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_punching.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_punching.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,14 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 17], + "to": [10.05, 9.95, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [4, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 3, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 6, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 6, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [4, 8, 7, 12], "rotation": 270, "texture": "#mechanical_press_head"} } }, { @@ -88,28 +88,28 @@ } }, { - "from": [9, 8, 16], + "from": [9, 8, 15], "to": [11, 10, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { "north": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, - "east": {"uv": [0, 3, 2, 4], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 8, 2, 10], "rotation": 180, "texture": "#18"}, "west": {"uv": [0, 0, 1, 2], "rotation": 180, "texture": "#18"}, - "up": {"uv": [0, 0, 1, 2], "rotation": 90, "texture": "#18"}, + "up": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#18"}, "down": {"uv": [0, 0, 1, 2], "rotation": 270, "texture": "#18"} } }, { "from": [5, 7, 15], - "to": [9, 10, 17], + "to": [10, 11, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { - "north": {"uv": [0, 3, 4, 6], "texture": "#18"}, - "east": {"uv": [1, 2, 3, 5], "texture": "#18"}, + "north": {"uv": [6, 1, 10, 6], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 6, 3, 8], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#18"}, - "west": {"uv": [0, 2, 2, 5], "texture": "#18"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#18"}, + "west": {"uv": [0, 2, 2, 6], "texture": "#18"}, + "up": {"uv": [0, 0, 2, 5], "rotation": 90, "texture": "#18"}, "down": {"uv": [1, 4, 3, 8], "rotation": 270, "texture": "#18"} } } diff --git a/src/main/resources/ponder/deployer/contraption.nbt b/src/main/resources/ponder/deployer/contraption.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e92a1a98b3b4bc8a2dedd033de2a3b0ac6ce5473 GIT binary patch literal 870 zcmV-s1DX6EiwFP!000000JWCiPunmM$K57w(*gr&W8z_Z;Sbp*vrv%$XC}PU+XxY1IKsZPzTO3r4IS>*7)i=a6AW&@4%rB zoO1XM`SKm|wT|OCaC`?2b>NhPI^>HwMV*O6WxfFd}oioiqGt z<`1s25i0YNyyPk9g+=c>7Z!9tx_m^oQZ6CVY-|r1*BwHS)I{122@pB=(!cq7a(Qz0 zBOv}yH3H&YT^xI4bHVtU=IR`~plwGQ(CBaknNTx8UjJN8LFY?*8gi$0{Je&6hGgrM z8GHN?L1wv<0T~>rG*c2U3G(^RzST?`f%f}{`wQm>@q`~RV<5d1vjZp%52QNh#wvNP z1epE5EgQ9c{9r*EG<r+a%92M)7+hC6_TSapNM=N{DMFCQt>wR|K9ylrYI7Cc{u;QA&FGA!K=!ISm?qpp7%7QKK%-Le zu2LAOrs4cu5;tmiu2lv)f6c^JmruM5R%U7&1R``?HqsSJKs4ziH}eRVL@-fK?v!eo6oHd z@*t5^QV>Xw4r*P-EVvTBTD6U^g(MR46J;B##>T4H*akR`0S-36DTcKJ z$EvZZ;@Ac_jsXrfz$u1pptEhD^DZ3600$f3Y*JyMvtyw1E*!@I2OHoN0~_d!4Rqdx z;~3!JS{xra$)$8qZ_G&|BH#nY;*e#@-NV)g8cX0FvT2B(%xMAvCy_iNlv~Ihutg#* zg??~n)}QMQeKJ1~a8QnpqD7KGT*Fz%U#?X<=i?%GlmdkB);7JN`YYBO7ip+0Ef3+( zECl3Sj81C2E8Ziv;DKsL*4Nc)^;^x~)c%p0zpMF;zSCnm2d)+~!zew)X-(5VKN+9* z2jkP>M<2C^AT!3VT;vT%N&+fxJ}q@{c%&Mlf^WH~+YdtsN0NgO$4i|F`!rmw{wxvh z9lDC^`pICc+tXaP5Ym|4fFjX8V;OJ=>k@BOE|2rTNwq6{uwhb7#JpF!7dbmY=V=U+ zD;1oi!F>hswn^9W1$Q5R9LG&@;2m-NTt0Xlzw$T^^EmoVjoU57(RzIOsK(Klk8&LC znpmri(W`lJRPTMK0jF%^H`tWxysK>5DTzT!(BEkXs@o399MG$6tH@?l!X#jcl0_XV zES_&IM8dMk`eRQy_0KpH~vzO?d{Ijg<>ZkBsGc2M^{k>m?-L795x Pdq2=$qa)G&qYVH6Vq1LH literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/deployer/modes.nbt b/src/main/resources/ponder/deployer/modes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..da15f4de6e2b074565da28cf843c4ab47efcea8b GIT binary patch literal 508 zcmVoIL2WC93H?K77yqJ59q})4h!J$gPaAh z=FugP+_i`$YdbFDt4{b?GKXUi7M$HKI|2?(Otf|X6V$5TccYv{sy9H^Pip}SqWwL*2}%M zGQ!%!-gG4j*;K$gv@U}S@kiQRDBV=~N*e2?)ajH?d1oDcHA+_%m9zJf)l(sQ*-_4i yQm*NEZ$k{-P{LHca8pAK0N5T<_o+8p z5MgSB5vako7BnsrIk?nq8a!!1kV(CoRI~s>ZMebZjIze7(RdY&@4yKhILv{wYTg!( zSEH$Nd^tOn8z*q!Fb7Ui3Wq!g4td_j2^=`gf#WTES>tbri#gPS zIn-hsCvf1fT232+^umM?_A`V{oXuvx==q7>AJFqNJzv;;b|xmMmg)r{0$;>%Zz570C_Xd?TqqC1 zBa8JQBA@1NHa~Pu&Q7{-+R*Hx$)&msAv)q29|&{x_QpoXdUQe&It*c_6UP|$j6$ss zZ*189Nj#hV{tj$!KO{%zUyiIJ3;Xv63dzhtj9DVDkUVIf${ZEOb*raZ^}sQMF3#WT z>cge0T1>J8`ZI_RQ!Tvy|6b?;VDITm9I+b~U ze!Ek8+owuqsO-g0(p1tE?`cF<7P|(*Ax|_$&=#pSYC55R2@qXyjWG@C=oV2=Zw#p} z=?GYk+C;F&zY5*wiA+cRp-|c^Z57b!Uasd2cl@>Ckh58Nt0LbLt IooxyL08qfW#dVH{7fctKHkmP2JX7 z$Bt~5QXY)w!)fBSxM>*Fj#TyFe?HH6rsEU{O%QeRmmmnC<~54%6O;?>rI*5?#wKVq zQ>J`&Mfmbzf=F##blMw1%z5rb=W(pbdNf(0!2k{ca43Mo0Gw#qfF|qFqcbQxth)dw~fo`>8CM~ zE~XQB-ojsY@PKwsx*j4H8Pddh9c#utoPTNJq{M)DhBOqQiCv2UF%M}d zKoifI0M3vkoN>*S@Lm*c;psiE1bTbu_{~asF)fV_-4L9j;`Kq{wAoB|Pl%zRif`7` z!Zr_&IT|f^*-SB}jrFU&@B7nvcbLLw5O`hh{Rie{;{C#TSw3&4GvmFf5Lm+e&dgPyGmA{^fFeT+5JAa}9mro<9leq|u@3ztJBk K?xy7q3;+OzpEAJ! literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/plough.nbt b/src/main/resources/ponder/plough.nbt new file mode 100644 index 0000000000000000000000000000000000000000..24f190e64f683f0466aa069d80f44153d54fbf18 GIT binary patch literal 974 zcmV;<12Oy`iwFP!000000KHe+j@vd6r7pB(Z}t+PX;Ywm*$-IsIR%0iZ5|2)=^{bX zM}d~dGO-jXkaWD8qQ8~z>&OzdiY$4#+iVEv!RE|4oH?TzYEHa*3|khE88yTaX4FUW3f-x;kP&rf)Y=a+#C8U`ZY9^Cs8=FkHzqCem`phQ5C@ z98Bm-$>h(~%7Fc4xB&aruCQBSs-?zG?%GR;;N(+kFqlwlW*ei6B%JLDQl zYK{M_!8g1p1*BIPfaTdp8oD%-|9$Xq6Z`P6e);^Y=VLQ{A6Gt_ic^`26Er#WQ42RU`|K4x;AGcTv3l}S~3CFLiKI*G$HXD zRseZ^J5jc4ZXwN-M4`~hS$uPAVWiroyAP~(_uEEQCYNA#{>)SjWKQOnT9u%yZ?l9P z8`S#hCS53NRYB;A2?L11uCdPsAF*H?1FOnrx214}Bk&wdr>;Bq7$z&0RmAZY=VIa_ zpA_l?{+p1qiYaA6$vjdEc$y(^*? z|Hm;+(>1W={drp89~$5W4cy%^E%B1s$Bh9mvLu#xcdhDDZBQ5Yt5&J`RdcwlQf)z# z;HQ@KyW8r~*kO?v(k<76NJ)eVi;t}uxlYtkR-