Freeze and Identify

- Ponder scenes can now be paused and analysed, viewing tooltips for targeted blocks in the scene
- During editing, identify mode can be used to move targeted positions to the clipboard
- Ponder-compatible components can be pondered about in identify mode
This commit is contained in:
simibubi 2021-02-28 01:34:56 +01:00
parent 692c6deaaf
commit 43f0ad1c78
41 changed files with 547 additions and 345 deletions

View file

@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json
187d765fed859da0aa91e67d35b18589882ae179 assets/create/lang/en_us.json 07eaea807200c157af29adbbc411d2a80b9cade5 assets/create/lang/en_us.json
d9dc6a731465072a69754252c9097bfc83f2e0b8 assets/create/lang/unfinished/de_de.json 3f89caaa4c6ac34222ebd1d5577139c18a9aa6b8 assets/create/lang/unfinished/de_de.json
ae5554d2809e669e80f455abd0e67a764fff31da assets/create/lang/unfinished/es_es.json 591db95e6cd9e9f3f106ef4dc1f9ce475edee4df assets/create/lang/unfinished/es_es.json
e17b3b528004939b86009e3f88679555f33fbc90 assets/create/lang/unfinished/es_mx.json ee7da78e00b92e5fde92c8ad8b25627bb7f478c7 assets/create/lang/unfinished/es_mx.json
4f385f92b948be135e268bf7f6f71e346266128d assets/create/lang/unfinished/fr_fr.json 3b604e06a29ddac65e71e4b853e88066496b3118 assets/create/lang/unfinished/fr_fr.json
1662dcbf578c71c8f2c92dff276766d1b80eae8c assets/create/lang/unfinished/it_it.json d50db792720189290b382537f2703d08feab7f52 assets/create/lang/unfinished/it_it.json
53e51f744fd205abfd6cb69ba213d0ba867b1e95 assets/create/lang/unfinished/ja_jp.json 2969a487f270d80969d69a5f76cef7e1b41c5c9e assets/create/lang/unfinished/ja_jp.json
75cf95c526518a104c7a1289a4ce529d2d8ffde1 assets/create/lang/unfinished/ko_kr.json 5df95bcadb862b4522439ea66dc28a018771562b assets/create/lang/unfinished/ko_kr.json
e76bf18f466986aadd4b53991267305755ce299c assets/create/lang/unfinished/nl_nl.json 9f65db261fdda1c22691b5238a8327d7aabcb912 assets/create/lang/unfinished/nl_nl.json
06370d657c5967e43df0f4925b3c5b06844a9172 assets/create/lang/unfinished/pt_br.json 1864077ccca4c023e5bee33a3b1efe9ccdcaad28 assets/create/lang/unfinished/pt_br.json
586f3041725e75e02d440f233c12df3be879cecf assets/create/lang/unfinished/ru_ru.json 1559765f5d8f1361e1a78680c60dd16ac5111259 assets/create/lang/unfinished/ru_ru.json
bbb874798f5125d4870e31bf6636f8e9b40a40b0 assets/create/lang/unfinished/zh_cn.json 7b9680e0d83fdd4749418e54342fa567b4e2ea6b assets/create/lang/unfinished/zh_cn.json
e3aeeeaccee348630734c63fcbc3e3bea0af6663 assets/create/lang/unfinished/zh_tw.json ea077d3e3141001ebe3fb2cda60276ac21647a1f assets/create/lang/unfinished/zh_tw.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json

View file

@ -1804,15 +1804,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder",
"create.ponder.subject": "Subject of this scene",
"create.ponder.pondering": "Pondering about...", "create.ponder.pondering": "Pondering about...",
"create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.sneak_and": "Sneak +",
"create.ponder.shared.ctrl_and": "Ctrl +", "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.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_0.title": "Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", "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.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.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "Funnel compatibility", "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.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_0.title": "Relaying rotational force using Shafts",
@ -1845,10 +1849,12 @@
"create.ponder.brass_hand.scene_8.title": "Manipulating Items", "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.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_0.title": "Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", "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.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.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1017", "_": "Missing Localizations: 1023",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 59", "_": "Missing Localizations: 65",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 947", "_": "Missing Localizations: 953",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 729", "_": "Missing Localizations: 735",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 64", "_": "Missing Localizations: 70",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 71", "_": "Missing Localizations: 77",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 118", "_": "Missing Localizations: 124",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1216", "_": "Missing Localizations: 1222",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1282", "_": "Missing Localizations: 1288",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 68", "_": "Missing Localizations: 74",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 66", "_": "Missing Localizations: 72",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 71", "_": "Missing Localizations: 77",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-", "_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "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.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_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "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.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_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "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.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.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -67,7 +67,7 @@ public class DeployTool extends PlacementToolBase {
.translateBack(origin); .translateBack(origin);
AABBOutline outline = schematicHandler.getOutline(); AABBOutline outline = schematicHandler.getOutline();
outline.render(ms, buffer); outline.render(ms, buffer, pt);
outline.getParams() outline.getParams()
.clearTextures(); .clearTextures();
ms.pop(); ms.pop();

View file

@ -3,6 +3,7 @@ package com.simibubi.create.content.schematics.client.tools;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.AllSpecialTextures;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.outliner.AABBOutline; import com.simibubi.create.foundation.utility.outliner.AABBOutline;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
@ -74,7 +75,7 @@ public class FlipTool extends PlacementToolBase {
.disableNormals() .disableNormals()
.colored(0xdddddd) .colored(0xdddddd)
.withFaceTextures(tex, tex); .withFaceTextures(tex, tex);
outline.render(ms, buffer); outline.render(ms, buffer, AnimationTickHolder.getPartialTicks());
super.renderOnSchematic(ms, buffer); super.renderOnSchematic(ms, buffer);
} }

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.schematics.client.tools;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.outliner.LineOutline; import com.simibubi.create.foundation.utility.outliner.LineOutline;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
@ -35,7 +36,7 @@ public class RotateTool extends PlacementToolBase {
.colored(0xdddddd) .colored(0xdddddd)
.lineWidth(1 / 16f); .lineWidth(1 / 16f);
line.set(start, end) line.set(start, end)
.render(ms, buffer); .render(ms, buffer, AnimationTickHolder.getPartialTicks());
super.renderOnSchematic(ms, buffer); super.renderOnSchematic(ms, buffer);
} }

View file

@ -143,7 +143,7 @@ public abstract class SchematicToolBase implements ISchematicTool {
.colored(0x6886c5) .colored(0x6886c5)
.withFaceTexture(AllSpecialTextures.CHECKERED) .withFaceTexture(AllSpecialTextures.CHECKERED)
.lineWidth(1 / 16f); .lineWidth(1 / 16f);
outline.render(ms, buffer); outline.render(ms, buffer, AnimationTickHolder.getPartialTicks());
outline.getParams() outline.getParams()
.clearTextures(); .clearTextures();
ms.pop(); ms.pop();

View file

@ -139,6 +139,7 @@ public class ClientEvents {
@SubscribeEvent @SubscribeEvent
public static void onRenderWorld(RenderWorldLastEvent event) { public static void onRenderWorld(RenderWorldLastEvent event) {
Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView();
float pt = AnimationTickHolder.getPartialTicks();
MatrixStack ms = event.getMatrixStack(); MatrixStack ms = event.getMatrixStack();
ms.push(); ms.push();
@ -149,9 +150,8 @@ public class ClientEvents {
CreateClient.schematicHandler.render(ms, buffer); CreateClient.schematicHandler.render(ms, buffer);
CreateClient.ghostBlocks.renderAll(ms, buffer); CreateClient.ghostBlocks.renderAll(ms, buffer);
CreateClient.outliner.renderOutlines(ms, buffer); CreateClient.outliner.renderOutlines(ms, buffer, pt);
// LightVolumeDebugger.render(ms, buffer); // LightVolumeDebugger.render(ms, buffer);
// CollisionDebugger.render(ms, buffer);
buffer.draw(); buffer.draw();
RenderSystem.enableCull(); RenderSystem.enableCull();

View file

@ -1,114 +0,0 @@
package com.simibubi.create.foundation.collision;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllSpecialTextures;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.collision.ContinuousOBBCollider.ContinuousSeparationManifold;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.outliner.AABBOutline;
import net.minecraft.client.Minecraft;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.RayTraceResult.Type;
import net.minecraft.util.math.Vec3d;
public class CollisionDebugger {
public static AxisAlignedBB AABB = new AxisAlignedBB(BlockPos.ZERO.up(10));
public static OrientedBB OBB = new OrientedBB(new AxisAlignedBB(BlockPos.ZERO));
public static Vec3d motion = Vec3d.ZERO;
static ContinuousSeparationManifold seperation;
static double angle = 0;
static AABBOutline outline;
public static void onScroll(double delta) {
angle += delta;
angle = (int) angle;
OBB.setRotation(new Matrix3d().asZRotation(AngleHelper.rad(angle)));
}
public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
ms.push();
outline = new AABBOutline(OBB.getAsAxisAlignedBB());
outline.getParams()
.withFaceTexture(seperation == null ? AllSpecialTextures.CHECKERED : null)
.colored(0xffffff);
if (seperation != null)
outline.getParams()
.lineWidth(1 / 64f)
.colored(0xff6544);
MatrixStacker.of(ms)
.translate(OBB.center);
ms.peek()
.getModel()
.multiply(OBB.rotation.getAsMatrix4f());
MatrixStacker.of(ms)
.translateBack(OBB.center);
outline.render(ms, buffer);
ms.pop();
// ms.push();
// if (motion.length() != 0 && (seperation == null || seperation.getTimeOfImpact() != 1)) {
// outline.getParams()
// .colored(0x6544ff)
// .lineWidth(1 / 32f);
// MatrixStacker.of(ms)
// .translate(seperation != null ? seperation.getAllowedMotion(motion) : motion)
// .translate(OBB.center);
// ms.peek()
// .getModel()
// .multiply(OBB.rotation.getAsMatrix4f());
// MatrixStacker.of(ms)
// .translateBack(OBB.center);
// outline.render(ms, buffer);
// }
// ms.pop();
ms.push();
if (seperation != null) {
Vec3d asSeparationVec = seperation.asSeparationVec(.5f);
if (asSeparationVec != null) {
outline.getParams()
.colored(0x65ff44)
.lineWidth(1 / 32f);
MatrixStacker.of(ms)
.translate(asSeparationVec)
.translate(OBB.center);
ms.peek()
.getModel()
.multiply(OBB.rotation.getAsMatrix4f());
MatrixStacker.of(ms)
.translateBack(OBB.center);
outline.render(ms, buffer);
}
}
ms.pop();
}
public static void tick() {
AABB = new AxisAlignedBB(BlockPos.ZERO.up(60)).offset(.5, 0, .5);
motion = Vec3d.ZERO;
RayTraceResult mouse = Minecraft.getInstance().objectMouseOver;
if (mouse != null && mouse.getType() == Type.BLOCK) {
BlockRayTraceResult hit = (BlockRayTraceResult) mouse;
OBB.setCenter(hit.getHitVec());
seperation = OBB.intersect(AABB, motion);
}
CreateClient.outliner.showAABB(AABB, AABB)
.withFaceTexture(seperation == null ? AllSpecialTextures.CHECKERED : null);
}
static void showDebugLine(Vec3d relativeStart, Vec3d relativeEnd, int color, String id, int offset) {
Vec3d center = CollisionDebugger.AABB.getCenter()
.add(0, 1 + offset / 16f, 0);
CreateClient.outliner.showLine(id + OBBCollider.checkCount, center.add(relativeStart), center.add(relativeEnd))
.colored(color)
.lineWidth(1 / 32f);
}
}

View file

@ -1,6 +1,5 @@
package com.simibubi.create.foundation.collision; package com.simibubi.create.foundation.collision;
import static com.simibubi.create.foundation.collision.CollisionDebugger.showDebugLine;
import static java.lang.Math.abs; import static java.lang.Math.abs;
import static java.lang.Math.signum; import static java.lang.Math.signum;
@ -60,7 +59,6 @@ public class OBBCollider {
if (diff > 0) if (diff > 0)
return true; return true;
// boolean isBestSeperation = distance != 0 && -(diff) <= abs(bestSeparation.getValue());
boolean isBestSeperation = checkCount == 2; // Debug specific separations boolean isBestSeperation = checkCount == 2; // Debug specific separations
if (isBestSeperation) { if (isBestSeperation) {
@ -68,17 +66,6 @@ public class OBBCollider {
double value = sTL * abs(diff); double value = sTL * abs(diff);
mf.axis = axis.normalize(); mf.axis = axis.normalize();
mf.separation = value; mf.separation = value;
// Visualize values
if (CollisionDebugger.AABB != null) {
Vec3d normalizedAxis = axis.normalize();
showDebugLine(Vec3d.ZERO, normalizedAxis.scale(TL), 0xbb00bb, "tl", 4);
showDebugLine(Vec3d.ZERO, normalizedAxis.scale(sTL * rA), 0xff4444, "ra", 3);
showDebugLine(normalizedAxis.scale(sTL * (distance - rB)), normalizedAxis.scale(TL), 0x4444ff, "rb", 2);
showDebugLine(normalizedAxis.scale(sTL * (distance - rB)),
normalizedAxis.scale(sTL * (distance - rB) + value), 0xff9966, "separation", 1);
System.out.println("TL:" + TL + ", rA: " + rA + ", rB: " + rB);
}
} }
return false; return false;

View file

@ -52,7 +52,9 @@ public class PonderLocalization {
JsonObject object = new JsonObject(); JsonObject object = new JsonObject();
addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder"); addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder");
addGeneral(object, PonderTooltipHandler.SUBJECT, "Subject of this scene");
addGeneral(object, PonderUI.PONDERING, "Pondering about..."); addGeneral(object, PonderUI.PONDERING, "Pondering about...");
addGeneral(object, PonderUI.IDENTIFY_MODE, "Identify mode active.\nUnpause with [%1$s]");
shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v));
specific.forEach((rl, map) -> { specific.forEach((rl, map) -> {

View file

@ -12,7 +12,11 @@ import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.apache.commons.lang3.mutable.MutableDouble;
import org.apache.commons.lang3.mutable.MutableObject;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement; import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement;
import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; import com.simibubi.create.foundation.ponder.elements.PonderSceneElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
@ -21,20 +25,27 @@ import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.outliner.Outliner; import com.simibubi.create.foundation.utility.outliner.Outliner;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Vector4f; import net.minecraft.client.renderer.Vector4f;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation; import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec2f;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
public class PonderScene { public class PonderScene {
@ -84,6 +95,59 @@ public class PonderScene {
setPointOfInterest(new Vec3d(0, 4, 0)); setPointOfInterest(new Vec3d(0, 4, 0));
} }
public void deselect() {
forEach(WorldSectionElement.class, WorldSectionElement::resetSelectedBlock);
}
public Pair<ItemStack, BlockPos> rayTraceScene(Vec3d from, Vec3d to) {
MutableObject<Pair<WorldSectionElement, BlockPos>> nearestHit = new MutableObject<>();
MutableDouble bestDistance = new MutableDouble(0);
forEach(WorldSectionElement.class, wse -> {
wse.resetSelectedBlock();
if (!wse.isVisible())
return;
Pair<Vec3d, BlockPos> rayTrace = wse.rayTrace(world, from, to);
if (rayTrace == null)
return;
double distanceTo = rayTrace.getFirst()
.distanceTo(from);
if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue())
return;
nearestHit.setValue(Pair.of(wse, rayTrace.getSecond()));
bestDistance.setValue(distanceTo);
});
if (nearestHit.getValue() == null)
return Pair.of(ItemStack.EMPTY, null);
BlockPos selectedPos = nearestHit.getValue()
.getSecond();
BlockPos origin = new BlockPos(offsetX, 0, offsetZ);
if (!world.getBounds()
.isVecInside(selectedPos))
return Pair.of(ItemStack.EMPTY, null);
if (new MutableBoundingBox(origin, origin.add(new Vec3i(size - 1, 0, size - 1))).isVecInside(selectedPos)) {
if (PonderIndex.EDITOR_MODE)
nearestHit.getValue()
.getFirst()
.selectBlock(selectedPos);
return Pair.of(ItemStack.EMPTY, selectedPos);
}
nearestHit.getValue()
.getFirst()
.selectBlock(selectedPos);
BlockState blockState = world.getBlockState(selectedPos);
ItemStack pickBlock = blockState.getPickBlock(
new BlockRayTraceResult(VecHelper.getCenterOf(selectedPos), Direction.UP, selectedPos, true), world,
selectedPos, Minecraft.getInstance().player);
return Pair.of(pickBlock, selectedPos);
}
public String getTitle() { public String getTitle() {
return getString("title"); return getString("title");
} }
@ -132,19 +196,16 @@ public class PonderScene {
activeSchedule.add(new HideAllInstruction(10, null)); activeSchedule.add(new HideAllInstruction(10, null));
} }
public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms) { public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms, float pt) {
float pt = Minecraft.getInstance()
.getRenderPartialTicks();
ms.push(); ms.push();
forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms)); forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms, pt));
for (RenderType type : RenderType.getBlockLayers()) for (RenderType type : RenderType.getBlockLayers())
forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms)); forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms, pt));
forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms)); forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms, pt));
info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt)); info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt));
world.renderEntities(ms, buffer, info); world.renderEntities(ms, buffer, info, pt);
world.renderParticles(ms, buffer, info); world.renderParticles(ms, buffer, info, pt);
outliner.renderOutlines(ms, buffer); outliner.renderOutlines(ms, buffer, pt);
ms.pop(); ms.pop();
} }
@ -295,8 +356,10 @@ public class PonderScene {
} }
public MatrixStack apply(MatrixStack ms) { public MatrixStack apply(MatrixStack ms) {
float pt = Minecraft.getInstance() return apply(ms, AnimationTickHolder.getPartialTicks());
.getRenderPartialTicks(); }
public MatrixStack apply(MatrixStack ms, float pt) {
ms.translate(width / 2, height / 2, 200); ms.translate(width / 2, height / 2, 200);
MatrixStacker.of(ms) MatrixStacker.of(ms)
@ -316,12 +379,22 @@ public class PonderScene {
return ms; return ms;
} }
public Vec3d screenToScene(float x, float y, int depth) { public Vec3d screenToScene(double x, double y, int depth) {
refreshMatrix();
float pt = AnimationTickHolder.getPartialTicks(); float pt = AnimationTickHolder.getPartialTicks();
Vec3d vec = new Vec3d(x, y, depth); Vec3d vec = new Vec3d(x, y, depth);
// wut vec = vec.subtract(width / 2, height / 2, 200);
vec = VecHelper.rotate(vec, 35, Axis.X);
vec = VecHelper.rotate(vec, -55, Axis.Y);
vec = vec.subtract(offset, 0, 0);
vec = VecHelper.rotate(vec, 55, Axis.Y);
vec = VecHelper.rotate(vec, -35, Axis.X);
vec = VecHelper.rotate(vec, -xRotation.getValue(pt), Axis.X);
vec = VecHelper.rotate(vec, -yRotation.getValue(pt), Axis.Y);
vec = vec.mul(1f / 30, 1f / -30, 1f / 30);
vec = vec.subtract((size + offsetX) / -2f, -1f, (size + offsetZ) / -2f);
return vec; return vec;
} }

View file

@ -4,6 +4,7 @@ import java.util.List;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat;
@ -25,29 +26,41 @@ public class PonderTooltipHandler {
static LerpedFloat holdWProgress = LerpedFloat.linear() static LerpedFloat holdWProgress = LerpedFloat.linear()
.startWithValue(0); .startWithValue(0);
static ItemStack lastHoveredStack = null; static ItemStack lastHoveredStack = ItemStack.EMPTY;
static boolean subject = false;
public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder"; public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder";
public static final String SUBJECT = PonderLocalization.LANG_PREFIX + "subject";
public static void tick() { public static void tick() {
Minecraft instance = Minecraft.getInstance(); Minecraft instance = Minecraft.getInstance();
Screen currentScreen = instance.currentScreen; Screen currentScreen = instance.currentScreen;
if (!(currentScreen instanceof ContainerScreen)) ItemStack stack = ItemStack.EMPTY;
return;
ContainerScreen<?> cs = (ContainerScreen<?>) currentScreen;
ItemStack prevStack = lastHoveredStack; ItemStack prevStack = lastHoveredStack;
lastHoveredStack = null; lastHoveredStack = ItemStack.EMPTY;
Slot slotUnderMouse = cs.getSlotUnderMouse(); subject = false;
if (slotUnderMouse == null || !slotUnderMouse.getHasStack())
if (currentScreen instanceof ContainerScreen) {
ContainerScreen<?> cs = (ContainerScreen<?>) currentScreen;
Slot slotUnderMouse = cs.getSlotUnderMouse();
if (slotUnderMouse == null || !slotUnderMouse.getHasStack())
return;
stack = slotUnderMouse.getStack();
} else if (currentScreen instanceof PonderUI) {
PonderUI ponderUI = (PonderUI) currentScreen;
stack = ponderUI.getHoveredTooltipItem();
if (stack.isItemEqual(ponderUI.getSubject()))
subject = true;
} else
return; return;
ItemStack stack = slotUnderMouse.getStack(); if (stack.isEmpty())
return;
if (!PonderRegistry.all.containsKey(stack.getItem() if (!PonderRegistry.all.containsKey(stack.getItem()
.getRegistryName())) .getRegistryName()))
return; return;
if (prevStack != stack) if (prevStack.isEmpty() || !prevStack.isItemEqual(stack))
holdWProgress.startWithValue(0); holdWProgress.startWithValue(0);
float value = holdWProgress.getValue(); float value = holdWProgress.getValue();
@ -56,10 +69,13 @@ public class PonderTooltipHandler {
long window = instance.getWindow() long window = instance.getWindow()
.getHandle(); .getHandle();
if (InputMappings.isKeyDown(window, keyCode)) { if (!subject && InputMappings.isKeyDown(window, keyCode)) {
if (value >= 1) if (value >= 1) {
ScreenOpener.open(new PonderUI(PonderRegistry.compile(stack.getItem() ScreenOpener.open(new PonderUI(PonderRegistry.compile(stack.getItem()
.getRegistryName()))); .getRegistryName())));
holdWProgress.startWithValue(0);
return;
}
holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f));
} else } else
holdWProgress.setValue(Math.max(0, value - .05f)); holdWProgress.setValue(Math.max(0, value - .05f));
@ -68,10 +84,14 @@ public class PonderTooltipHandler {
} }
public static void addToTooltip(List<ITextComponent> toolTip, ItemStack stack) { public static void addToTooltip(List<ITextComponent> toolTip, ItemStack stack) {
float renderPartialTicks = AnimationTickHolder.getPartialTicks();
if (lastHoveredStack != stack) if (lastHoveredStack != stack)
return; return;
float renderPartialTicks = Minecraft.getInstance() if (subject) {
.getRenderPartialTicks(); toolTip.set(1, Lang.createTranslationTextComponent(SUBJECT)
.applyTextStyle(TextFormatting.GREEN));
return;
}
toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f)));
} }

View file

@ -9,41 +9,58 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform;
import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.ponder.ui.PonderButton;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.Pointing; import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.client.ClipboardHelper;
import net.minecraft.client.GameSettings; import net.minecraft.client.GameSettings;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.settings.KeyBinding;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.client.gui.GuiUtils; import net.minecraftforge.fml.client.gui.GuiUtils;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
public class PonderUI extends AbstractSimiScreen { public class PonderUI extends AbstractSimiScreen {
public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering"; public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering";
public static final String IDENTIFY_MODE = PonderLocalization.LANG_PREFIX + "identify_mode";
private List<PonderScene> scenes; private List<PonderScene> scenes;
private LerpedFloat fadeIn; private LerpedFloat fadeIn;
private LerpedFloat sceneProgress; private LerpedFloat sceneProgress;
ItemStack stack; ItemStack stack;
private boolean identifyMode; private boolean identifyMode;
private ItemStack hoveredTooltipItem;
private BlockPos hoveredBlockPos;
private ClipboardHelper clipboardHelper;
private BlockPos copiedBlockPos;
private LerpedFloat lazyIndex; private LerpedFloat lazyIndex;
private int index = 0; private int index = 0;
private PonderButton left, right, icon, refresh, scan; private PonderButton left, right, icon, scan;
public PonderUI(List<PonderScene> scenes) { public PonderUI(List<PonderScene> scenes) {
this.scenes = scenes; this.scenes = scenes;
@ -54,6 +71,7 @@ public class PonderUI extends AbstractSimiScreen {
fadeIn = LerpedFloat.linear() fadeIn = LerpedFloat.linear()
.startWithValue(0) .startWithValue(0)
.chase(1, .1f, Chaser.EXP); .chase(1, .1f, Chaser.EXP);
clipboardHelper = new ClipboardHelper();
} }
@Override @Override
@ -76,7 +94,12 @@ public class PonderUI extends AbstractSimiScreen {
int spacing = 8; int spacing = 8;
int bX = (width - 20) / 2 - (70 + 2 * spacing); int bX = (width - 20) / 2 - (70 + 2 * spacing);
widgets.add(scan = new PonderButton(bX, bY, () -> identifyMode = !identifyMode).showing(AllIcons.I_MTD_SCAN) widgets.add(scan = new PonderButton(bX, bY, () -> {
identifyMode = !identifyMode;
if (!identifyMode)
scenes.get(index)
.deselect();
}).showing(AllIcons.I_MTD_SCAN)
.shortcut(bindings.keyBindDrop) .shortcut(bindings.keyBindDrop)
.fade(0, -1)); .fade(0, -1));
@ -96,7 +119,7 @@ public class PonderUI extends AbstractSimiScreen {
.fade(0, -1)); .fade(0, -1));
bX += 50 + spacing; bX += 50 + spacing;
widgets.add(refresh = new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) widgets.add(new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY)
.shortcut(bindings.keyBindBack) .shortcut(bindings.keyBindBack)
.fade(0, -1)); .fade(0, -1));
@ -105,17 +128,38 @@ public class PonderUI extends AbstractSimiScreen {
@Override @Override
public void tick() { public void tick() {
PonderScene activeScene = scenes.get(index); PonderScene activeScene = scenes.get(index);
activeScene.tick(); if (!identifyMode)
activeScene.tick();
sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP); sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP);
lazyIndex.tickChaser(); lazyIndex.tickChaser();
fadeIn.tickChaser(); fadeIn.tickChaser();
sceneProgress.tickChaser(); sceneProgress.tickChaser();
float lazyIndexValue = lazyIndex.getValue(); if (!identifyMode) {
if (Math.abs(lazyIndexValue - index) > 1 / 512f) float lazyIndexValue = lazyIndex.getValue();
scenes.get(lazyIndexValue < index ? index - 1 : index + 1) if (Math.abs(lazyIndexValue - index) > 1 / 512f)
.tick(); scenes.get(lazyIndexValue < index ? index - 1 : index + 1)
.tick();
}
updateIdentifiedItem(activeScene);
}
public void updateIdentifiedItem(PonderScene activeScene) {
hoveredTooltipItem = ItemStack.EMPTY;
hoveredBlockPos = null;
if (!identifyMode)
return;
MainWindow w = minecraft.getWindow();
double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth();
double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight();
SceneTransform t = activeScene.getTransform();
Vec3d vec1 = t.screenToScene(mouseX, mouseY, 1000);
Vec3d vec2 = t.screenToScene(mouseX, mouseY, -100);
Pair<ItemStack, BlockPos> pair = activeScene.rayTraceScene(vec1, vec2);
hoveredTooltipItem = pair.getFirst();
hoveredBlockPos = pair.getSecond();
} }
@Override @Override
@ -126,6 +170,7 @@ public class PonderUI extends AbstractSimiScreen {
} }
protected void replay() { protected void replay() {
identifyMode = false;
scenes.get(index) scenes.get(index)
.begin(); .begin();
} }
@ -140,6 +185,7 @@ public class PonderUI extends AbstractSimiScreen {
scenes.get(index) scenes.get(index)
.begin(); .begin();
lazyIndex.chase(index, 1 / 4f, Chaser.EXP); lazyIndex.chase(index, 1 / 4f, Chaser.EXP);
identifyMode = false;
return true; return true;
} else } else
index = prevIndex; index = prevIndex;
@ -149,8 +195,8 @@ public class PonderUI extends AbstractSimiScreen {
@Override @Override
protected void renderWindow(int mouseX, int mouseY, float partialTicks) { protected void renderWindow(int mouseX, int mouseY, float partialTicks) {
RenderSystem.enableBlend(); RenderSystem.enableBlend();
renderVisibleScenes(mouseX, mouseY, partialTicks); renderVisibleScenes(mouseX, mouseY, identifyMode ? 0 : partialTicks);
renderWidgets(mouseX, mouseY, partialTicks); renderWidgets(mouseX, mouseY, identifyMode ? 0 : partialTicks);
} }
protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) { protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) {
@ -164,7 +210,7 @@ public class PonderUI extends AbstractSimiScreen {
SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance();
PonderScene story = scenes.get(i); PonderScene story = scenes.get(i);
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
double value = lazyIndex.getValue(partialTicks); double value = lazyIndex.getValue(AnimationTickHolder.getPartialTicks());
double diff = i - value; double diff = i - value;
double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; double slide = MathHelper.lerp(diff * diff, 200, 600) * diff;
@ -174,8 +220,8 @@ public class PonderUI extends AbstractSimiScreen {
ms.push(); ms.push();
story.transform.updateScreenParams(width, height, slide); story.transform.updateScreenParams(width, height, slide);
story.transform.apply(ms); story.transform.apply(ms, partialTicks);
story.renderScene(buffer, ms); story.renderScene(buffer, ms, partialTicks);
buffer.draw(); buffer.draw();
// coords for debug // coords for debug
@ -238,6 +284,7 @@ public class PonderUI extends AbstractSimiScreen {
float fade = fadeIn.getValue(partialTicks); float fade = fadeIn.getValue(partialTicks);
float lazyIndexValue = lazyIndex.getValue(partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks);
float indexDiff = Math.abs(lazyIndexValue - index); float indexDiff = Math.abs(lazyIndexValue - index);
PonderScene activeScene = scenes.get(index);
int textColor = 0xeeeeee; int textColor = 0xeeeeee;
{ {
@ -250,16 +297,35 @@ public class PonderUI extends AbstractSimiScreen {
y += 12; y += 12;
x += 0; x += 0;
RenderSystem.translated(0, 3 * (indexDiff), 0); RenderSystem.translated(0, 3 * (indexDiff), 0);
font.drawSplitString(scenes.get(index) font.drawSplitString(activeScene.getTitle(), x, y, left.x - x,
.getTitle(), x, y, left.x - x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); ColorHelper.applyAlpha(textColor, 1 - indexDiff));
RenderSystem.popMatrix(); RenderSystem.popMatrix();
} }
if (identifyMode) { if (identifyMode) {
RenderSystem.pushMatrix(); RenderSystem.pushMatrix();
RenderSystem.translated(mouseX, mouseY, 800); RenderSystem.translated(mouseX, mouseY, 100);
drawString(font, "?", 6, 2, 0xddffffff); if (hoveredTooltipItem.isEmpty()) {
String tooltip = Lang
.createTranslationTextComponent(IDENTIFY_MODE,
new StringTextComponent(minecraft.gameSettings.keyBindDrop.getKeyBinding()
.getLocalizedName()).applyTextStyle(TextFormatting.WHITE))
.applyTextStyle(TextFormatting.GRAY)
.getFormattedText();
renderTooltip(font.listFormattedStringToWidth(tooltip, width / 3), 0, 0);
} else
renderTooltip(hoveredTooltipItem, 0, 0);
if (hoveredBlockPos != null && PonderIndex.EDITOR_MODE) {
RenderSystem.translated(0, -15, 0);
boolean copied = copiedBlockPos != null && hoveredBlockPos.equals(copiedBlockPos);
String coords = new StringTextComponent(
hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ())
.applyTextStyles(copied ? TextFormatting.GREEN : TextFormatting.GOLD)
.getFormattedText();
renderTooltip(coords, 0, 0);
}
RenderSystem.popMatrix(); RenderSystem.popMatrix();
scan.flash(); scan.flash();
} else { } else {
scan.dim(); scan.dim();
@ -288,8 +354,7 @@ public class PonderUI extends AbstractSimiScreen {
if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index)
right.fade(scenes.size() - lazyIndexValue - 1); right.fade(scenes.size() - lazyIndexValue - 1);
boolean finished = scenes.get(index) boolean finished = activeScene.isFinished();
.isFinished();
if (finished) if (finished)
right.flash(); right.flash();
else else
@ -325,6 +390,8 @@ public class PonderUI extends AbstractSimiScreen {
} }
private void renderOverlay(int i, float partialTicks) { private void renderOverlay(int i, float partialTicks) {
if (identifyMode)
return;
RenderSystem.pushMatrix(); RenderSystem.pushMatrix();
PonderScene story = scenes.get(i); PonderScene story = scenes.get(i);
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
@ -351,6 +418,15 @@ public class PonderUI extends AbstractSimiScreen {
if (handled.booleanValue()) if (handled.booleanValue())
return true; return true;
if (identifyMode && hoveredBlockPos != null && PonderIndex.EDITOR_MODE) {
clipboardHelper.setClipboardString(minecraft.getWindow()
.getHandle(),
"BlockPos copied = util.grid.at(" + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", "
+ hoveredBlockPos.getZ() + ");");
copiedBlockPos = hoveredBlockPos;
return true;
}
return super.mouseClicked(x, y, button); return super.mouseClicked(x, y, button);
} }
@ -383,6 +459,9 @@ public class PonderUI extends AbstractSimiScreen {
if (code == qCode) { if (code == qCode) {
identifyMode = !identifyMode; identifyMode = !identifyMode;
if (!identifyMode)
scenes.get(index)
.deselect();
return true; return true;
} }
@ -474,17 +553,24 @@ public class PonderUI extends AbstractSimiScreen {
public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart,
int borderColorEnd) { int borderColorEnd) {
int zLevel = 100; int z = 100;
GuiUtils.drawGradientRect(zLevel, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(z, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(z, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(z, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(z, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd); GuiUtils.drawGradientRect(z, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd);
GuiUtils.drawGradientRect(zLevel, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart, GuiUtils.drawGradientRect(z, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart, borderColorEnd);
borderColorEnd); GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart);
GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart); GuiUtils.drawGradientRect(z, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd);
GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd); }
public ItemStack getHoveredTooltipItem() {
return hoveredTooltipItem;
}
public ItemStack getSubject() {
return stack;
} }
} }

View file

@ -13,7 +13,6 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.content.schematics.SchematicWorld;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@ -122,9 +121,8 @@ public class PonderWorld extends SchematicWorld {
return this; return this;
} }
public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari) { public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) {
Vec3d vec3d = ari.getProjectedView(); Vec3d vec3d = ari.getProjectedView();
float pt = AnimationTickHolder.getPartialTicks();
double d0 = vec3d.getX(); double d0 = vec3d.getX();
double d1 = vec3d.getY(); double d1 = vec3d.getY();
double d2 = vec3d.getZ(); double d2 = vec3d.getZ();
@ -157,8 +155,8 @@ public class PonderWorld extends SchematicWorld {
renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light); renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light);
} }
public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari) { public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) {
particles.renderParticles(ms, buffer, ari); particles.renderParticles(ms, buffer, ari, pt);
} }
public void tick() { public void tick() {

View file

@ -59,10 +59,9 @@ public class PonderWorldParticles {
} }
} }
public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_) { public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_, float p_228345_5_) {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager(); LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager();
float p_228345_5_ = mc.getRenderPartialTicks();
p_228345_3_.enableLightmap(); p_228345_3_.enableLightmap();
Runnable enable = () -> { Runnable enable = () -> {

View file

@ -5,7 +5,6 @@ import com.simibubi.create.foundation.ponder.PonderWorld;
import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
@ -24,7 +23,7 @@ public abstract class AnimatedSceneElement extends PonderSceneElement {
public void forceApplyFade(float fade) { public void forceApplyFade(float fade) {
this.fade.startWithValue(fade); this.fade.startWithValue(fade);
} }
public void setFade(float fade) { public void setFade(float fade) {
this.fade.setValue(fade); this.fade.setValue(fade);
} }
@ -32,46 +31,46 @@ public abstract class AnimatedSceneElement extends PonderSceneElement {
public void setFadeVec(Vec3d fadeVec) { public void setFadeVec(Vec3d fadeVec) {
this.fadeVec = fadeVec; this.fadeVec = fadeVec;
} }
@Override @Override
public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {
ms.push(); ms.push();
float currentFade = applyFade(ms); float currentFade = applyFade(ms, pt);
renderFirst(world, buffer, ms, currentFade); renderFirst(world, buffer, ms, currentFade, pt);
ms.pop(); ms.pop();
} }
@Override @Override
public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) { public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms,
float pt) {
ms.push(); ms.push();
float currentFade = applyFade(ms); float currentFade = applyFade(ms, pt);
renderLayer(world, buffer, type, ms, currentFade); renderLayer(world, buffer, type, ms, currentFade, pt);
ms.pop();
}
@Override
public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {
ms.push();
float currentFade = applyFade(ms);
renderLast(world, buffer, ms, currentFade);
ms.pop(); ms.pop();
} }
protected float applyFade(MatrixStack ms) { @Override
float currentFade = fade.getValue(Minecraft.getInstance() public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {
.getRenderPartialTicks()); ms.push();
float currentFade = applyFade(ms, pt);
renderLast(world, buffer, ms, currentFade, pt);
ms.pop();
}
protected float applyFade(MatrixStack ms, float pt) {
float currentFade = fade.getValue(pt);
if (fadeVec != null) if (fadeVec != null)
MatrixStacker.of(ms) MatrixStacker.of(ms)
.translate(fadeVec.scale(-1 + currentFade)); .translate(fadeVec.scale(-1 + currentFade));
return currentFade; return currentFade;
} }
protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade,
float fade) {} float pt) {}
protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {}
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {}
protected int lightCoordsFromFade(float fade) { protected int lightCoordsFromFade(float fade) {
int light = 0xF000F0; int light = 0xF000F0;

View file

@ -62,11 +62,9 @@ public class ParrotElement extends AnimatedSceneElement {
} }
@Override @Override
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {
EntityRendererManager entityrenderermanager = Minecraft.getInstance() EntityRendererManager entityrenderermanager = Minecraft.getInstance()
.getRenderManager(); .getRenderManager();
float pt = Minecraft.getInstance()
.getRenderPartialTicks();
if (entity == null) if (entity == null)
pose.create(world); pose.create(world);

View file

@ -9,10 +9,10 @@ import net.minecraft.client.renderer.RenderType;
public abstract class PonderSceneElement extends PonderElement { public abstract class PonderSceneElement extends PonderElement {
public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt);
public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms); public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float pt);
public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt);
} }

View file

@ -31,12 +31,12 @@ public abstract class TrackedElement<T> extends PonderSceneElement {
} }
@Override @Override
public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {} public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {}
@Override @Override
public void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) {} public void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float pt) {}
@Override @Override
public void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {} public void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {}
} }

View file

@ -4,10 +4,10 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.CreateClient; import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.ponder.PonderWorld;
@ -16,8 +16,10 @@ import com.simibubi.create.foundation.render.Compartment;
import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.SuperByteBufferCache;
import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.render.TileEntityRenderHelper;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockRenderType;
@ -30,13 +32,22 @@ import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.fluid.IFluidState; import net.minecraft.fluid.IFluidState;
import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceContext.BlockMode;
import net.minecraft.util.math.RayTraceContext.FluidMode;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
@ -54,6 +65,8 @@ public class WorldSectionElement extends AnimatedSceneElement {
Vec3d animatedRotation = Vec3d.ZERO; Vec3d animatedRotation = Vec3d.ZERO;
Vec3d centerOfRotation = Vec3d.ZERO; Vec3d centerOfRotation = Vec3d.ZERO;
BlockPos selectedBlock;
public WorldSectionElement() {} public WorldSectionElement() {}
public WorldSectionElement(Selection section) { public WorldSectionElement(Selection section) {
@ -91,15 +104,24 @@ public class WorldSectionElement extends AnimatedSceneElement {
public void reset(PonderScene scene) { public void reset(PonderScene scene) {
super.reset(scene); super.reset(scene);
resetAnimatedTransform(); resetAnimatedTransform();
resetSelectedBlock();
} }
public void selectBlock(BlockPos pos) {
selectedBlock = pos;
}
public void resetSelectedBlock() {
selectedBlock = null;
}
public void resetAnimatedTransform() { public void resetAnimatedTransform() {
prevAnimatedOffset = Vec3d.ZERO; prevAnimatedOffset = Vec3d.ZERO;
animatedOffset = Vec3d.ZERO; animatedOffset = Vec3d.ZERO;
prevAnimatedRotation = Vec3d.ZERO; prevAnimatedRotation = Vec3d.ZERO;
animatedRotation = Vec3d.ZERO; animatedRotation = Vec3d.ZERO;
} }
public void queueRedraw() { public void queueRedraw() {
redraw = true; redraw = true;
} }
@ -133,6 +155,57 @@ public class WorldSectionElement extends AnimatedSceneElement {
return super.isVisible() && !isEmpty(); return super.isVisible() && !isEmpty();
} }
class WorldSectionRayTraceResult {
Vec3d actualHitVec;
BlockPos worldPos;
}
public Pair<Vec3d, BlockPos> rayTrace(PonderWorld world, Vec3d source, Vec3d target) {
world.setMask(this.section);
Vec3d transformedTarget = reverseTransformVec(target);
BlockRayTraceResult rayTraceBlocks = world.rayTraceBlocks(new RayTraceContext(reverseTransformVec(source),
transformedTarget, BlockMode.OUTLINE, FluidMode.NONE, null));
world.clearMask();
if (rayTraceBlocks == null)
return null;
if (rayTraceBlocks.getHitVec() == null)
return null;
double t = rayTraceBlocks.getHitVec()
.subtract(transformedTarget)
.lengthSquared()
/ source.subtract(target)
.lengthSquared();
Vec3d actualHit = VecHelper.lerp((float) t, target, source);
return Pair.of(actualHit, rayTraceBlocks.getPos());
}
private Vec3d reverseTransformVec(Vec3d in) {
float pt = AnimationTickHolder.getPartialTicks();
in = in.subtract(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset));
if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) {
in = in.subtract(centerOfRotation);
in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x), Axis.X);
in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z), Axis.Z);
in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y), Axis.Y);
in = in.add(centerOfRotation);
}
return in;
}
public void transformMS(MatrixStack ms, float pt) {
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);
}
public void tick(PonderScene scene) { public void tick(PonderScene scene) {
prevAnimatedOffset = animatedOffset; prevAnimatedOffset = animatedOffset;
prevAnimatedRotation = animatedRotation; prevAnimatedRotation = animatedRotation;
@ -147,46 +220,22 @@ public class WorldSectionElement extends AnimatedSceneElement {
} }
@Override @Override
protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade,
float fade) { float pt) {
float pt = AnimationTickHolder.getPartialTicks(); transformMS(ms, pt);
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);
renderStructure(world, ms, buffer, type, fade); renderStructure(world, ms, buffer, type, fade);
} }
@Override @Override
public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {
int light = -1; int light = -1;
if (fade != 1) if (fade != 1)
light = (int) (MathHelper.lerp(fade, 5, 14)); light = (int) (MathHelper.lerp(fade, 5, 14));
if (redraw) if (redraw)
renderedTileEntities = null; renderedTileEntities = null;
transformMS(ms, pt);
//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); world.pushFakeLight(light);
renderTileEntities(world, ms, buffer); renderTileEntities(world, ms, buffer, pt);
world.popLight(); world.popLight();
} }
@ -210,11 +259,30 @@ public class WorldSectionElement extends AnimatedSceneElement {
} }
@Override @Override
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {
redraw = false; redraw = false;
if (selectedBlock == null)
return;
BlockState blockState = world.getBlockState(selectedBlock);
if (blockState.isAir(world, selectedBlock))
return;
VoxelShape shape =
blockState.getShape(world, selectedBlock, ISelectionContext.forEntity(Minecraft.getInstance().player));
if (shape.isEmpty())
return;
ms.push();
transformMS(ms, pt);
RenderSystem.disableTexture();
WorldRenderer.drawBox(ms, buffer.getBuffer(RenderType.getLines()), shape.getBoundingBox()
.offset(selectedBlock), 1, 1, 1, 1);
if (buffer instanceof SuperRenderTypeBuffer)
((SuperRenderTypeBuffer) buffer).draw(RenderType.getLines());
RenderSystem.enableTexture();
ms.pop();
} }
private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float pt) {
if (renderedTileEntities == null) { if (renderedTileEntities == null) {
renderedTileEntities = new ArrayList<>(); renderedTileEntities = new ArrayList<>();
section.forEach(pos -> { section.forEach(pos -> {
@ -224,8 +292,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
}); });
} else } else
renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te);
TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer, pt);
TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer);
} }
private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) { private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) {

View file

@ -24,13 +24,23 @@ public class TileEntityRenderHelper {
public static void renderTileEntities(World world, Iterable<TileEntity> customRenderTEs, MatrixStack ms, public static void renderTileEntities(World world, Iterable<TileEntity> customRenderTEs, MatrixStack ms,
MatrixStack localTransform, IRenderTypeBuffer buffer) { MatrixStack localTransform, IRenderTypeBuffer buffer) {
renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer); renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer);
} }
public static void renderTileEntities(World world, Iterable<TileEntity> customRenderTEs, MatrixStack ms,
MatrixStack localTransform, IRenderTypeBuffer buffer, float pt) {
renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer, pt);
}
public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld, Iterable<TileEntity> customRenderTEs, MatrixStack ms, public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld,
MatrixStack localTransform, IRenderTypeBuffer buffer) { Iterable<TileEntity> customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer) {
float pt = AnimationTickHolder.getPartialTicks(); renderTileEntities(world, renderWorld, customRenderTEs, ms, localTransform, buffer,
AnimationTickHolder.getPartialTicks());
}
public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld,
Iterable<TileEntity> customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer,
float pt) {
Matrix4f matrix = localTransform.peek() Matrix4f matrix = localTransform.peek()
.getModel(); .getModel();

View file

@ -5,6 +5,7 @@ import java.util.ArrayList;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.outliner.AABBOutline; import com.simibubi.create.foundation.utility.outliner.AABBOutline;
@ -29,6 +30,6 @@ public class LightVolumeDebugger {
outline.getParams().colored(pair.getSecond()); outline.getParams().colored(pair.getSecond());
return outline; return outline;
}) })
.forEach(outline -> outline.render(ms, buffer)); .forEach(outline -> outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()));
} }
} }

View file

@ -73,7 +73,7 @@ public class ValueBox extends ChasingAABBOutline {
} }
@Override @Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
boolean hasTransform = transform != null; boolean hasTransform = transform != null;
if (transform instanceof Sided && params.getHighlightedFace() != null) if (transform instanceof Sided && params.getHighlightedFace() != null)
((Sided) transform).fromSide(params.getHighlightedFace()); ((Sided) transform).fromSide(params.getHighlightedFace());
@ -88,7 +88,7 @@ public class ValueBox extends ChasingAABBOutline {
.getNormal() .getNormal()
.copy(); .copy();
params.colored(isPassive ? passiveColor : highlightColor); params.colored(isPassive ? passiveColor : highlightColor);
super.render(ms, buffer); super.render(ms, buffer, pt);
float fontScale = hasTransform ? -transform.getFontScale() : -1 / 64f; float fontScale = hasTransform ? -transform.getFontScale() : -1 / 64f;
ms.scale(fontScale, fontScale, fontScale); ms.scale(fontScale, fontScale, fontScale);

View file

@ -22,7 +22,7 @@ public class AABBOutline extends Outline {
} }
@Override @Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
renderBB(ms, buffer, bb); renderBB(ms, buffer, bb);
} }

View file

@ -30,7 +30,7 @@ public class BlockClusterOutline extends Outline {
} }
@Override @Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
for (MergeEntry edge : cluster.visibleEdges) { for (MergeEntry edge : cluster.visibleEdges) {
Vec3d start = new Vec3d(edge.pos); Vec3d start = new Vec3d(edge.pos);
Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, edge.axis); Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, edge.axis);

View file

@ -2,7 +2,6 @@ package com.simibubi.create.foundation.utility.outliner;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
@ -29,8 +28,8 @@ public class ChasingAABBOutline extends AABBOutline {
} }
@Override @Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
renderBB(ms, buffer, interpolateBBs(prevBB, bb, AnimationTickHolder.getPartialTicks())); renderBB(ms, buffer, interpolateBBs(prevBB, bb, pt));
} }
private static AxisAlignedBB interpolateBBs(AxisAlignedBB current, AxisAlignedBB target, float pt) { private static AxisAlignedBB interpolateBBs(AxisAlignedBB current, AxisAlignedBB target, float pt) {

View file

@ -2,7 +2,6 @@ package com.simibubi.create.foundation.utility.outliner;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -19,7 +18,7 @@ public class LineOutline extends Outline {
} }
@Override @Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
renderCuboidLine(ms, buffer, start, end); renderCuboidLine(ms, buffer, start, end);
} }
@ -46,8 +45,7 @@ public class LineOutline extends Outline {
} }
@Override @Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
float pt = AnimationTickHolder.getPartialTicks();
float distanceToTarget = 1 - MathHelper.lerp(pt, prevProgress, progress); float distanceToTarget = 1 - MathHelper.lerp(pt, prevProgress, progress);
Vec3d start = end.add(this.start.subtract(end) Vec3d start = end.add(this.start.subtract(end)
.scale(distanceToTarget)); .scale(distanceToTarget));

View file

@ -31,7 +31,7 @@ public abstract class Outline {
params = new OutlineParams(); params = new OutlineParams();
} }
public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer); public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt);
public void renderCuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vec3d start, Vec3d end) { public void renderCuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vec3d start, Vec3d end) {
Vec3d diff = end.subtract(start); Vec3d diff = end.subtract(start);

View file

@ -10,7 +10,6 @@ import java.util.Set;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline; import com.simibubi.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline;
import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams;
@ -146,7 +145,7 @@ public class Outliner {
toClear.forEach(outlines::remove); toClear.forEach(outlines::remove);
} }
public void renderOutlines(MatrixStack ms, SuperRenderTypeBuffer buffer) { public void renderOutlines(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
outlines.forEach((key, entry) -> { outlines.forEach((key, entry) -> {
Outline outline = entry.getOutline(); Outline outline = entry.getOutline();
outline.params.alpha = 1; outline.params.alpha = 1;
@ -156,13 +155,13 @@ public class Outliner {
float fadeticks = OutlineEntry.fadeTicks; float fadeticks = OutlineEntry.fadeTicks;
float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks); float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks);
float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks); float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks);
float alpha = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), lastAlpha, currentAlpha); float alpha = MathHelper.lerp(pt, lastAlpha, currentAlpha);
outline.params.alpha = alpha * alpha * alpha; outline.params.alpha = alpha * alpha * alpha;
if (outline.params.alpha < 1 / 8f) if (outline.params.alpha < 1 / 8f)
return; return;
} }
outline.render(ms, buffer); outline.render(ms, buffer, pt);
}); });
} }