diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 00a1f5066..887d155c4 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -69eecffe64535bdf97970f09d3fd18ffa1dae05b assets/create/lang/en_us.json -b61608001cf56be4b8dc32bec82a763610b558fc assets/create/lang/unfinished/de_de.json -03756500794e32ff51549269a33b824acaeb74e4 assets/create/lang/unfinished/es_es.json -eebffed3ac6127426f8702ee0303cf9669741476 assets/create/lang/unfinished/es_mx.json -600126988d661c32b917643fb57c57848f58373f assets/create/lang/unfinished/fr_fr.json -fadd7a77044e77183ca72484ec8fa6ddf14312bf assets/create/lang/unfinished/it_it.json -51f49b662a8acc436ab98d1fa6287b97be2e5acc assets/create/lang/unfinished/ja_jp.json -a92852c60438845b5672c0f2049cc059140644b6 assets/create/lang/unfinished/ko_kr.json -daafb42a5c92310dcb9aa223e5e9683be1fa4487 assets/create/lang/unfinished/nl_nl.json -be51f53337c9f91d722ffc592070e01115cd575c assets/create/lang/unfinished/pt_br.json -464e5a32896c5b6a3c201d1979c98654c672ad89 assets/create/lang/unfinished/ru_ru.json -7e12449d2bacf443f8f97ba42bfd82b00a69129c assets/create/lang/unfinished/zh_cn.json -cf33f05e397956a60cc386e4244cf96a57b9c152 assets/create/lang/unfinished/zh_tw.json +187d765fed859da0aa91e67d35b18589882ae179 assets/create/lang/en_us.json +d9dc6a731465072a69754252c9097bfc83f2e0b8 assets/create/lang/unfinished/de_de.json +ae5554d2809e669e80f455abd0e67a764fff31da assets/create/lang/unfinished/es_es.json +e17b3b528004939b86009e3f88679555f33fbc90 assets/create/lang/unfinished/es_mx.json +4f385f92b948be135e268bf7f6f71e346266128d assets/create/lang/unfinished/fr_fr.json +1662dcbf578c71c8f2c92dff276766d1b80eae8c assets/create/lang/unfinished/it_it.json +53e51f744fd205abfd6cb69ba213d0ba867b1e95 assets/create/lang/unfinished/ja_jp.json +75cf95c526518a104c7a1289a4ce529d2d8ffde1 assets/create/lang/unfinished/ko_kr.json +e76bf18f466986aadd4b53991267305755ce299c assets/create/lang/unfinished/nl_nl.json +06370d657c5967e43df0f4925b3c5b06844a9172 assets/create/lang/unfinished/pt_br.json +586f3041725e75e02d440f233c12df3be879cecf assets/create/lang/unfinished/ru_ru.json +bbb874798f5125d4870e31bf6636f8e9b40a40b0 assets/create/lang/unfinished/zh_cn.json +e3aeeeaccee348630734c63fcbc3e3bea0af6663 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 9764be514..c95acc466 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1807,6 +1807,13 @@ "create.ponder.pondering": "Pondering about...", "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "Andesite or Brass Casing can be used to encase them.", @@ -1834,7 +1841,15 @@ "create.ponder.brass_hand.scene_7.independent": "This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "Sections", + "create.ponder.brass_hand.scene_8.stalling": "Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "Funnel compatibility", "_": "Thank you for translating Create!" 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 43e84ee08..09c4d73bb 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: 1003", + "_": "Missing Localizations: 1017", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 a03dbe654..dd5db5758 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: 45", + "_": "Missing Localizations: 59", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 a7d6d9546..d8fe9bdc7 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: 933", + "_": "Missing Localizations: 947", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 687cfad34..a6065aa98 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: 715", + "_": "Missing Localizations: 729", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 0c803dad6..4118fc830 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: 50", + "_": "Missing Localizations: 64", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 234cd9e64..5ecc3c2d7 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: 57", + "_": "Missing Localizations: 71", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 c7c0fb134..fe8092627 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: 104", + "_": "Missing Localizations: 118", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 356848779..f2efff87e 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: 1202", + "_": "Missing Localizations: 1216", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 cb2a4fd96..915c5f059 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: 1268", + "_": "Missing Localizations: 1282", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 1825f983a..f804d2544 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: 54", + "_": "Missing Localizations: 68", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 13d306dd7..75275ef6d 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: 52", + "_": "Missing Localizations: 66", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 701d142ac..3b9c69967 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: 57", + "_": "Missing Localizations: 71", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index faa7d9af7..7d85393c7 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -122,7 +122,9 @@ public class AllIcons { I_MTD_LEFT = newRow(), I_MTD_CLOSE = next(), - I_MTD_RIGHT = next(); + I_MTD_RIGHT = next(), + I_MTD_SCAN = next(), + I_MTD_REPLAY = next(); public AllIcons(int x, int y) { iconX = x * 16; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java index 36eb4ce40..1cee38f86 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java @@ -12,6 +12,8 @@ public abstract class PonderInstruction { public abstract boolean isComplete(); + public void onScheduled(PonderScene scene) {} + public abstract void tick(PonderScene scene); public static PonderInstruction simple(Consumer callback) { 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 ab705012b..39a69fa25 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -35,9 +35,9 @@ public class PonderRegistry { all.computeIfAbsent(id, $ -> new ArrayList<>()) .add(new PonderStoryBoardEntry(storyBoard, schematic)); } - - public static MultiSceneBuilder forComponent(ItemProviderEntry component) { - return new MultiSceneBuilder(component); + + public static MultiSceneBuilder forComponents(ItemProviderEntry component, ItemProviderEntry... additional) { + return new MultiSceneBuilder(component, additional); } public static List compile(ResourceLocation id) { @@ -50,7 +50,7 @@ public class PonderRegistry { List list = all.get(id); List scenes = new ArrayList<>(); - + for (int i = 0; i < list.size(); i++) { PonderStoryBoardEntry sb = list.get(i); Template activeTemplate = loadSchematic(sb.getSchematicName()); @@ -99,20 +99,24 @@ public class PonderRegistry { }); return PonderLocalization.record(); } - + public static class MultiSceneBuilder { private ItemProviderEntry component; + private ItemProviderEntry[] additional; - MultiSceneBuilder(ItemProviderEntry component) { + MultiSceneBuilder(ItemProviderEntry component, ItemProviderEntry[] additional) { this.component = component; + this.additional = additional; } - + public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) { PonderRegistry.addStoryBoard(component, schematicPath, storyBoard); + for (ItemProviderEntry itemProviderEntry : additional) + PonderRegistry.addStoryBoard(itemProviderEntry, schematicPath, storyBoard); return this; } - + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index fc3486513..6c0b98bd6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -18,6 +18,7 @@ import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; @@ -30,6 +31,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector4f; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; @@ -38,11 +40,11 @@ public class PonderScene { boolean finished; int sceneIndex; - + List schedule, activeSchedule; Map linkedElements; Set elements; - + PonderWorld world; ResourceLocation component; SceneTransform transform; @@ -58,6 +60,9 @@ public class PonderScene { int offsetZ; int size; + int totalTime; + int currentTime; + public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { pointOfInterest = Vec3d.ZERO; @@ -88,30 +93,40 @@ public class PonderScene { } public void reset() { + currentTime = 0; activeSchedule.clear(); schedule.forEach(mdi -> mdi.reset(this)); } public void begin() { reset(); + forEach(pe -> pe.reset(this)); + world.restore(); + elements.clear(); + linkedElements.clear(); + transform = new SceneTransform(); finished = false; setPointOfInterest(new Vec3d(0, 4, 0)); - forEach(pe -> pe.reset(this)); - elements.clear(); - linkedElements.clear(); - activeSchedule.addAll(schedule); - + baseWorldSection.setEmpty(); baseWorldSection.forceApplyFade(1); elements.add(baseWorldSection); + + totalTime = 0; + activeSchedule.addAll(schedule); + activeSchedule.forEach(i -> i.onScheduled(this)); } public WorldSectionElement getBaseWorldSection() { return baseWorldSection; } + public float getSceneProgress() { + return totalTime == 0 ? 0 : currentTime / (float) totalTime; + } + public void fadeOut() { reset(); activeSchedule.add(new HideAllInstruction(10, null)); @@ -158,6 +173,9 @@ public class PonderScene { transform.tick(); forEach(e -> e.tick(this)); + if (currentTime < totalTime) + currentTime++; + for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { PonderInstruction instruction = iterator.next(); instruction.tick(this); @@ -173,6 +191,10 @@ public class PonderScene { finished = true; } + public void addToSceneTime(int time) { + totalTime += time; + } + public void addElement(PonderElement e) { elements.add(e); } @@ -205,7 +227,7 @@ public class PonderScene { for (PonderElement elemtent : elements) function.accept(elemtent); } - + public void forEachWorldEntity(Class type, Consumer function) { for (Entity element : world.getEntities()) if (type.isInstance(element)) @@ -289,19 +311,18 @@ public class PonderScene { .rotateX(xRotation.getValue(pt)) .rotateY(yRotation.getValue(pt)); ms.scale(30, -30, 30); - ms.translate((size + offsetX) / -2f, -.5f, (size + offsetZ) / -2f); + ms.translate((size + offsetX) / -2f, -1f, (size + offsetZ) / -2f); return ms; } - public Vec3d screenToScene(float x, float y) { - refreshMatrix(); - Vector4f vec = new Vector4f(x, y, 0, 1); - cachedMat.invert(); - vec.transform(cachedMat); - cachedMat.invert(); - MutableBoundingBox bounds = getBounds(); - return new Vec3d(vec.getX() + bounds.getXSize() / -2f, vec.getY(), vec.getZ() + bounds.getZSize() / -2f); + public Vec3d screenToScene(float x, float y, int depth) { + float pt = AnimationTickHolder.getPartialTicks(); + Vec3d vec = new Vec3d(x, y, depth); + + // wut + + return vec; } public Vec2f sceneToScreen(Vec3d vec) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index 4f5290764..6856871ce 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -13,6 +13,7 @@ import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; @@ -23,6 +24,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MutableBoundingBox; @@ -34,17 +36,21 @@ public class PonderUI extends AbstractSimiScreen { public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering"; private List scenes; private LerpedFloat fadeIn; + private LerpedFloat sceneProgress; ItemStack stack; + private boolean identifyMode; private LerpedFloat lazyIndex; private int index = 0; - private PonderButton left, right, icon; + private PonderButton left, right, icon, refresh, scan; public PonderUI(List scenes) { this.scenes = scenes; lazyIndex = LerpedFloat.linear() .startWithValue(index); + sceneProgress = LerpedFloat.linear() + .startWithValue(0); fadeIn = LerpedFloat.linear() .startWithValue(0) .chase(1, .1f, Chaser.EXP); @@ -66,29 +72,46 @@ public class PonderUI extends AbstractSimiScreen { }).showing(stack) .fade(0, -1)); - int spacing = 8; - int bX = (width - 20) / 2 - (20 + spacing); GameSettings bindings = minecraft.gameSettings; + int spacing = 8; + int bX = (width - 20) / 2 - (70 + 2 * spacing); + + widgets.add(scan = new PonderButton(bX, bY, () -> identifyMode = !identifyMode).showing(AllIcons.I_MTD_SCAN) + .shortcut(bindings.keyBindDrop) + .fade(0, -1)); + + bX += 50 + spacing; widgets.add(left = new PonderButton(bX, bY, () -> this.scroll(false)).showing(AllIcons.I_MTD_LEFT) .shortcut(bindings.keyBindLeft) .fade(0, -1)); + bX += 20 + spacing; widgets.add(new PonderButton(bX, bY, this::onClose).showing(AllIcons.I_MTD_CLOSE) .shortcut(bindings.keyBindInventory) .fade(0, -1)); + bX += 20 + spacing; widgets.add(right = new PonderButton(bX, bY, () -> this.scroll(true)).showing(AllIcons.I_MTD_RIGHT) .shortcut(bindings.keyBindRight) .fade(0, -1)); + bX += 50 + spacing; + widgets.add(refresh = new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) + .shortcut(bindings.keyBindBack) + .fade(0, -1)); + } @Override public void tick() { + PonderScene activeScene = scenes.get(index); + activeScene.tick(); + sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP); + lazyIndex.tickChaser(); fadeIn.tickChaser(); - scenes.get(index) - .tick(); + sceneProgress.tickChaser(); + float lazyIndexValue = lazyIndex.getValue(); if (Math.abs(lazyIndexValue - index) > 1 / 512f) scenes.get(lazyIndexValue < index ? index - 1 : index + 1) @@ -102,6 +125,11 @@ public class PonderUI extends AbstractSimiScreen { return super.mouseScrolled(mouseX, mouseY, delta); } + protected void replay() { + scenes.get(index) + .begin(); + } + protected boolean scroll(boolean forward) { int prevIndex = index; index = forward ? index + 1 : index - 1; @@ -121,18 +149,18 @@ public class PonderUI extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderVisibleScenes(partialTicks); + renderVisibleScenes(mouseX, mouseY, partialTicks); renderWidgets(mouseX, mouseY, partialTicks); } - protected void renderVisibleScenes(float partialTicks) { - renderScene(index, partialTicks); + protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) { + renderScene(mouseX, mouseY, index, partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks); if (Math.abs(lazyIndexValue - index) > 1 / 512f) - renderScene(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + renderScene(mouseX, mouseY, lazyIndexValue < index ? index - 1 : index + 1, partialTicks); } - protected void renderScene(int i, float partialTicks) { + protected void renderScene(int mouseX, int mouseY, int i, float partialTicks) { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); @@ -157,18 +185,23 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.pushMatrix(); RenderSystem.multMatrix(ms.peek() .getModel()); + RenderSystem.scaled(-1 / 16d, -1 / 16d, 1 / 16d); RenderSystem.translated(1, -8, -1 / 64f); + // X AXIS RenderSystem.pushMatrix(); + RenderSystem.translated(4, -3, 0); for (int x = 0; x <= bounds.getXSize(); x++) { RenderSystem.translated(-16, 0, 0); font.drawString(x == bounds.getXSize() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); } RenderSystem.popMatrix(); + // Z AXIS RenderSystem.pushMatrix(); RenderSystem.scaled(-1, 1, 1); + RenderSystem.translated(0, -3, -4); RenderSystem.rotatef(-90, 0, 1, 0); RenderSystem.translated(-8, -2, 2 / 64f); for (int z = 0; z <= bounds.getZSize(); z++) { @@ -177,6 +210,23 @@ public class PonderUI extends AbstractSimiScreen { } RenderSystem.popMatrix(); + // DIRECTIONS + RenderSystem.pushMatrix(); + RenderSystem.translated(bounds.getXSize() * -8, 0, bounds.getZSize() * 8); + RenderSystem.rotatef(-90, 0, 1, 0); + for (Direction d : Iterate.horizontalDirections) { + RenderSystem.rotatef(90, 0, 1, 0); + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, bounds.getZSize() * 16); + RenderSystem.rotatef(-90, 1, 0, 0); + font.drawString(d.name() + .substring(0, 1), 0, 0, 0x66FFFFFF); + font.drawString("|", 2, 10, 0x44FFFFFF); + font.drawString(".", 2, 14, 0x22FFFFFF); + RenderSystem.popMatrix(); + } + RenderSystem.popMatrix(); + buffer.draw(); RenderSystem.popMatrix(); } @@ -205,6 +255,16 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.popMatrix(); } + if (identifyMode) { + RenderSystem.pushMatrix(); + RenderSystem.translated(mouseX, mouseY, 800); + drawString(font, "?", 6, 2, 0xddffffff); + RenderSystem.popMatrix(); + scan.flash(); + } else { + scan.dim(); + } + { // Scene overlay RenderSystem.pushMatrix(); @@ -228,11 +288,24 @@ public class PonderUI extends AbstractSimiScreen { if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) right.fade(scenes.size() - lazyIndexValue - 1); - if (scenes.get(index).isFinished()) + boolean finished = scenes.get(index) + .isFinished(); + if (finished) right.flash(); else right.dim(); + { + int x = (width / 2) - 110; + int y = right.y + right.getHeight() + 4; + int w = width - 2 * x; + renderBox(x, y, w, 1, false); + RenderSystem.pushMatrix(); + RenderSystem.translated(x - 2, y - 2, 0); + RenderSystem.scaled((w + 4) * sceneProgress.getValue(partialTicks), 1, 1); + GuiUtils.drawGradientRect(200, 0, 3, 1, 4, 0x60ffeedd, 0x60ffeedd); + RenderSystem.popMatrix(); + } } protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { @@ -290,9 +363,11 @@ public class PonderUI extends AbstractSimiScreen { .getKeyCode(); int dCode = settings.keyBindRight.getKey() .getKeyCode(); + int qCode = settings.keyBindDrop.getKey() + .getKeyCode(); if (code == sCode) { - onClose(); + replay(); return true; } @@ -306,6 +381,11 @@ public class PonderUI extends AbstractSimiScreen { return true; } + if (code == qCode) { + identifyMode = !identifyMode; + return true; + } + return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } 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 48ad11306..f4121cb2b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -5,7 +5,10 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.UnaryOperator; +import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; +import com.simibubi.create.content.contraptions.base.KineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; @@ -34,6 +37,7 @@ import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruct import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -43,6 +47,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.particles.RedstoneParticleData; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -183,9 +188,55 @@ public class SceneBuilder { addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles)); } + private void rotationIndicator(BlockPos pos, boolean direction) { + addInstruction(scene -> { + BlockState blockState = scene.world.getBlockState(pos); + TileEntity tileEntity = scene.world.getTileEntity(pos); + + if (!(blockState.getBlock() instanceof KineticBlock)) + return; + if (!(tileEntity instanceof KineticTileEntity)) + return; + + KineticTileEntity kte = (KineticTileEntity) tileEntity; + KineticBlock kb = (KineticBlock) blockState.getBlock(); + Axis rotationAxis = kb.getRotationAxis(blockState); + + float speed = kte.getTheoreticalSpeed(); + int color = direction ? speed > 0 ? 0xeb5e0b : 0x1687a7 + : SpeedLevel.of(speed) + .getColor(); + + Vec3d location = VecHelper.getCenterOf(pos); + RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, speed, + kb.getParticleInitialRadius(), kb.getParticleTargetRadius(), 20, rotationAxis.name() + .charAt(0)); + + for (int i = 0; i < 20; i++) + scene.world.addParticle(particleData, location.x, location.y, location.z, 0, 0, 0); + }); + } + + public void rotationSpeedIndicator(BlockPos pos) { + rotationIndicator(pos, false); + } + + public void rotationDirectionIndicator(BlockPos pos) { + rotationIndicator(pos, true); + } + + public void indicateRedstone(BlockPos pos) { + createRedstoneParticles(pos, 0xFF0000, 10); + } + public void indicateSuccess(BlockPos pos) { - addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), - Emitter.withinBlockSpace(new RedstoneParticleData(.5f, 1, .7f, 1), new Vec3d(0, 0, 0)), 20, 2)); + createRedstoneParticles(pos, 0x80FFaa, 10); + } + + public void createRedstoneParticles(BlockPos pos, int color, int amount) { + Vec3d rgb = ColorHelper.getRGB(color); + addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), Emitter.withinBlockSpace( + new RedstoneParticleData((float) rgb.x, (float) rgb.y, (float) rgb.z, 1), Vec3d.ZERO), amount, 2)); } } @@ -195,7 +246,13 @@ public class SceneBuilder { public void showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText, int duration) { PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position)); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, false)); + } + + public void showTargetedTextNearScene(PonderPalette color, Vec3d position, String key, String defaultText, + int duration) { + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, true)); } public void showSelectionWithText(PonderPalette color, Selection selection, String key, String defaultText, @@ -210,7 +267,7 @@ public class SceneBuilder { } public void showControls(InputWindowElement element, int duration) { - addInstruction(new ShowInputInstruction(element, duration)); + addInstruction(new ShowInputInstruction(element.clone(), duration)); } public void chaseBoundingBoxOutline(PonderPalette color, Object slot, AxisAlignedBB boundingBox, int duration) { @@ -314,7 +371,7 @@ public class SceneBuilder { } public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { - addInstruction(new ReplaceBlocksInstruction(selection, state, true, spawnParticles)); + addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); } public void setBlock(BlockPos pos, BlockState state) { @@ -322,13 +379,37 @@ public class SceneBuilder { } public void replaceBlocks(Selection selection, BlockState state, boolean spawnParticles) { - addInstruction(new ReplaceBlocksInstruction(selection, state, false, spawnParticles)); + modifyBlocks(selection, $ -> state, spawnParticles); + } + + public void modifyBlock(BlockPos pos, UnaryOperator stateFunc, boolean spawnParticles) { + modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), stateFunc, spawnParticles); + } + + public void modifyBlocks(Selection selection, UnaryOperator stateFunc, boolean spawnParticles) { + addInstruction(new ReplaceBlocksInstruction(selection, stateFunc, false, spawnParticles)); } public void modifyEntities(Class entityClass, Consumer entityCallBack) { addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack)); } + public void modifyEntitiesInside(Class entityClass, Selection area, + Consumer entityCallBack) { + addInstruction(scene -> scene.forEachWorldEntity(entityClass, e -> { + if (area.test(e.getPosition())) + entityCallBack.accept(e); + })); + } + + public void modifyEntity(ElementLink link, Consumer entityCallBack) { + addInstruction(scene -> { + EntityElement resolve = scene.resolve(link); + if (resolve != null) + resolve.ifPresent(entityCallBack::accept); + }); + } + public ElementLink createEntity(Function factory) { ElementLink link = new ElementLink<>(EntityElement.class, UUID.randomUUID()); addInstruction(scene -> { @@ -362,7 +443,7 @@ public class SceneBuilder { BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); - + BeltTileEntity controllerTE = beltTileEntity.getControllerTE(); if (controllerTE != null) controllerTE.tick(); @@ -381,6 +462,19 @@ public class SceneBuilder { return link; } + public void removeItemsFromBelt(BlockPos beltLocation) { + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + TileEntity tileEntity = world.getTileEntity(beltLocation); + if (!(tileEntity instanceof BeltTileEntity)) + return; + BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; + TransportedItemStackHandlerBehaviour transporter = + beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); + transporter.handleProcessingOnAllItems(tis -> TransportedResult.removeItem()); + }); + } + public void stallBeltItem(ElementLink link, boolean stalled) { addInstruction(scene -> { BeltItemElement resolve = scene.resolve(link); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java index a0920675a..58e7ebd0e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java @@ -64,7 +64,7 @@ public class SceneBuildingUtil { return centerOf(pos).add(new Vec3d(face.getDirectionVec()).scale(.5f + margin)); } - public Vec3d at(double x, double y, double z) { + public Vec3d of(double x, double y, double z) { return new Vec3d(x, y, z); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 163682fbc..7aaadea6f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -59,7 +59,7 @@ public class DebugScenes { scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - + Selection xAxis = util.select.fromTo(2, 1, 1, 4, 1, 1); Selection yAxis = util.select.fromTo(1, 2, 1, 1, 4, 1); Selection zAxis = util.select.fromTo(1, 1, 2, 1, 1, 4); @@ -153,11 +153,11 @@ public class DebugScenes { scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); scene.idle(10); - Vec3d emitterPos = util.vector.at(2.5, 2.25, 2.5); - Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.at(0, .1, 0)); + Vec3d emitterPos = util.vector.of(2.5, 2.25, 2.5); + Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.of(0, .1, 0)); Emitter rotation = Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'), - util.vector.at(0, .1, 0)); + util.vector.of(0, .1, 0)); scene.overlay.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20); scene.idle(30); @@ -191,7 +191,7 @@ public class DebugScenes { scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.at(1, 4.5, 3.5), Pointing.LEFT).rightClick() + scene.overlay.showControls(new InputWindowElement(util.vector.of(1, 4.5, 3.5), Pointing.LEFT).rightClick() .withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20); scene.world.showSection(util.select.layer(4), Direction.DOWN); @@ -343,7 +343,7 @@ public class DebugScenes { ElementLink helicopter = scene.world.makeSectionIndependent(hiddenReplaceArea); scene.world.rotateSection(helicopter, 50, 5 * 360, 0, 60); - scene.world.moveSection(helicopter, util.vector.at(0, 4, 5), 50); + scene.world.moveSection(helicopter, util.vector.of(0, 4, 5), 50); scene.overlay.showText(PonderPalette.BLUE, 30, "blast_off", "Up, up and away.", 30); scene.idle(40); @@ -388,7 +388,7 @@ public class DebugScenes { scene.world.modifyEntities(ItemEntity.class, entity -> { if (brassItem.isItemEqual(entity.getItem())) - entity.setMotion(util.vector.at(-.15f, .5f, 0)); + entity.setMotion(util.vector.of(-.15f, .5f, 0)); }); scene.idle(27); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java new file mode 100644 index 000000000..d477d8100 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -0,0 +1,234 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +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.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class FunnelScenes { + + public static void intro(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Using funnels"); + scene.configureBasePlate(0, 1, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); + + scene.idle(10); + + Selection verticalFunnel = util.select.fromTo(2, -1, 4, 2, 4, 4) + .add(util.select.fromTo(1, 1, 4, 1, 4, 4)); + Selection beltFunnels = util.select.fromTo(1, 2, 2, 3, 2, 2); + Selection beltFunnelEnv = util.select.fromTo(0, 1, 0, 5, 2, 2) + .substract(beltFunnels); + + scene.world.showSection(beltFunnelEnv, Direction.DOWN); + + scene.idle(20); + scene.world.showSection(beltFunnels, Direction.DOWN); + + BlockPos entryBeltPos = util.grid.at(3, 1, 2); + BlockPos exitBeltPos = util.grid.at(1, 1, 2); + ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); + Selection exitFunnel = util.select.position(exitBeltPos.up()); + + for (int i = 0; i < 8; i++) { + scene.idle(8); + scene.world.removeItemsFromBelt(exitBeltPos); + scene.world.flapFunnels(exitFunnel, false); + if (i == 2) + scene.rotateCameraY(70); + if (i < 6) + scene.world.createItemOnBelt(entryBeltPos, Direction.EAST, itemStack); + } + + scene.rotateCameraY(-70); + scene.idle(10); + + Selection outputFunnel = util.select.position(1, 2, 4); + scene.world.setBlocks(outputFunnel, Blocks.AIR.getDefaultState(), false); + scene.world.setBlocks(util.select.fromTo(2, -1, 4, 2, 0, 4), AllBlocks.ANDESITE_CASING.getDefaultState(), true); + ElementLink independentSection = + scene.world.showIndependentSection(verticalFunnel, Direction.UP); + + Vec3d topItemSpawn = util.vector.centerOf(2, 6, 4); + Vec3d sideItemSpawn = util.vector.centerOf(1, 3, 4) + .add(0.15f, -0.45f, 0); + ElementLink lastItemEntity = null; + + for (int i = 0; i < 4; i++) { + if (lastItemEntity != null) + scene.world.modifyEntity(lastItemEntity, Entity::remove); + if (i < 3) + lastItemEntity = scene.world.createItemEntity(topItemSpawn, util.vector.of(0, -0.4, 0), itemStack); + scene.idle(8); + } + + scene.world.moveSection(independentSection, util.vector.of(0, 1, 0), 15); + scene.idle(10); + scene.world.setBlocks(outputFunnel, AllBlocks.ANDESITE_FUNNEL.getDefaultState() + .with(FunnelBlock.FACING, Direction.WEST) + .with(FunnelBlock.EXTRACTING, true), false); + + for (int i = 0; i < 3; i++) { + scene.idle(8); + scene.world.flapFunnels(outputFunnel, false); + scene.world.createItemEntity(sideItemSpawn, util.vector.of(-.05, 0, 0), itemStack); + } + + scene.idle(8); + scene.overlay.showText(PonderPalette.WHITE, 0, "funnels_transfer", + "Funnels are ideal for transferring items from and to inventories.", 360); + scene.markAsFinished(); + } + + public static void directionality(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Direction of Transfer"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); + scene.world.setBlocks(util.select.position(3, 1, 1), AllBlocks.ANDESITE_CASING.getDefaultState(), false); + + BlockPos topFunnel = util.grid.at(3, 3, 2); + Selection topFunnelSelection = util.select.position(topFunnel); + Selection firstShow = util.select.fromTo(3, 1, 2, 3, 2, 2); + scene.idle(5); + + scene.world.showSection(firstShow, Direction.DOWN); + scene.idle(15); + + ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); + Vec3d topCenter = util.vector.centerOf(topFunnel); + Vec3d topSide = util.vector.blockSurface(topFunnel, Direction.EAST); + + InputWindowElement controlsSneak = new InputWindowElement(topCenter, Pointing.DOWN).rightClick() + .whileSneaking(); + + // Placing funnels without sneak + scene.world.showSection(topFunnelSelection, Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "regular_place", + "Placed normally, it pull items from the inventory.", 80); + scene.idle(45); + + ElementLink itemLink = + scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack); + scene.idle(40); + + scene.world.modifyEntity(itemLink, Entity::remove); + scene.world.hideSection(topFunnelSelection, Direction.UP); + scene.idle(20); + + // Placing funnels with sneak + scene.world.modifyBlock(topFunnel, s -> s.with(FunnelBlock.EXTRACTING, false), false); + scene.idle(5); + + scene.world.showSection(topFunnelSelection, Direction.DOWN); + scene.overlay.showControls(controlsSneak, 35); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "sneak_place", + "Placed while sneaking, it will put items into the inventory.", 80); + scene.idle(45); + + itemLink = scene.world.createItemEntity(topCenter.add(0, 3, 0), util.vector.of(0, -0.2, 0), itemStack); + scene.idle(10); + + scene.world.modifyEntity(itemLink, Entity::remove); + scene.idle(45); + + // Wrench interaction + InputWindowElement wrenchControls = new InputWindowElement(topSide, Pointing.RIGHT).rightClick() + .withWrench(); + scene.overlay.showControls(wrenchControls, 40); + scene.idle(10); + scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); + scene.idle(10); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "wrench_reverse", + "Using a wrench, the funnel can be flipped after placement.", 80); + + itemLink = scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack); + scene.idle(30); + + scene.overlay.showControls(wrenchControls, 40); + scene.idle(10); + scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); + scene.idle(10); + scene.world.modifyEntity(itemLink, Entity::remove); + + scene.idle(20); + + // Side funnel + BlockPos sideFunnel = util.grid.at(3, 2, 1); + Selection sideFunnelSelection = util.select.fromTo(sideFunnel.down(), sideFunnel); + Vec3d sideCenter = util.vector.centerOf(sideFunnel); + + scene.world.modifyBlock(sideFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), false); + scene.world.showSection(sideFunnelSelection, Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, sideCenter, "same_for_other", + "Same rules will apply for most orientations.", 70); + + scene.idle(20); + + scene.world.flapFunnels(sideFunnelSelection, true); + itemLink = scene.world.createItemEntity(sideCenter.subtract(0, .45, 0), util.vector.of(0, 0, -0.1), itemStack); + scene.idle(60); + scene.world.hideSection(sideFunnelSelection, Direction.UP); + scene.world.hideSection(topFunnelSelection, Direction.UP); + scene.world.modifyEntity(itemLink, Entity::remove); + scene.idle(20); + + // Belt funnel + Selection beltFunnelSetup = util.select.fromTo(0, 1, 0, 2, 2, 5); + Selection gearshiftAndLever = util.select.fromTo(1, 1, 4, 1, 2, 4); + Selection gearshiftedKinetics = util.select.fromTo(1, 1, 2, 2, 1, 4); + Vec3d topOfBeltFunnel = util.vector.topOf(2, 2, 2); + BlockPos beltPos = util.grid.at(2, 1, 2); + BlockPos cogPos = util.grid.at(1, 1, 3); + + scene.world.showSection(beltFunnelSetup, Direction.DOWN); + scene.overlay.showTargetedText(PonderPalette.WHITE, topOfBeltFunnel, "belt_funnel", + "Funnels on belts will extract/insert depending on its movement direction.", 140); + scene.idle(15); + + for (int i = 0; i < 2; i++) { + scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack); + scene.effects.rotationDirectionIndicator(cogPos); + scene.idle(50); + + scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); + scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f); + scene.effects.indicateRedstone(util.grid.at(1, 2, 4)); + scene.effects.rotationDirectionIndicator(cogPos); + scene.idle(35); + + scene.world.removeItemsFromBelt(beltPos); + scene.world.flapFunnels(beltFunnelSetup, false); + + if (i == 0) { + scene.idle(50); + scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); + scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f); + scene.effects.indicateRedstone(util.grid.at(1, 2, 4)); + } + } + } + + public static void mounting(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Funnel compatibility"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 7917de013..d186e6a4e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -52,7 +52,7 @@ public class KineticsScenes { scene.world.setKineticSpeed(gauge, 64); scene.effects.indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showTargetedText(WHITE, util.vector.at(3, 1.5, 2.5), "shaft_relay", + scene.overlay.showTargetedText(WHITE, util.vector.of(3, 1.5, 2.5), "shaft_relay", "Shafts will relay rotation in a straight line.", 1000); scene.idle(20); @@ -92,7 +92,7 @@ public class KineticsScenes { scene.world.setKineticSpeed(shaft, -112); scene.idle(10); - scene.overlay.showTargetedText(WHITE, util.vector.at(1.5, 2, 2.5), "shaft_can_be_encased", + scene.overlay.showTargetedText(WHITE, util.vector.of(1.5, 2, 2.5), "shaft_can_be_encased", "Andesite or Brass Casing can be used to encase them.", 1000); } 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 a7af34338..79a49ba66 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 @@ -12,10 +12,18 @@ public class PonderIndex { // (!) Added entries require re-launch // (!) Modifications inside storyboard methods only require re-opening the ui - PonderRegistry.forComponent(AllBlocks.SHAFT) + PonderRegistry.forComponents(AllBlocks.SHAFT) .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); + PonderRegistry.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) + .addStoryBoard("funnels/intro", FunnelScenes::intro) + .addStoryBoard("funnels/direction", FunnelScenes::directionality) + .addStoryBoard("funnels/mounting", FunnelScenes::mounting); + // redstone + // brass vs andesite + // arm compat? + // Debug scenes, can be found in game via the Brass Hand if (EDITOR_MODE) DebugScenes.registerAll(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java index ae9ed8a89..2de36010f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java @@ -20,12 +20,18 @@ import net.minecraft.util.math.Vec3d; public class InputWindowElement extends AnimatedOverlayElement { private Pointing direction; - String key; AllIcons icon; ItemStack item = ItemStack.EMPTY; - private Vec3d sceneSpace; + + public InputWindowElement clone() { + InputWindowElement inputWindowElement = new InputWindowElement(sceneSpace, direction); + inputWindowElement.key = key; + inputWindowElement.icon = icon; + inputWindowElement.item = item.copy(); + return inputWindowElement; + } public InputWindowElement(Vec3d sceneSpace, Pointing direction) { this.sceneSpace = sceneSpace; 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 cab914bf0..b9e03a520 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 @@ -23,6 +23,7 @@ public class TextWindowElement extends AnimatedOverlayElement { int y; Vec3d vec; + boolean nearScene; int color; public TextWindowElement(Supplier textGetter) { @@ -42,6 +43,11 @@ public class TextWindowElement extends AnimatedOverlayElement { this.y = y; return this; } + + public TextWindowElement placeNearTarget() { + this.nearScene = true; + return this; + } @Override protected void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks, float fade) { @@ -54,7 +60,11 @@ public class TextWindowElement extends AnimatedOverlayElement { float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); - int textWidth = screen.width - targetX; + + if (nearScene) + targetX = (int) Math.min(targetX, sceneToScreen.x + 50); + + int textWidth = Math.min(screen.width - targetX, 180); List list = screen.getFontRenderer() .listFormattedStringToWidth(bakedText, textWidth); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index b46466c6b..0bb0cae53 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -172,6 +172,18 @@ public class WorldSectionElement extends AnimatedSceneElement { light = (int) (MathHelper.lerp(fade, 5, 14)); if (redraw) renderedTileEntities = null; + + //TODO: extract method + float pt = AnimationTickHolder.getPartialTicks(); + MatrixStacker.of(ms) + .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); + if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) + MatrixStacker.of(ms) + .translate(centerOfRotation) + .rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x)) + .rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z)) + .rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y)) + .translateBack(centerOfRotation); world.pushFakeLight(light); renderTileEntities(world, ms, buffer); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java index 0b61a362c..d71ad0919 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.ponder.instructions; +import java.util.function.UnaryOperator; + import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.ponder.Selection; @@ -9,11 +11,11 @@ import net.minecraft.block.Blocks; public class ReplaceBlocksInstruction extends WorldModifyInstruction { - private BlockState stateToUse; + private UnaryOperator stateToUse; private boolean replaceAir; private boolean spawnParticles; - public ReplaceBlocksInstruction(Selection selection, BlockState stateToUse, boolean replaceAir, + public ReplaceBlocksInstruction(Selection selection, UnaryOperator stateToUse, boolean replaceAir, boolean spawnParticles) { super(selection); this.stateToUse = stateToUse; @@ -33,7 +35,7 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction { return; if (spawnParticles) world.addBlockDestroyEffects(pos, prevState); - world.setBlockState(pos, stateToUse); + world.setBlockState(pos, stateToUse.apply(prevState)); }); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java index 31c3c44a4..484fb6de8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -27,10 +27,12 @@ public class TextInstruction extends FadeInOutInstruction { .colored(color)); } - public TextInstruction(int color, Supplier text, int duration, Vec3d position) { + public TextInstruction(int color, Supplier text, int duration, Vec3d position, boolean near) { this(color, text, duration); element = new TextWindowElement(text).pointAt(position); element.colored(color); + if (near) + element.placeNearTarget(); } public TextInstruction(int color, Supplier text, int duration, int y) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java index aed61a680..93f2b5a03 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java @@ -21,6 +21,13 @@ public abstract class TickingInstruction extends PonderInstruction { } protected void firstTick(PonderScene scene) {} + + @Override + public void onScheduled(PonderScene scene) { + super.onScheduled(scene); + if (isBlocking()) + scene.addToSceneTime(totalTicks); + } @Override public void tick(PonderScene scene) { diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java index b71159441..621cd3d2a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java @@ -126,6 +126,8 @@ public class FilteringHandler { return false; if (!filtering.isCountVisible()) return false; + if (!filtering.isActive()) + return false; if (filtering.slotPositioning instanceof ValueBoxTransform.Sided) ((Sided) filtering.slotPositioning).fromSide(result.getFace()); if (!filtering.testHit(objectMouseOver.getHitVec())) diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index 3276c6033..000090faf 100644 Binary files a/src/main/resources/assets/create/textures/gui/icons.png and b/src/main/resources/assets/create/textures/gui/icons.png differ diff --git a/src/main/resources/ponder/funnels/direction.nbt b/src/main/resources/ponder/funnels/direction.nbt new file mode 100644 index 000000000..b9f65898e Binary files /dev/null and b/src/main/resources/ponder/funnels/direction.nbt differ diff --git a/src/main/resources/ponder/funnels/intro.nbt b/src/main/resources/ponder/funnels/intro.nbt new file mode 100644 index 000000000..8f1f190f5 Binary files /dev/null and b/src/main/resources/ponder/funnels/intro.nbt differ diff --git a/src/main/resources/ponder/funnels/mounting.nbt b/src/main/resources/ponder/funnels/mounting.nbt new file mode 100644 index 000000000..c0028ca30 Binary files /dev/null and b/src/main/resources/ponder/funnels/mounting.nbt differ