More pondering

- First couple of funnel scenes
- More utility methods
- Scene progress bar
- An inspect mode that does nothing
This commit is contained in:
simibubi 2021-02-26 19:46:56 +01:00
parent 550744da92
commit 692c6deaaf
36 changed files with 757 additions and 88 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<PonderScene> compile(ResourceLocation id) {
@ -50,7 +50,7 @@ public class PonderRegistry {
List<PonderStoryBoardEntry> list = all.get(id);
List<PonderScene> 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;
}
}
}

View file

@ -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<PonderInstruction> schedule, activeSchedule;
Map<UUID, PonderElement> linkedElements;
Set<PonderElement> 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<PonderInstruction> 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 <T extends Entity> void forEachWorldEntity(Class<T> type, Consumer<T> 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) {

View file

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

View file

@ -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<BlockState> stateFunc, boolean spawnParticles) {
modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), stateFunc, spawnParticles);
}
public void modifyBlocks(Selection selection, UnaryOperator<BlockState> stateFunc, boolean spawnParticles) {
addInstruction(new ReplaceBlocksInstruction(selection, stateFunc, false, spawnParticles));
}
public <T extends Entity> void modifyEntities(Class<T> entityClass, Consumer<T> entityCallBack) {
addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack));
}
public <T extends Entity> void modifyEntitiesInside(Class<T> entityClass, Selection area,
Consumer<T> entityCallBack) {
addInstruction(scene -> scene.forEachWorldEntity(entityClass, e -> {
if (area.test(e.getPosition()))
entityCallBack.accept(e);
}));
}
public void modifyEntity(ElementLink<EntityElement> link, Consumer<Entity> entityCallBack) {
addInstruction(scene -> {
EntityElement resolve = scene.resolve(link);
if (resolve != null)
resolve.ifPresent(entityCallBack::accept);
});
}
public ElementLink<EntityElement> createEntity(Function<World, Entity> factory) {
ElementLink<EntityElement> 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<BeltItemElement> link, boolean stalled) {
addInstruction(scene -> {
BeltItemElement resolve = scene.resolve(link);

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -23,6 +23,7 @@ public class TextWindowElement extends AnimatedOverlayElement {
int y;
Vec3d vec;
boolean nearScene;
int color;
public TextWindowElement(Supplier<String> 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<String> list = screen.getFontRenderer()
.listFormattedStringToWidth(bakedText, textWidth);

View file

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

View file

@ -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<BlockState> stateToUse;
private boolean replaceAir;
private boolean spawnParticles;
public ReplaceBlocksInstruction(Selection selection, BlockState stateToUse, boolean replaceAir,
public ReplaceBlocksInstruction(Selection selection, UnaryOperator<BlockState> 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));
});
}

View file

@ -27,10 +27,12 @@ public class TextInstruction extends FadeInOutInstruction {
.colored(color));
}
public TextInstruction(int color, Supplier<String> text, int duration, Vec3d position) {
public TextInstruction(int color, Supplier<String> 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<String> text, int duration, int y) {

View file

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

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.