Such convenience

- Organized util and scene builder methods into nested classes
- Selection rework, allows for addition and substraction
- World sections now merge into a global world section after fading in
- Support for managing reference to elements created by previous instructions
- more util
- Support for animating world sections to roughly simulate a contraption
- Less paperwork for making new scenes
- Support for outliner chaseAABB
- Support for outlining selections
This commit is contained in:
simibubi 2021-02-21 03:18:04 +01:00
parent 45fc0ca7ee
commit c4e1f680c9
53 changed files with 1771 additions and 1031 deletions

View file

@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json 6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
@ -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
880014dda429e6e2f21e227398d861e4da5e90c6 assets/create/lang/en_us.json 4bc90775f20e4373d8acfcd68df5a65134e04866 assets/create/lang/en_us.json
c07a94266b5ccde4d9e35467943cc512fe4b5896 assets/create/lang/unfinished/de_de.json 556b49bc145684816fe4ed3d01b8292b027785f6 assets/create/lang/unfinished/de_de.json
e5a0e1b67981159c16eb4563736f85310c77f979 assets/create/lang/unfinished/es_es.json 0112e46354dc5a3e404e80f18c3e9cf2ce2ac3a7 assets/create/lang/unfinished/es_es.json
4c492fcb95abe9242c3149ba2b08451ba078c223 assets/create/lang/unfinished/es_mx.json 22d8dbe2f7a2b7bb7b8175e6ea7ffe5461138339 assets/create/lang/unfinished/es_mx.json
a9ea43cba7ebf87860d165839c98986b8da17f8e assets/create/lang/unfinished/fr_fr.json 5aac59946786fe76ff0d5ab8e548c086adb46a7b assets/create/lang/unfinished/fr_fr.json
cc4fe91e45becc807f49b7114d32d44812d0ec42 assets/create/lang/unfinished/it_it.json 479b811f2a0a687e7a1d14cfbed85af8ed8167b9 assets/create/lang/unfinished/it_it.json
287f5a8985786f1fe4a44a4ff4907902074aa725 assets/create/lang/unfinished/ja_jp.json 22ab034f6f8cadcbc689f27e8697e52bc9fd701f assets/create/lang/unfinished/ja_jp.json
2125c67df82987c0bf66efb0b6c59da916362480 assets/create/lang/unfinished/ko_kr.json c046e6335a67a8685bb7e74cd6b14a5ee9c376db assets/create/lang/unfinished/ko_kr.json
9cfd8839a607ba5230a9716bcda3fae0fc9fd9fd assets/create/lang/unfinished/nl_nl.json 96995633b85eaff2ac1b38a8958c6d167150d255 assets/create/lang/unfinished/nl_nl.json
d972eac60bf24d8102c013667b3c76291912edb4 assets/create/lang/unfinished/pt_br.json 8e8159926be6be37f97f6d4cf47deb8c236b83dc assets/create/lang/unfinished/pt_br.json
a552694a6a62274a33cdea255584c3ea3bbc25ef assets/create/lang/unfinished/ru_ru.json 4485be9e7a8a2b0d006464390e664d6d504328b5 assets/create/lang/unfinished/ru_ru.json
d4ea1d09bb09cd8fdbf9a9c996ab66e8db290e92 assets/create/lang/unfinished/zh_cn.json 8bfa521e0220fe71dbeb537a08845522e1ae0899 assets/create/lang/unfinished/zh_cn.json
5b453190f3d422b4124b426fe61cc831b89fd2fa assets/create/lang/unfinished/zh_tw.json eeaa83dafc8a683b4834cd87a49cb9b3c88e4121 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
@ -1587,7 +1587,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json
5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json
187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json
0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json
356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json

View file

@ -89,8 +89,8 @@
}, },
{ {
"when": { "when": {
"axis": "x", "sticky_west": "true",
"sticky_west": "true" "axis": "x"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky", "model": "create:block/radial_chassis_side_x_sticky",
@ -99,8 +99,8 @@
}, },
{ {
"when": { "when": {
"axis": "y", "sticky_west": "true",
"sticky_west": "true" "axis": "y"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y_sticky", "model": "create:block/radial_chassis_side_y_sticky",
@ -109,8 +109,8 @@
}, },
{ {
"when": { "when": {
"axis": "z", "sticky_west": "true",
"sticky_west": "true" "axis": "z"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z_sticky", "model": "create:block/radial_chassis_side_z_sticky",
@ -119,8 +119,8 @@
}, },
{ {
"when": { "when": {
"axis": "x", "sticky_west": "false",
"sticky_west": "false" "axis": "x"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x", "model": "create:block/radial_chassis_side_x",
@ -129,8 +129,8 @@
}, },
{ {
"when": { "when": {
"axis": "y", "sticky_west": "false",
"sticky_west": "false" "axis": "y"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y", "model": "create:block/radial_chassis_side_y",
@ -139,8 +139,8 @@
}, },
{ {
"when": { "when": {
"axis": "z", "sticky_west": "false",
"sticky_west": "false" "axis": "z"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z", "model": "create:block/radial_chassis_side_z",
@ -149,8 +149,8 @@
}, },
{ {
"when": { "when": {
"axis": "x", "sticky_north": "true",
"sticky_north": "true" "axis": "x"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky" "model": "create:block/radial_chassis_side_x_sticky"
@ -158,8 +158,8 @@
}, },
{ {
"when": { "when": {
"axis": "y", "sticky_north": "true",
"sticky_north": "true" "axis": "y"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y_sticky", "model": "create:block/radial_chassis_side_y_sticky",
@ -168,8 +168,8 @@
}, },
{ {
"when": { "when": {
"axis": "z", "sticky_north": "true",
"sticky_north": "true" "axis": "z"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky", "model": "create:block/radial_chassis_side_x_sticky",
@ -178,8 +178,8 @@
}, },
{ {
"when": { "when": {
"axis": "x", "sticky_north": "false",
"sticky_north": "false" "axis": "x"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x" "model": "create:block/radial_chassis_side_x"
@ -187,8 +187,8 @@
}, },
{ {
"when": { "when": {
"axis": "y", "sticky_north": "false",
"sticky_north": "false" "axis": "y"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y", "model": "create:block/radial_chassis_side_y",
@ -197,8 +197,8 @@
}, },
{ {
"when": { "when": {
"axis": "z", "sticky_north": "false",
"sticky_north": "false" "axis": "z"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x", "model": "create:block/radial_chassis_side_x",
@ -207,8 +207,8 @@
}, },
{ {
"when": { "when": {
"axis": "x", "sticky_east": "true",
"sticky_east": "true" "axis": "x"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky", "model": "create:block/radial_chassis_side_x_sticky",
@ -217,8 +217,8 @@
}, },
{ {
"when": { "when": {
"axis": "y", "sticky_east": "true",
"sticky_east": "true" "axis": "y"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y_sticky", "model": "create:block/radial_chassis_side_y_sticky",
@ -227,8 +227,8 @@
}, },
{ {
"when": { "when": {
"axis": "z", "sticky_east": "true",
"sticky_east": "true" "axis": "z"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z_sticky" "model": "create:block/radial_chassis_side_z_sticky"
@ -236,8 +236,8 @@
}, },
{ {
"when": { "when": {
"axis": "x", "sticky_east": "false",
"sticky_east": "false" "axis": "x"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x", "model": "create:block/radial_chassis_side_x",
@ -246,8 +246,8 @@
}, },
{ {
"when": { "when": {
"axis": "y", "sticky_east": "false",
"sticky_east": "false" "axis": "y"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y", "model": "create:block/radial_chassis_side_y",
@ -256,8 +256,8 @@
}, },
{ {
"when": { "when": {
"axis": "z", "sticky_east": "false",
"sticky_east": "false" "axis": "z"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z" "model": "create:block/radial_chassis_side_z"

View file

@ -1813,20 +1813,25 @@
"create.ponder.brass_hand.scene_0.x": "Das X axis", "create.ponder.brass_hand.scene_0.x": "Das X axis",
"create.ponder.brass_hand.scene_0.y": "Das Y axis", "create.ponder.brass_hand.scene_0.y": "Das Y axis",
"create.ponder.brass_hand.scene_0.z": "Das Z axis", "create.ponder.brass_hand.scene_0.z": "Das Z axis",
"create.ponder.brass_hand.scene_0.title": "Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "Incoming...", "create.ponder.brass_hand.scene_4.incoming": "Incoming...",
"create.ponder.brass_hand.scene_4.title": "Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "Emitting particles",
"create.ponder.brass_hand.scene_5.title": "Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "Point of Interest", "create.ponder.brass_hand.scene_6.poi": "Point of Interest",
"create.ponder.brass_hand.scene_6.title": "Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "Birbs",
"create.ponder.brass_hand.scene_7.seamless": "Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 994", "_": "Missing Localizations: 999",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 36", "_": "Missing Localizations: 41",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 924", "_": "Missing Localizations: 929",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 706", "_": "Missing Localizations: 711",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 41", "_": "Missing Localizations: 46",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 48", "_": "Missing Localizations: 53",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 95", "_": "Missing Localizations: 100",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1193", "_": "Missing Localizations: 1198",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1259", "_": "Missing Localizations: 1264",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 45", "_": "Missing Localizations: 50",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 43", "_": "Missing Localizations: 48",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 48", "_": "Missing Localizations: 53",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1814,20 +1814,25 @@
"create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis",
"create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis",
"create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis",
"create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space",
"create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified",
"create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks",
"create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids",
"create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.",
"create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling",
"create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.",
"create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate",
"create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...",
"create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles",
"create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction",
"create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting",
"create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest",
"create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs",
"create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks",
"create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.",
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -28,8 +28,8 @@
"trigger": "create:bracket_apply", "trigger": "create:bracket_apply",
"conditions": { "conditions": {
"accepted_entries": [ "accepted_entries": [
"create:large_cogwheel", "create:cogwheel",
"create:cogwheel" "create:large_cogwheel"
] ]
} }
}, },

View file

@ -0,0 +1,23 @@
package com.simibubi.create.foundation.ponder;
import java.util.UUID;
public class ElementLink<T extends PonderElement> {
private Class<T> elementClass;
private UUID id;
public ElementLink(Class<T> elementClass, UUID id) {
this.elementClass = elementClass;
this.id = id;
}
public UUID getId() {
return id;
}
public T cast(PonderElement e) {
return elementClass.cast(e);
}
}

View file

@ -5,6 +5,8 @@ public class PonderElement {
boolean visible = true; boolean visible = true;
public void tick(PonderScene scene) {} public void tick(PonderScene scene) {}
public void reset(PonderScene scene) {}
public boolean isVisible() { public boolean isVisible() {
return visible; return visible;
@ -13,5 +15,5 @@ public class PonderElement {
public void setVisible(boolean visible) { public void setVisible(boolean visible) {
this.visible = visible; this.visible = visible;
} }
} }

View file

@ -1,5 +1,7 @@
package com.simibubi.create.foundation.ponder; package com.simibubi.create.foundation.ponder;
import java.util.function.Consumer;
public abstract class PonderInstruction { public abstract class PonderInstruction {
public boolean isBlocking() { public boolean isBlocking() {
@ -12,4 +14,28 @@ public abstract class PonderInstruction {
public abstract void tick(PonderScene scene); public abstract void tick(PonderScene scene);
public static PonderInstruction simple(Consumer<PonderScene> callback) {
return new Simple(callback);
}
private static class Simple extends PonderInstruction {
private Consumer<PonderScene> callback;
public Simple(Consumer<PonderScene> callback) {
this.callback = callback;
}
@Override
public boolean isComplete() {
return true;
}
@Override
public void tick(PonderScene scene) {
callback.accept(scene);
}
}
} }

View file

@ -12,7 +12,7 @@ import java.util.zip.GZIPInputStream;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard;
import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.content.SharedText; import com.simibubi.create.foundation.ponder.content.SharedText;
import com.tterrag.registrate.util.entry.ItemProviderEntry; import com.tterrag.registrate.util.entry.ItemProviderEntry;
@ -28,12 +28,16 @@ import net.minecraft.world.gen.feature.template.Template;
public class PonderRegistry { public class PonderRegistry {
static Map<ResourceLocation, List<PonderStoryBoard>> all = new HashMap<>(); static Map<ResourceLocation, List<PonderStoryBoardEntry>> all = new HashMap<>();
public static void addStoryBoard(ItemProviderEntry<?> component, PonderStoryBoard storyBoard) { public static void addStoryBoard(ItemProviderEntry<?> component, String schematic, PonderStoryBoard storyBoard) {
ResourceLocation id = component.getId(); ResourceLocation id = component.getId();
all.computeIfAbsent(id, $ -> new ArrayList<>()) all.computeIfAbsent(id, $ -> new ArrayList<>())
.add(storyBoard); .add(new PonderStoryBoardEntry(storyBoard, schematic));
}
public static MultiSceneBuilder forComponent(ItemProviderEntry<?> component) {
return new MultiSceneBuilder(component);
} }
public static List<PonderScene> compile(ResourceLocation id) { public static List<PonderScene> compile(ResourceLocation id) {
@ -44,28 +48,31 @@ public class PonderRegistry {
SharedText.gatherText(); SharedText.gatherText();
} }
List<PonderStoryBoard> list = all.get(id); List<PonderStoryBoardEntry> list = all.get(id);
List<PonderScene> scenes = new ArrayList<>(); List<PonderScene> scenes = new ArrayList<>();
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
PonderStoryBoardEntry sb = list.get(i);
PonderStoryBoard sb = list.get(i);
Template activeTemplate = loadSchematic(sb.getSchematicName()); Template activeTemplate = loadSchematic(sb.getSchematicName());
PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world);
activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings());
world.createBackup(); world.createBackup();
PonderScene scene = compileScene(id, i, sb, world);
PonderScene scene = new PonderScene(world, id, i);
PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle());
SceneBuilder builder = scene.builder();
sb.program(builder, builder.getSceneBuildingUtil());
scene.begin(); scene.begin();
scenes.add(scene); scenes.add(scene);
} }
return scenes; return scenes;
} }
public static PonderScene compileScene(ResourceLocation id, int i, PonderStoryBoardEntry sb, PonderWorld world) {
PonderScene scene = new PonderScene(world, id, i);
SceneBuilder builder = scene.builder();
sb.getBoard()
.program(builder, scene.getSceneBuildingUtil());
return scene;
}
public static Template loadSchematic(String path) { public static Template loadSchematic(String path) {
Template t = new Template(); Template t = new Template();
String filepath = "ponder/" + path + ".nbt"; String filepath = "ponder/" + path + ".nbt";
@ -87,15 +94,25 @@ public class PonderRegistry {
PonderIndex.register(); PonderIndex.register();
SharedText.gatherText(); SharedText.gatherText();
all.forEach((id, list) -> { all.forEach((id, list) -> {
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++)
PonderStoryBoard sb = list.get(i); compileScene(id, i, list.get(i), null);
PonderScene scene = new PonderScene(null, id, i);
PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle());
SceneBuilder builder = scene.builder();
sb.program(builder, builder.getSceneBuildingUtil());
}
}); });
return PonderLocalization.record(); return PonderLocalization.record();
} }
public static class MultiSceneBuilder {
private ItemProviderEntry<?> component;
MultiSceneBuilder(ItemProviderEntry<?> component) {
this.component = component;
}
public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) {
PonderRegistry.addStoryBoard(component, schematicPath, storyBoard);
return this;
}
}
} }

View file

@ -1,77 +1,61 @@
package com.simibubi.create.foundation.ponder; package com.simibubi.create.foundation.ponder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.ponder.content.PonderPalette;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.ParrotElement;
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;
import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction;
import com.simibubi.create.foundation.ponder.instructions.DelayInstruction;
import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter;
import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction;
import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction;
import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction;
import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction;
import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction;
import com.simibubi.create.foundation.ponder.instructions.ShowCompleteSchematicInstruction;
import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction;
import com.simibubi.create.foundation.ponder.instructions.TextInstruction;
import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
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.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.particles.RedstoneParticleData;
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.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 {
boolean finished;
int sceneIndex;
List<PonderInstruction> schedule, activeSchedule; List<PonderInstruction> schedule, activeSchedule;
Map<UUID, PonderElement> linkedElements;
Set<PonderElement> elements; Set<PonderElement> elements;
PonderWorld world; PonderWorld world;
ResourceLocation component; ResourceLocation component;
int sceneIndex;
SceneTransform transform; SceneTransform transform;
public boolean finished;
SceneRenderInfo info; SceneRenderInfo info;
Outliner outliner; Outliner outliner;
String defaultTitle;
Vec3d pointOfInterest; Vec3d pointOfInterest;
Vec3d chasingPointOfInterest; Vec3d chasingPointOfInterest;
WorldSectionElement baseWorldSection;
private int offsetX; int offsetX;
private int offsetZ; int offsetZ;
private int size; int size;
public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) {
pointOfInterest = Vec3d.ZERO; pointOfInterest = Vec3d.ZERO;
@ -82,11 +66,16 @@ public class PonderScene {
outliner = new Outliner(); outliner = new Outliner();
elements = new HashSet<>(); elements = new HashSet<>();
linkedElements = new HashMap<>();
schedule = new ArrayList<>(); schedule = new ArrayList<>();
activeSchedule = new ArrayList<>(); activeSchedule = new ArrayList<>();
transform = new SceneTransform(); transform = new SceneTransform();
size = getBounds().getXSize(); size = getBounds().getXSize();
info = new SceneRenderInfo(); info = new SceneRenderInfo();
baseWorldSection = new WorldSectionElement();
PonderLocalization.registerSpecific(component, sceneIndex, "title", "Untitled Scene");
setPointOfInterest(new Vec3d(0, 4, 0));
} }
public String getTitle() { public String getTitle() {
@ -107,9 +96,19 @@ public class PonderScene {
world.restore(); world.restore();
transform = new SceneTransform(); transform = new SceneTransform();
finished = false; finished = false;
forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); setPointOfInterest(new Vec3d(0, 4, 0));
forEach(pe -> pe.reset(this));
elements.clear(); elements.clear();
linkedElements.clear();
activeSchedule.addAll(schedule); activeSchedule.addAll(schedule);
baseWorldSection.setEmpty();
baseWorldSection.forceApplyFade(1);
elements.add(baseWorldSection);
}
public WorldSectionElement getBaseWorldSection() {
return baseWorldSection;
} }
public void fadeOut() { public void fadeOut() {
@ -176,6 +175,22 @@ public class PonderScene {
elements.add(e); elements.add(e);
} }
public <E extends PonderElement> void linkElement(E e, ElementLink<E> link) {
linkedElements.put(link.getId(), e);
}
public <E extends PonderElement> E resolve(ElementLink<E> link) {
return link.cast(linkedElements.get(link.getId()));
}
public <E extends PonderElement> void runWith(ElementLink<E> link, Consumer<E> callback) {
callback.accept(resolve(link));
}
public <E extends PonderElement, F> F applyTo(ElementLink<E> link, Function<E, F> function) {
return function.apply(resolve(link));
}
public PonderWorld getWorld() { public PonderWorld getWorld() {
return world; return world;
} }
@ -206,10 +221,14 @@ public class PonderScene {
} }
public SceneBuilder builder() { public SceneBuilder builder() {
return new SceneBuilder(); return new SceneBuilder(this);
} }
private Supplier<String> textGetter(String key) { public SceneBuildingUtil getSceneBuildingUtil() {
return new SceneBuildingUtil(getBounds());
}
Supplier<String> textGetter(String key) {
return () -> PonderLocalization.getSpecific(component, sceneIndex, key); return () -> PonderLocalization.getSpecific(component, sceneIndex, key);
} }
@ -301,188 +320,16 @@ public class PonderScene {
} }
public class SceneBuilder {
private SceneBuildingUtil sceneBuildingUtil;
public SceneBuilder() {
sceneBuildingUtil = new SceneBuildingUtil();
}
public SceneBuildingUtil getSceneBuildingUtil() {
return sceneBuildingUtil;
}
public SceneBuilder showBasePlate() {
return showSection(Select.cuboid(new BlockPos(offsetX, 0, offsetZ), new Vec3i(size, 0, size)),
Direction.UP);
}
public SceneBuilder showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText,
int duration) {
PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText);
return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, position));
}
public SceneBuilder showSelectionWithText(PonderPalette color, Select selection, String key, String defaultText,
int duration) {
PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText);
return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, selection));
}
public SceneBuilder showText(PonderPalette color, int y, String key, String defaultText, int duration) {
PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText);
return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, y));
}
public SceneBuilder showSection(Select selection, Direction fadeInDirection) {
return addInstruction(
new DisplayWorldSectionInstruction(15, fadeInDirection, new WorldSectionElement(selection)));
}
public SceneBuilder debugSchematic() {
return addInstruction(new ShowCompleteSchematicInstruction());
}
public SceneBuilder idle(int ticks) {
return addInstruction(new DelayInstruction(ticks));
}
public SceneBuilder idleSeconds(int seconds) {
return idle(seconds * 20);
}
public SceneBuilder markAsFinished() {
return addInstruction(new MarkAsFinishedInstruction());
}
public SceneBuilder rotateCameraY(float degrees) {
return addInstruction(new RotateSceneInstruction(0, degrees, true));
}
public SceneBuilder setBlocks(Select selection, BlockState state) {
return addInstruction(new ReplaceBlocksInstruction(selection, state, true));
}
public SceneBuilder replaceBlocks(Select selection, BlockState state) {
return addInstruction(new ReplaceBlocksInstruction(selection, state, true));
}
public SceneBuilder setKineticSpeed(Select selection, float speed) {
return modifyKineticSpeed(selection, f -> speed);
}
public SceneBuilder multiplyKineticSpeed(Select selection, float modifier) {
return modifyKineticSpeed(selection, f -> f * modifier);
}
public SceneBuilder modifyKineticSpeed(Select selection, UnaryOperator<Float> speedFunc) {
addInstruction(new TileEntityDataInstruction(selection, SpeedGaugeTileEntity.class, nbt -> {
float newSpeed = speedFunc.apply(nbt.getFloat("Speed"));
nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed));
return nbt;
}, false));
return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> {
nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed")));
return nbt;
}, false));
}
public SceneBuilder flapFunnels(Select selection, boolean outward) {
return addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> {
nbt.putInt("Flap", outward ? -1 : 1);
return nbt;
}, false));
}
public SceneBuilder movePOI(Vec3d location) {
return addInstruction(new MovePoiInstruction(location));
}
public SceneBuilder showControls(InputWindowElement element, int duration) {
return addInstruction(new ShowInputInstruction(element, duration));
}
public SceneBuilder emitParticles(Vec3d location, Emitter emitter, float amountPerCycle, int cycles) {
return addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles));
}
public SceneBuilder indicateSuccess(BlockPos pos) {
return addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos),
Emitter.withinBlockSpace(new RedstoneParticleData(.5f, 1, .7f, 1), new Vec3d(0, 0, 0)), 20, 2));
}
public SceneBuilder birbOnTurntable(BlockPos pos) {
return addInstruction(new CreateParrotInstruction(10, Direction.DOWN,
ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos)));
}
public SceneBuilder birbOnSpinnyShaft(BlockPos pos) {
return addInstruction(
new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos)
.add(0, 0.5, 0), pos)));
}
public SceneBuilder birbLookingAtPOI(Vec3d location) {
return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.lookAtPOI(location)));
}
public SceneBuilder birbPartying(Vec3d location) {
return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.dance(location)));
}
public SceneBuilder addInstruction(PonderInstruction instruction) {
schedule.add(instruction);
return this;
}
public class SceneBuildingUtil {
public Vec3d centerOf(int x, int y, int z) {
return VecHelper.getCenterOf(new BlockPos(x, y, z));
}
public Vec3d topOf(int x, int y, int z) {
return new Vec3d(x + .5, y + 1, z + .5);
}
public Vec3d vector(double x, double y, double z) {
return new Vec3d(x, y, z);
}
public Select everywhere() {
return Select.everything(getBounds());
}
public Select column(int x, int z) {
return Select.column(getBounds(), x, z);
}
public Select layer(int y) {
return layers(y, 1);
}
public Select layers(int y, int height) {
return Select.layer(getBounds(), y, height);
}
public Select layersFrom(int y) {
return Select.layer(getBounds(), y, getBounds().getYSize());
}
}
public SceneBuilder configureBasePlate(int xOffset, int zOffset, int basePlateSize) {
offsetX = xOffset;
offsetZ = zOffset;
size = basePlateSize;
return this;
}
}
public Outliner getOutliner() { public Outliner getOutliner() {
return outliner; return outliner;
} }
public boolean isFinished() {
return finished;
}
public void setFinished(boolean finished) {
this.finished = finished;
}
} }

View file

@ -1,14 +0,0 @@
package com.simibubi.create.foundation.ponder;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil;
public abstract class PonderStoryBoard {
public abstract String getSchematicName();
public abstract String getStoryTitle();
public abstract void program(SceneBuilder scene, SceneBuildingUtil util);
}

View file

@ -0,0 +1,25 @@
package com.simibubi.create.foundation.ponder;
public class PonderStoryBoardEntry {
private String schematicName;
private PonderStoryBoard board;
public PonderStoryBoardEntry(PonderStoryBoard board, String schematicName) {
this.board = board;
this.schematicName = schematicName;
}
public interface PonderStoryBoard {
public abstract void program(SceneBuilder scene, SceneBuildingUtil util);
}
public String getSchematicName() {
return schematicName;
}
public PonderStoryBoard getBoard() {
return board;
}
}

View file

@ -106,7 +106,7 @@ public class PonderUI extends AbstractSimiScreen {
int prevIndex = index; int prevIndex = index;
index = forward ? index + 1 : index - 1; index = forward ? index + 1 : index - 1;
index = MathHelper.clamp(index, 0, scenes.size() - 1); index = MathHelper.clamp(index, 0, scenes.size() - 1);
if (prevIndex != index && Math.abs(index - lazyIndex.getValue()) < 1.5f) { if (prevIndex != index) {// && Math.abs(index - lazyIndex.getValue()) < 1.5f) {
scenes.get(prevIndex) scenes.get(prevIndex)
.fadeOut(); .fadeOut();
scenes.get(index) scenes.get(index)
@ -228,7 +228,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);
if (scenes.get(index).finished) if (scenes.get(index).isFinished())
right.flash(); right.flash();
else else
right.dim(); right.dim();

View file

@ -38,7 +38,7 @@ public class PonderWorld extends SchematicWorld {
protected PonderWorldParticles particles; protected PonderWorldParticles particles;
int overrideLight; int overrideLight;
Select mask; Selection mask;
public PonderWorld(BlockPos anchor, World original) { public PonderWorld(BlockPos anchor, World original) {
super(anchor, original); super(anchor, original);
@ -81,7 +81,7 @@ public class PonderWorld extends SchematicWorld {
return overrideLight == -1 ? 15 : overrideLight; return overrideLight == -1 ? 15 : overrideLight;
} }
public void setMask(Select mask) { public void setMask(Selection mask) {
this.mask = mask; this.mask = mask;
} }

View file

@ -0,0 +1,292 @@
package com.simibubi.create.foundation.ponder;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.UnaryOperator;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.ponder.content.PonderPalette;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.ParrotElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction;
import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction;
import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction;
import com.simibubi.create.foundation.ponder.instructions.DelayInstruction;
import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter;
import com.simibubi.create.foundation.ponder.instructions.FadeOutOfSceneInstruction;
import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction;
import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction;
import com.simibubi.create.foundation.ponder.instructions.OutlineSelectionInstruction;
import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction;
import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction;
import com.simibubi.create.foundation.ponder.instructions.ShowCompleteSchematicInstruction;
import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction;
import com.simibubi.create.foundation.ponder.instructions.TextInstruction;
import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.particles.RedstoneParticleData;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
public class SceneBuilder {
public final OverlayInstructions overlay;
public final SpecialInstructions special;
public final WorldInstructions world;
public final DebugInstructions debug;
public final EffectInstructions effects;
private final PonderScene scene;
public SceneBuilder(PonderScene ponderScene) {
scene = ponderScene;
overlay = new OverlayInstructions();
special = new SpecialInstructions();
world = new WorldInstructions();
debug = new DebugInstructions();
effects = new EffectInstructions();
}
// General
public void title(String title) {
PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, "title", title);
}
public void configureBasePlate(int xOffset, int zOffset, int basePlateSize) {
scene.offsetX = xOffset;
scene.offsetZ = zOffset;
scene.size = basePlateSize;
}
public void showBasePlate() {
world.showSection(scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.offsetX, 0, scene.offsetZ),
new Vec3i(scene.size, 0, scene.size)), Direction.UP);
}
public void idle(int ticks) {
addInstruction(new DelayInstruction(ticks));
}
public void idleSeconds(int seconds) {
idle(seconds * 20);
}
public void markAsFinished() {
addInstruction(new MarkAsFinishedInstruction());
}
public void rotateCameraY(float degrees) {
addInstruction(new RotateSceneInstruction(0, degrees, true));
}
public class EffectInstructions {
public void emitParticles(Vec3d location, Emitter emitter, float amountPerCycle, int cycles) {
addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles));
}
public void indicateSuccess(BlockPos pos) {
addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos),
Emitter.withinBlockSpace(new RedstoneParticleData(.5f, 1, .7f, 1), new Vec3d(0, 0, 0)), 20, 2));
}
}
public class OverlayInstructions {
public void showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText,
int duration) {
PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText);
addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position));
}
public void showSelectionWithText(PonderPalette color, Selection selection, String key, String defaultText,
int duration) {
PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText);
addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, selection));
}
public void showText(PonderPalette color, int y, String key, String defaultText, int duration) {
PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText);
addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, y));
}
public void showControls(InputWindowElement element, int duration) {
addInstruction(new ShowInputInstruction(element, duration));
}
public void chaseBoundingBoxOutline(PonderPalette color, Object slot, AxisAlignedBB boundingBox, int duration) {
addInstruction(new ChaseAABBInstruction(color, slot, boundingBox, duration));
}
public void showOutline(PonderPalette color, Object slot, Selection selection, int duration) {
addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration));
}
}
public class SpecialInstructions {
public void birbOnTurntable(BlockPos pos) {
addInstruction(new CreateParrotInstruction(10, Direction.DOWN,
ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos)));
}
public void birbOnSpinnyShaft(BlockPos pos) {
addInstruction(
new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos)
.add(0, 0.5, 0), pos)));
}
public void birbLookingAtPOI(Vec3d location) {
addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.lookAtPOI(location)));
}
public void birbPartying(Vec3d location) {
addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.dance(location)));
}
public void movePointOfInterest(Vec3d location) {
addInstruction(new MovePoiInstruction(location));
}
public void movePointOfInterest(BlockPos location) {
movePointOfInterest(VecHelper.getCenterOf(location));
}
}
public class WorldInstructions {
public void showSection(Selection selection, Direction fadeInDirection) {
addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, true));
}
public ElementLink<WorldSectionElement> showIndependentSection(Selection selection, Direction fadeInDirection) {
DisplayWorldSectionInstruction instruction =
new DisplayWorldSectionInstruction(15, fadeInDirection, selection, false);
addInstruction(instruction);
return instruction.createLink(scene);
}
public void hideSection(Selection selection, Direction fadeOutDirection) {
WorldSectionElement worldSectionElement = new WorldSectionElement(selection);
ElementLink<WorldSectionElement> elementLink =
new ElementLink<>(WorldSectionElement.class, UUID.randomUUID());
addInstruction(scene -> {
scene.getBaseWorldSection()
.erase(selection);
scene.linkElement(worldSectionElement, elementLink);
scene.addElement(worldSectionElement);
worldSectionElement.queueRedraw();
});
hideIndependentSection(elementLink, fadeOutDirection);
}
public void hideIndependentSection(ElementLink<WorldSectionElement> link, Direction fadeOutDirection) {
addInstruction(new FadeOutOfSceneInstruction<>(15, fadeOutDirection, link));
}
public ElementLink<WorldSectionElement> makeSectionIndependent(Selection selection) {
WorldSectionElement worldSectionElement = new WorldSectionElement(selection);
ElementLink<WorldSectionElement> elementLink =
new ElementLink<>(WorldSectionElement.class, UUID.randomUUID());
addInstruction(scene -> {
scene.getBaseWorldSection()
.erase(selection);
scene.linkElement(worldSectionElement, elementLink);
scene.addElement(worldSectionElement);
worldSectionElement.resetAnimatedTransform();
worldSectionElement.setVisible(true);
worldSectionElement.forceApplyFade(1);
});
return elementLink;
}
public void rotateSection(ElementLink<WorldSectionElement> link, double xRotation, double yRotation,
double zRotation, int duration) {
addInstruction(
AnimateWorldSectionInstruction.rotate(link, new Vec3d(xRotation, yRotation, zRotation), duration));
}
public void moveSection(ElementLink<WorldSectionElement> link, Vec3d offset, int duration) {
addInstruction(AnimateWorldSectionInstruction.move(link, offset, duration));
}
public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) {
addInstruction(new ReplaceBlocksInstruction(selection, state, true, spawnParticles));
}
public void setBlock(BlockPos pos, BlockState state) {
setBlocks(scene.getSceneBuildingUtil().select.position(pos), state, true);
}
public void replaceBlocks(Selection selection, BlockState state, boolean spawnParticles) {
addInstruction(new ReplaceBlocksInstruction(selection, state, false, spawnParticles));
}
public void setKineticSpeed(Selection selection, float speed) {
modifyKineticSpeed(selection, f -> speed);
}
public void multiplyKineticSpeed(Selection selection, float modifier) {
modifyKineticSpeed(selection, f -> f * modifier);
}
public void modifyKineticSpeed(Selection selection, UnaryOperator<Float> speedFunc) {
addInstruction(new TileEntityDataInstruction(selection, SpeedGaugeTileEntity.class, nbt -> {
float newSpeed = speedFunc.apply(nbt.getFloat("Speed"));
nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed));
return nbt;
}, false));
addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> {
nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed")));
return nbt;
}, false));
}
public void flapFunnels(Selection selection, boolean outward) {
addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> {
nbt.putInt("Flap", outward ? -1 : 1);
return nbt;
}, false));
}
}
public class DebugInstructions {
public void debugSchematic() {
addInstruction(new ShowCompleteSchematicInstruction());
}
public void addInstructionInstance(PonderInstruction instruction) {
addInstruction(instruction);
}
}
private void addInstruction(PonderInstruction instruction) {
scene.schedule.add(instruction);
}
private void addInstruction(Consumer<PonderScene> callback) {
scene.schedule.add(PonderInstruction.simple(callback));
}
}

View file

@ -0,0 +1,115 @@
package com.simibubi.create.foundation.ponder;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
public class SceneBuildingUtil {
public final SelectionUtil select;
public final VectorUtil vector;
public final PositionUtil grid;
private final MutableBoundingBox sceneBounds;
SceneBuildingUtil(MutableBoundingBox sceneBounds) {
this.sceneBounds = sceneBounds;
this.select = new SelectionUtil();
this.vector = new VectorUtil();
this.grid = new PositionUtil();
}
public class PositionUtil {
public BlockPos at(int x, int y, int z) {
return new BlockPos(x, y, z);
}
public BlockPos zero() {
return at(0, 0, 0);
}
}
public class VectorUtil {
public Vec3d centerOf(int x, int y, int z) {
return centerOf(grid.at(x, y, z));
}
public Vec3d centerOf(BlockPos pos) {
return VecHelper.getCenterOf(pos);
}
public Vec3d topOf(int x, int y, int z) {
return blockSurface(grid.at(x, y, z), Direction.UP);
}
public Vec3d topOf(BlockPos pos) {
return blockSurface(pos, Direction.UP);
}
public Vec3d blockSurface(BlockPos pos, Direction face) {
return blockSurface(pos, face, 0);
}
public Vec3d blockSurface(BlockPos pos, Direction face, float margin) {
return centerOf(pos).add(new Vec3d(face.getDirectionVec()).scale(.5f + margin));
}
public Vec3d at(double x, double y, double z) {
return new Vec3d(x, y, z);
}
}
public class SelectionUtil {
public Selection everywhere() {
return Selection.of(sceneBounds);
}
public Selection position(int x, int y, int z) {
return position(grid.at(x, y, z));
}
public Selection position(BlockPos pos) {
return cuboid(pos, BlockPos.ZERO);
}
public Selection fromTo(int x, int y, int z, int x2, int y2, int z2) {
return fromTo(new BlockPos(x, y, z), new BlockPos(x2, y2, z2));
}
public Selection fromTo(BlockPos pos1, BlockPos pos2) {
return cuboid(pos1, pos2.subtract(pos1));
}
public Selection column(int x, int z) {
return cuboid(new BlockPos(x, 1, z), new Vec3i(0, sceneBounds.getYSize(), 0));
}
public Selection layer(int y) {
return layers(y, 1);
}
public Selection layersFrom(int y) {
return layers(y, sceneBounds.getYSize() - y);
}
public Selection layers(int y, int height) {
return cuboid(new BlockPos(0, y, 0), new Vec3i(sceneBounds.getXSize(),
Math.min(sceneBounds.getYSize() - y, height) - 1, sceneBounds.getZSize()));
}
public Selection cuboid(BlockPos origin, Vec3i size) {
return Selection.of(new MutableBoundingBox(origin, origin.add(size)));
}
}
}

View file

@ -1,167 +0,0 @@
package com.simibubi.create.foundation.ponder;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Stream;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams;
import com.simibubi.create.foundation.utility.outliner.Outliner;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
public abstract class Select implements Predicate<BlockPos> {
public static Select cuboid(BlockPos origin, Vec3i size) {
return new Cuboid(origin, size);
}
public static Select pos(int x, int y, int z) {
return new Cuboid(new BlockPos(x, y, z), BlockPos.ZERO);
}
public static Select fromTo(int x, int y, int z, int x2, int y2, int z2) {
return new Cuboid(new BlockPos(x, y, z), new BlockPos(x2 - x, y2 - y, z2 - z));
}
public static Select everything(MutableBoundingBox bounds) {
return cuboid(BlockPos.ZERO, bounds.getLength());
}
public static Select compound(Select... other) {
return new Compound(other);
}
public static Select column(MutableBoundingBox bounds, int x, int z) {
return cuboid(new BlockPos(x, 1, z), new Vec3i(0, bounds.getYSize(), 0));
}
public static Select layer(MutableBoundingBox bounds, int y, int height) {
return cuboid(new BlockPos(0, y, 0),
new Vec3i(bounds.getXSize(), Math.min(bounds.getYSize() - y, height) - 1, bounds.getZSize()));
}
//
public WorldSectionElement asElement() {
return new WorldSectionElement(this);
}
//
@Override
public abstract int hashCode();
public abstract Stream<BlockPos> all();
public abstract Vec3d getCenter();
public abstract OutlineParams makeOutline(Outliner outliner);
private static class Compound extends Select {
private Select[] parts;
private int hash;
private Vec3d center;
private Set<BlockPos> cluster;
public Compound(Select... parts) {
this.parts = parts;
if (parts.length == 0)
throw new IllegalArgumentException("Cannot instantiate Compound Select with zero parts");
cluster = new HashSet<>();
parts[0].all()
.map(BlockPos::toImmutable)
.forEach(cluster::add);
hash = parts[0].hashCode();
center = parts[0].getCenter()
.scale(1f / parts.length);
for (int i = 1; i < parts.length; i++) {
Select select = parts[i];
select.all()
.map(BlockPos::toImmutable)
.forEach(cluster::add);
hash = hash ^ select.hashCode();
center = center.add(select.getCenter()
.scale(1f / parts.length));
}
}
@Override
public boolean test(BlockPos t) {
for (Select select : parts)
if (select.test(t))
return true;
return false;
}
@Override
public int hashCode() {
return hash;
}
@Override
public Stream<BlockPos> all() {
return cluster.stream();
}
@Override
public Vec3d getCenter() {
return center;
}
@Override
public OutlineParams makeOutline(Outliner outliner) {
return outliner.showCluster(this, cluster);
}
}
private static class Cuboid extends Select {
MutableBoundingBox bb;
Vec3i origin;
Vec3i size;
public Cuboid(BlockPos origin, Vec3i size) {
bb = new MutableBoundingBox(origin, origin.add(size));
this.origin = origin;
this.size = size;
}
@Override
public boolean test(BlockPos t) {
return bb.isVecInside(t);
}
@Override
public Stream<BlockPos> all() {
return BlockPos.func_229383_a_(bb);
}
@Override
public int hashCode() {
return origin.hashCode() ^ size.hashCode();
}
@Override
public Vec3d getCenter() {
return new AxisAlignedBB(new BlockPos(origin), new BlockPos(origin).add(size)
.add(1, 1, 1)).getCenter();
}
@Override
public OutlineParams makeOutline(Outliner outliner) {
return outliner.showAABB(this, new AxisAlignedBB(new BlockPos(origin), new BlockPos(origin).add(size)
.add(1, 1, 1)));
}
}
}

View file

@ -0,0 +1,155 @@
package com.simibubi.create.foundation.ponder;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams;
import com.simibubi.create.foundation.utility.outliner.Outliner;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec3d;
public abstract class Selection implements Predicate<BlockPos> {
public static Selection of(MutableBoundingBox bb) {
return new Simple(bb);
}
public abstract Selection add(Selection other);
public abstract Selection substract(Selection other);
public abstract Selection copy();
public abstract Vec3d getCenter();
public abstract void forEach(Consumer<BlockPos> callback);
public abstract OutlineParams makeOutline(Outliner outliner, Object slot);
public OutlineParams makeOutline(Outliner outliner) {
return makeOutline(outliner, this);
}
private static class Compound extends Selection {
Set<BlockPos> posSet;
Vec3d center;
public Compound(Simple initial) {
posSet = new HashSet<>();
add(initial);
}
private Compound(Set<BlockPos> template) {
posSet = new HashSet<>(template);
}
@Override
public boolean test(BlockPos t) {
return posSet.contains(t);
}
@Override
public Selection add(Selection other) {
other.forEach(p -> posSet.add(p.toImmutable()));
center = null;
return this;
}
@Override
public Selection substract(Selection other) {
other.forEach(p -> posSet.remove(p.toImmutable()));
center = null;
return this;
}
@Override
public void forEach(Consumer<BlockPos> callback) {
posSet.forEach(callback);
}
@Override
public OutlineParams makeOutline(Outliner outliner, Object slot) {
return outliner.showCluster(slot, posSet);
}
@Override
public Vec3d getCenter() {
return center == null ? center = evalCenter() : center;
}
private Vec3d evalCenter() {
Vec3d center = Vec3d.ZERO;
if (posSet.isEmpty())
return center;
for (BlockPos blockPos : posSet)
center = center.add(new Vec3d(blockPos));
center = center.scale(1f / posSet.size());
return center.add(new Vec3d(.5, .5, .5));
}
@Override
public Selection copy() {
return new Compound(posSet);
}
}
private static class Simple extends Selection {
private MutableBoundingBox bb;
private AxisAlignedBB aabb;
public Simple(MutableBoundingBox bb) {
this.bb = bb;
this.aabb = getAABB();
}
@Override
public boolean test(BlockPos t) {
return bb.isVecInside(t);
}
@Override
public Selection add(Selection other) {
return new Compound(this).add(other);
}
@Override
public Selection substract(Selection other) {
return new Compound(this).substract(other);
}
@Override
public void forEach(Consumer<BlockPos> callback) {
BlockPos.func_229383_a_(bb)
.forEach(callback);
}
@Override
public Vec3d getCenter() {
return aabb.getCenter();
}
@Override
public OutlineParams makeOutline(Outliner outliner, Object slot) {
return outliner.showAABB(slot, aabb);
}
private AxisAlignedBB getAABB() {
return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX + 1, bb.maxY + 1, bb.maxZ + 1);
}
@Override
public Selection copy() {
return new Simple(new MutableBoundingBox(bb));
}
}
}

View file

@ -6,13 +6,14 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel;
import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.ponder.PonderRegistry;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.PonderStoryBoard; import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter;
import com.simibubi.create.foundation.utility.Pointing; import com.simibubi.create.foundation.utility.Pointing;
import com.tterrag.registrate.util.entry.ItemEntry; import com.tterrag.registrate.util.entry.ItemEntry;
@ -22,273 +23,328 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.particles.ParticleTypes; import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
public abstract class DebugScenes extends PonderStoryBoard { public class DebugScenes {
private int index; private static int index;
public static void registerAll() { public static void registerAll() {
index = 1;
add(DebugScenes::coordinateScene);
add(DebugScenes::blocksScene);
add(DebugScenes::fluidsScene);
add(DebugScenes::offScreenScene);
add(DebugScenes::particleScene);
add(DebugScenes::controlsScene);
add(DebugScenes::birbScene);
add(DebugScenes::sectionsScene);
}
private static void add(PonderStoryBoard sb) {
ItemEntry<Item> item = AllItems.BRASS_HAND; ItemEntry<Item> item = AllItems.BRASS_HAND;
int i = 0; String schematicPath = "debug/scene_" + index;
PonderRegistry.addStoryBoard(item, new CoordinateScene(++i)); PonderRegistry.addStoryBoard(item, schematicPath, sb);
PonderRegistry.addStoryBoard(item, new BlocksScene(++i)); index++;
PonderRegistry.addStoryBoard(item, new FluidsScene(++i));
PonderRegistry.addStoryBoard(item, new OffScreenScene(++i));
PonderRegistry.addStoryBoard(item, new ParticlesScene(++i));
PonderRegistry.addStoryBoard(item, new ControlsScene(++i));
PonderRegistry.addStoryBoard(item, new BirbScene(++i));
} }
public DebugScenes(int index) { public static void coordinateScene(SceneBuilder scene, SceneBuildingUtil util) {
this.index = index; scene.title("Coordinate Space");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
Selection xAxis = util.select.fromTo(2, 1, 1, 4, 1, 1);
Selection yAxis = util.select.fromTo(1, 2, 1, 1, 4, 1);
Selection zAxis = util.select.fromTo(1, 1, 2, 1, 1, 4);
scene.idle(10);
scene.overlay.showSelectionWithText(PonderPalette.RED, xAxis, "x", "Das X axis", 20);
scene.idle(20);
scene.overlay.showSelectionWithText(PonderPalette.GREEN, yAxis, "y", "Das Y axis", 20);
scene.idle(20);
scene.overlay.showSelectionWithText(PonderPalette.BLUE, zAxis, "z", "Das Z axis", 20);
scene.idle(10);
} }
@Override public static void blocksScene(SceneBuilder scene, SceneBuildingUtil util) {
public final String getSchematicName() { scene.title("Changing Blocks");
return "debug/scene_" + index; scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.idle(10);
scene.overlay.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000);
scene.idle(20);
scene.world.replaceBlocks(util.select.fromTo(1, 1, 3, 2, 2, 4),
AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), true);
scene.idle(10);
scene.world.replaceBlocks(util.select.position(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState(), true);
scene.rotateCameraY(180);
scene.markAsFinished();
} }
@Override public static void fluidsScene(SceneBuilder scene, SceneBuildingUtil util) {
public String getStoryTitle() { scene.title("Showing Fluids");
return "Debug Scene " + index + (getTitle().isEmpty() ? "" : ": " + getTitle()); scene.showBasePlate();
} scene.idle(10);
Vec3d parrotPos = util.vector.topOf(1, 0, 1);
scene.special.birbLookingAtPOI(parrotPos);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.overlay.showTargetedText(WHITE, new Vec3d(1, 2.5, 4.5), "fluids", "Fluid rendering test.", 1000);
scene.markAsFinished();
protected String getTitle() { Object outlineSlot = new Object();
return "";
}
static class CoordinateScene extends DebugScenes { Vec3d vec1 = util.vector.topOf(1, 0, 0);
Vec3d vec2 = util.vector.topOf(0, 0, 1);
AxisAlignedBB boundingBox1 = new AxisAlignedBB(vec1, vec1).expand(0, 2.5, 0)
.grow(.15, 0, .15);
AxisAlignedBB boundingBox2 = new AxisAlignedBB(vec2, vec2).expand(0, .125, 0)
.grow(.45, 0, .45);
Vec3d poi1 = boundingBox1.getCenter();
Vec3d poi2 = boundingBox2.getCenter();
public CoordinateScene(int index) { for (int i = 0; i < 10; i++) {
super(index); scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, outlineSlot,
i % 2 == 0 ? boundingBox1 : boundingBox2, 15);
scene.idle(3);
scene.special.movePointOfInterest(i % 2 == 0 ? poi1 : poi2);
scene.idle(12);
} }
@Override scene.idle(12);
public void program(SceneBuilder scene, SceneBuildingUtil util) { scene.special.movePointOfInterest(util.grid.at(-4, 5, 4));
scene.showBasePlate(); scene.overlay.showTargetedText(PonderPalette.RED, parrotPos.add(-.25f, 0.25f, .25f), "wut", "dafuq?", 40);
scene.idle(10);
scene.showSection(util.layersFrom(1), Direction.DOWN);
scene.idle(10);
scene.showSelectionWithText(PonderPalette.RED, Select.fromTo(2, 1, 1, 4, 1, 1), "x", "Das X axis", 20);
scene.idle(20);
scene.showSelectionWithText(PonderPalette.GREEN, Select.fromTo(1, 2, 1, 1, 4, 1), "y", "Das Y axis", 20);
scene.idle(20);
scene.showSelectionWithText(PonderPalette.BLUE, Select.fromTo(1, 1, 2, 1, 1, 4), "z", "Das Z axis", 20);
scene.idle(10);
}
@Override
protected String getTitle() {
return "Coordinate Space";
}
} }
static class BlocksScene extends DebugScenes { public static void offScreenScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("Out of bounds / configureBasePlate");
scene.configureBasePlate(1, 0, 6);
scene.showBasePlate();
public BlocksScene(int index) { Selection out1 = util.select.fromTo(7, 0, 0, 8, 0, 5);
super(index); Selection out2 = util.select.fromTo(0, 0, 0, 0, 0, 5);
} Selection blocksExceptBasePlate = util.select.layersFrom(1)
.add(out1)
.add(out2);
@Override scene.idle(10);
public void program(SceneBuilder scene, SceneBuildingUtil util) { scene.world.showSection(blocksExceptBasePlate, Direction.DOWN);
scene.showBasePlate(); scene.idle(10);
scene.idle(10);
scene.showSection(util.layersFrom(1), Direction.DOWN);
scene.idle(10);
scene.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000);
scene.idle(20);
scene.replaceBlocks(Select.fromTo(1, 1, 3, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState());
scene.idle(10);
scene.replaceBlocks(Select.pos(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState());
scene.rotateCameraY(180);
scene.markAsFinished();
}
@Override scene.overlay.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds",
protected String getTitle() { "Blocks outside of the base plate do not affect scaling", 100);
return "Changing Blocks"; scene.overlay.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate",
} "configureBasePlate() makes sure of that.", 100);
scene.markAsFinished();
}
public static void particleScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("Emitting particles");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.idle(10);
Vec3d emitterPos = util.vector.at(2.5, 2.25, 2.5);
Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.at(0, .1, 0));
Emitter rotation =
Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'),
util.vector.at(0, .1, 0));
scene.overlay.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20);
scene.idle(30);
scene.effects.emitParticles(emitterPos, emitter, 1, 60);
scene.effects.emitParticles(emitterPos, rotation, 20, 1);
scene.idle(30);
scene.rotateCameraY(180);
}
public static void controlsScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("Basic player interaction");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layer(1), Direction.DOWN);
scene.idle(4);
scene.world.showSection(util.select.layer(2), Direction.DOWN);
scene.idle(4);
scene.world.showSection(util.select.layer(3), Direction.DOWN);
scene.idle(10);
BlockPos shaftPos = util.grid.at(3, 1, 1);
Selection shaftSelection = util.select.position(shaftPos);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftPos), Pointing.DOWN).rightClick()
.whileSneaking()
.withWrench(), 40);
scene.idle(20);
scene.world.replaceBlocks(shaftSelection, AllBlocks.SHAFT.getDefaultState(), true);
scene.idle(20);
scene.world.hideSection(shaftSelection, Direction.UP);
scene.idle(20);
scene.overlay.showControls(new InputWindowElement(util.vector.at(1, 4.5, 3.5), Pointing.LEFT).rightClick()
.withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20);
scene.world.showSection(util.select.layer(4), Direction.DOWN);
scene.idle(40);
BlockPos chassis = util.grid.at(1, 1, 3);
Vec3d chassisSurface = util.vector.blockSurface(chassis, Direction.NORTH);
Object chassisValueBoxHighlight = new Object();
Object chassisEffectHighlight = new Object();
AxisAlignedBB point = new AxisAlignedBB(chassisSurface, chassisSurface);
AxisAlignedBB expanded = point.grow(1 / 4f, 1 / 4f, 1 / 16f);
Selection singleBlock = util.select.position(1, 2, 3);
Selection twoBlocks = util.select.fromTo(1, 2, 3, 1, 3, 3);
Selection threeBlocks = util.select.fromTo(1, 2, 3, 1, 4, 3);
Selection singleRow = util.select.fromTo(1, 2, 3, 3, 2, 3);
Selection twoRows = util.select.fromTo(1, 2, 3, 3, 3, 3);
Selection threeRows = twoRows.copy()
.add(threeBlocks);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, expanded, 120);
scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).scroll()
.withWrench(), 40);
PonderPalette white = PonderPalette.WHITE;
scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, threeBlocks, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10);
scene.idle(10);
scene.idle(30);
scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).whileCTRL()
.scroll()
.withWrench(), 40);
scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, threeRows, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10);
scene.idle(10);
scene.markAsFinished();
}
public static void birbScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("Birbs");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.idle(10);
BlockPos pos = new BlockPos(1, 2, 3);
scene.special.birbOnSpinnyShaft(pos);
scene.overlay.showTargetedText(PonderPalette.GREEN, util.vector.topOf(pos), "birbs_interesting",
"More birbs = More interesting", 100);
scene.idle(10);
scene.special.birbPartying(util.vector.topOf(0, 1, 2));
scene.idle(10);
scene.special.birbLookingAtPOI(util.vector.centerOf(3, 1, 3)
.add(0, 0.25f, 0));
scene.idle(20);
BlockPos poi1 = util.grid.at(4, 1, 0);
BlockPos poi2 = util.grid.at(0, 1, 4);
scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.getDefaultState());
scene.special.movePointOfInterest(poi1);
scene.idle(20);
scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.getDefaultState());
scene.special.movePointOfInterest(poi2);
scene.overlay.showTargetedText(PonderPalette.FAST, util.vector.centerOf(poi2), "poi", "Point of Interest", 20);
scene.idle(20);
scene.world.setBlock(poi1, Blocks.AIR.getDefaultState());
scene.special.movePointOfInterest(poi1);
scene.idle(20);
scene.world.setBlock(poi2, Blocks.AIR.getDefaultState());
scene.special.movePointOfInterest(poi2);
}
public static void sectionsScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("Sections");
scene.showBasePlate();
scene.idle(10);
scene.rotateCameraY(95);
BlockPos mergePos = util.grid.at(1, 1, 1);
BlockPos independentPos = util.grid.at(3, 1, 1);
Selection toMerge = util.select.position(mergePos);
Selection independent = util.select.position(independentPos);
Selection start = util.select.layersFrom(1)
.substract(toMerge)
.substract(independent);
scene.world.showSection(start, Direction.DOWN);
scene.idle(20);
scene.world.showSection(toMerge, Direction.DOWN);
ElementLink<WorldSectionElement> link = scene.world.showIndependentSection(independent, Direction.DOWN);
scene.idle(20);
scene.overlay.showTargetedText(PonderPalette.GREEN, util.vector.topOf(mergePos), "merged",
"This Section got merged to base.", 40);
scene.idle(10);
scene.overlay.showTargetedText(PonderPalette.RED, util.vector.topOf(independentPos), "independent",
"This Section renders independently.", 40);
scene.idle(40);
scene.world.hideIndependentSection(link, Direction.DOWN);
scene.world.hideSection(util.select.fromTo(mergePos, util.grid.at(1, 1, 4)), Direction.DOWN);
scene.idle(20);
Selection hiddenReplaceArea = util.select.fromTo(2, 1, 2, 4, 1, 4)
.substract(util.select.position(4, 1, 3))
.substract(util.select.position(2, 1, 3));
scene.world.hideSection(hiddenReplaceArea, Direction.UP);
scene.idle(20);
scene.world.setBlocks(hiddenReplaceArea, AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), false);
scene.world.showSection(hiddenReplaceArea, Direction.DOWN);
scene.idle(20);
scene.overlay.showSelectionWithText(PonderPalette.BLUE, hiddenReplaceArea, "seamless",
"Seamless substitution of blocks", 30);
scene.idle(40);
ElementLink<WorldSectionElement> helicopter = scene.world.makeSectionIndependent(hiddenReplaceArea);
scene.world.rotateSection(helicopter, 50, 5 * 360, 0, 60);
scene.world.moveSection(helicopter, util.vector.at(0, 4, 5), 50);
scene.overlay.showText(PonderPalette.BLUE, 30, "blast_off", "Up, up and away.", 30);
scene.idle(40);
scene.world.hideIndependentSection(helicopter, Direction.UP);
} }
static class FluidsScene extends DebugScenes {
public FluidsScene(int index) {
super(index);
}
@Override
public void program(SceneBuilder scene, SceneBuildingUtil util) {
scene.showBasePlate();
scene.idle(10);
scene.showSection(util.layersFrom(1), Direction.DOWN);
scene.showTargetedText(WHITE, new Vec3d(1, 2.5, 4.5), "fluids", "Fluid rendering test.", 1000);
scene.markAsFinished();
}
@Override
protected String getTitle() {
return "Showing Fluids";
}
}
static class OffScreenScene extends DebugScenes {
public OffScreenScene(int index) {
super(index);
}
@Override
public void program(SceneBuilder scene, SceneBuildingUtil util) {
scene.configureBasePlate(1, 0, 6);
scene.showBasePlate();
Select out1 = Select.fromTo(7, 0, 0, 8, 0, 5);
Select out2 = Select.fromTo(0, 0, 0, 0, 0, 5);
scene.idle(10);
scene.showSection(Select.compound(util.layersFrom(1), out1, out2), Direction.DOWN);
scene.idle(10);
scene.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds",
"Blocks outside of the base plate do not affect scaling", 100);
scene.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate",
"configureBasePlate() makes sure of that.", 100);
scene.markAsFinished();
}
@Override
protected String getTitle() {
return "Out of bounds / configureBasePlate";
}
}
static class ParticlesScene extends DebugScenes {
public ParticlesScene(int index) {
super(index);
}
@Override
public void program(SceneBuilder scene, SceneBuildingUtil util) {
scene.showBasePlate();
scene.idle(10);
scene.showSection(util.layersFrom(1), Direction.DOWN);
scene.idle(10);
Vec3d emitterPos = util.vector(2.5, 2.25, 2.5);
Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector(0, .1, 0));
Emitter rotation =
Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'),
util.vector(0, .1, 0));
scene.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20);
scene.idle(30);
scene.addInstruction(new EmitParticlesInstruction(emitterPos, emitter, 1, 60));
scene.addInstruction(new EmitParticlesInstruction(emitterPos, rotation, 20, 1));
scene.idle(30);
scene.rotateCameraY(180);
}
@Override
protected String getTitle() {
return "Emitting particles";
}
}
static class ControlsScene extends DebugScenes {
public ControlsScene(int index) {
super(index);
}
@Override
public void program(SceneBuilder scene, SceneBuildingUtil util) {
scene.showBasePlate();
scene.idle(10);
scene.showSection(util.layer(1), Direction.DOWN);
scene.idle(4);
scene.showSection(util.layer(2), Direction.DOWN);
scene.idle(4);
scene.showSection(util.layer(3), Direction.DOWN);
scene.idle(10);
scene.showControls(new InputWindowElement(util.topOf(3, 1, 1), Pointing.DOWN).rightClick()
.whileSneaking()
.withWrench(), 40);
scene.idle(8);
scene.replaceBlocks(Select.pos(3, 1, 1), AllBlocks.SHAFT.getDefaultState());
scene.idle(20);
scene.showControls(new InputWindowElement(new Vec3d(1, 4.5, 3.5), Pointing.LEFT).rightClick()
.withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20);
scene.idle(4);
scene.showSection(util.layer(4), Direction.DOWN);
scene.idle(8);
scene.showControls(new InputWindowElement(new Vec3d(2.5, 1.5, 3), Pointing.UP).whileCTRL()
.scroll()
.withWrench(), 40);
}
@Override
protected String getTitle() {
return "Basic player interaction";
}
}
static class BirbScene extends DebugScenes {
public BirbScene(int index) {
super(index);
}
@Override
public void program(SceneBuilder scene, SceneBuildingUtil util) {
scene.showBasePlate();
scene.idle(10);
scene.showSection(util.layersFrom(1), Direction.DOWN);
scene.idle(10);
BlockPos pos = new BlockPos(1, 2, 3);
scene.birbOnSpinnyShaft(pos);
scene.showTargetedText(PonderPalette.GREEN, util.topOf(1, 2, 3), "birbs_interesting",
"More birbs = More interesting", 100);
scene.idle(10);
scene.birbPartying(util.topOf(0, 1, 2));
scene.idle(10);
scene.movePOI(Vec3d.ZERO);
scene.birbLookingAtPOI(util.centerOf(3, 1, 3)
.add(0, 0.25f, 0));
scene.idle(20);
scene.replaceBlocks(Select.pos(4, 1, 0), Blocks.GOLD_BLOCK.getDefaultState());
scene.movePOI(util.centerOf(4, 1, 0));
scene.idle(20);
scene.replaceBlocks(Select.pos(0, 1, 4), Blocks.GOLD_BLOCK.getDefaultState());
scene.movePOI(util.centerOf(0, 1, 4));
scene.showTargetedText(PonderPalette.FAST, util.centerOf(0, 1, 4), "poi", "Point of Interest", 20);
scene.idle(20);
scene.replaceBlocks(Select.pos(4, 1, 0), Blocks.AIR.getDefaultState());
scene.movePOI(util.centerOf(4, 1, 0));
scene.idle(20);
scene.replaceBlocks(Select.pos(0, 1, 4), Blocks.AIR.getDefaultState());
scene.movePOI(util.centerOf(0, 1, 4));
}
@Override
protected String getTitle() {
return "Birbs";
}
}
} }

View file

@ -0,0 +1,99 @@
package com.simibubi.create.foundation.ponder.content;
import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.utility.Pointing;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3i;
public class KineticsScenes {
public static void template(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("This is a template");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
}
//
public static void shaftAsRelay(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("Relaying rotational force using Shafts");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
BlockPos gaugePos = util.grid.at(0, 1, 2);
Selection gauge = util.select.position(gaugePos);
scene.world.showSection(gauge, Direction.UP);
scene.world.setKineticSpeed(gauge, 0);
scene.idle(5);
scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN);
scene.idle(10);
for (int i = 4; i >= 1; i--) {
if (i == 2)
scene.rotateCameraY(70);
scene.idle(5);
scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN);
}
scene.world.setKineticSpeed(gauge, 64);
scene.effects.indicateSuccess(gaugePos);
scene.idle(10);
scene.overlay.showTargetedText(WHITE, util.vector.at(3, 1.5, 2.5), "shaft_relay",
"Shafts will relay rotation in a straight line.", 1000);
scene.idle(20);
scene.markAsFinished();
}
public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("Encasing Shafts");
scene.showBasePlate();
Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(4, 0, 2));
Selection andesite = util.select.position(3, 1, 2);
Selection brass = util.select.position(1, 1, 2);
scene.world.showSection(shaft, Direction.DOWN);
scene.idle(20);
BlockEntry<EncasedShaftBlock> andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT;
ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack();
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 1, 2), Pointing.DOWN).rightClick()
.withItem(andesiteCasingItem), 60);
scene.idle(7);
scene.world.setBlocks(andesite, andesiteEncased.getDefaultState()
.with(EncasedShaftBlock.AXIS, Axis.X), true);
scene.world.setKineticSpeed(shaft, -112);
scene.idle(10);
BlockEntry<EncasedShaftBlock> brassEncased = AllBlocks.BRASS_ENCASED_SHAFT;
ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack();
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(1, 0, 2), Pointing.UP).rightClick()
.withItem(brassCasingItem), 60);
scene.idle(7);
scene.world.setBlocks(brass, brassEncased.getDefaultState()
.with(EncasedShaftBlock.AXIS, Axis.X), true);
scene.world.setKineticSpeed(shaft, -112);
scene.idle(10);
scene.overlay.showTargetedText(WHITE, util.vector.at(1.5, 2, 2.5), "shaft_can_be_encased",
"Andesite or Brass Casing can be used to encase them.", 1000);
}
}

View file

@ -4,20 +4,19 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.ponder.PonderRegistry;
public class PonderIndex { public class PonderIndex {
/**
* When true, lang files are bypassed and any text in ponder can be hot-swapped
* without the need of runData
*/
public static final boolean EDITOR_MODE = true; public static final boolean EDITOR_MODE = true;
public static void register() { public static void register() {
// Register storyboards here (Requires re-launch) // Register storyboards here (Changes require re-launch)
PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftAsRelay()); PonderRegistry.forComponent(AllBlocks.SHAFT)
PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftsCanBeEncased()); .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay)
.addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased);
DebugScenes.registerAll(); // Debug scenes, can be found in game via the Brass Hand
if (EDITOR_MODE)
DebugScenes.registerAll();
} }
} }

View file

@ -1,57 +0,0 @@
package com.simibubi.create.foundation.ponder.content;
import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.PonderStoryBoard;
import com.simibubi.create.foundation.ponder.Select;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
class ShaftAsRelay extends PonderStoryBoard {
@Override
public String getSchematicName() {
return "shaft/shaft";
}
@Override
public String getStoryTitle() {
return "Relaying rotational force using Shafts";
}
@Override
public void program(SceneBuilder scene, SceneBuildingUtil util) {
scene.configureBasePlate(0, 0, 5);
scene.showSection(util.layer(0), Direction.UP);
Select gauge = Select.pos(0, 1, 2);
scene.showSection(gauge, Direction.UP);
scene.setKineticSpeed(gauge, 0);
scene.idle(5);
scene.showSection(Select.pos(5, 1, 2), Direction.DOWN);
scene.idle(10);
for (int i = 4; i >= 1; i--) {
if (i == 2)
scene.rotateCameraY(70);
scene.idle(5);
scene.showSection(Select.pos(i, 1, 2), Direction.DOWN);
}
scene.setKineticSpeed(gauge, 64);
scene.indicateSuccess(new BlockPos(0, 1, 2));
scene.idle(10);
scene.showTargetedText(WHITE, new Vec3d(3, 1.5, 2.5), "shaft_relay",
"Shafts will relay rotation in a straight line.", 1000);
scene.idle(20);
scene.markAsFinished();
}
}

View file

@ -1,66 +0,0 @@
package com.simibubi.create.foundation.ponder.content;
import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder;
import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.PonderStoryBoard;
import com.simibubi.create.foundation.ponder.Select;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.utility.Pointing;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
class ShaftsCanBeEncased extends PonderStoryBoard {
@Override
public String getSchematicName() {
return "shaft/encasing_shafts";
}
@Override
public String getStoryTitle() {
return "Encasing Shafts";
}
@Override
public void program(SceneBuilder scene, SceneBuildingUtil util) {
scene.showBasePlate();
Select shaft = Select.cuboid(new BlockPos(0, 1, 2), new Vec3i(4, 0, 2));
Select andesite = Select.pos(3, 1, 2);
Select brass = Select.pos(1, 1, 2);
scene.showSection(shaft, Direction.DOWN);
scene.idle(20);
BlockEntry<EncasedShaftBlock> andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT;
scene.showControls(new InputWindowElement(util.topOf(3, 1, 2), Pointing.DOWN).rightClick()
.withItem(AllBlocks.ANDESITE_CASING.asStack()), 60);
scene.idle(7);
scene.setBlocks(andesite, andesiteEncased.getDefaultState()
.with(EncasedShaftBlock.AXIS, Axis.X));
scene.setKineticSpeed(shaft, -112);
scene.idle(10);
BlockEntry<EncasedShaftBlock> brassEncased = AllBlocks.BRASS_ENCASED_SHAFT;
scene.showControls(new InputWindowElement(util.topOf(1, 0, 2), Pointing.UP).rightClick()
.withItem(AllBlocks.BRASS_CASING.asStack()), 60);
scene.idle(7);
scene.setBlocks(brass, brassEncased.getDefaultState()
.with(EncasedShaftBlock.AXIS, Axis.X));
scene.setKineticSpeed(shaft, -112);
scene.idle(10);
scene.showTargetedText(WHITE, new Vec3d(1.5, 2, 2.5), "shaft_can_be_encased",
"Andesite or Brass Casing can be used to encase them.", 1000);
}
}

View file

@ -8,6 +8,7 @@ import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.client.Minecraft; 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.Vec3d; import net.minecraft.util.math.Vec3d;
public abstract class AnimatedSceneElement extends PonderSceneElement { public abstract class AnimatedSceneElement extends PonderSceneElement {
@ -20,6 +21,10 @@ public abstract class AnimatedSceneElement extends PonderSceneElement {
.startWithValue(0); .startWithValue(0);
} }
public void forceApplyFade(float fade) {
this.fade.startWithValue(fade);
}
public void setFade(float fade) { public void setFade(float fade) {
this.fade.setValue(fade); this.fade.setValue(fade);
} }
@ -71,7 +76,7 @@ public abstract class AnimatedSceneElement extends PonderSceneElement {
protected int lightCoordsFromFade(float fade) { protected int lightCoordsFromFade(float fade) {
int light = 0xF000F0; int light = 0xF000F0;
if (fade != 1) { if (fade != 1) {
light = (int) (0xF * fade); light = (int) (MathHelper.lerp(fade, 5, 0xF));
light = light << 4 | light << 20; light = light << 4 | light << 20;
} }
return light; return light;

View file

@ -2,7 +2,6 @@ package com.simibubi.create.foundation.ponder.elements;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Random; import java.util.Random;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@ -12,11 +11,14 @@ import com.mojang.blaze3d.matrix.MatrixStack;
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;
import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.render.Compartment; 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.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -34,6 +36,7 @@ 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.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
@ -42,18 +45,99 @@ public class WorldSectionElement extends AnimatedSceneElement {
public static final Compartment<Pair<Integer, Integer>> DOC_WORLD_SECTION = new Compartment<>(); public static final Compartment<Pair<Integer, Integer>> DOC_WORLD_SECTION = new Compartment<>();
List<TileEntity> renderedTileEntities; List<TileEntity> renderedTileEntities;
Select section; Selection section;
boolean redraw; boolean redraw;
public WorldSectionElement(Select section) { Vec3d prevAnimatedOffset = Vec3d.ZERO;
this.section = section; Vec3d animatedOffset = Vec3d.ZERO;
Vec3d prevAnimatedRotation = Vec3d.ZERO;
Vec3d animatedRotation = Vec3d.ZERO;
Vec3d centerOfRotation = Vec3d.ZERO;
public WorldSectionElement() {}
public WorldSectionElement(Selection section) {
this.section = section.copy();
centerOfRotation = section.getCenter();
} }
public void queueRedraw(PonderWorld world) { public void mergeOnto(WorldSectionElement other) {
setVisible(false);
if (other.isEmpty())
other.set(section);
else
other.add(section);
}
public void set(Selection selection) {
applyNewSelection(selection.copy());
}
public void add(Selection toAdd) {
applyNewSelection(this.section.add(toAdd));
}
public void erase(Selection toErase) {
applyNewSelection(this.section.substract(toErase));
}
private void applyNewSelection(Selection selection) {
this.section = selection;
centerOfRotation = this.section.getCenter();
queueRedraw();
}
@Override
public void reset(PonderScene scene) {
super.reset(scene);
resetAnimatedTransform();
}
public void resetAnimatedTransform() {
prevAnimatedOffset = Vec3d.ZERO;
animatedOffset = Vec3d.ZERO;
prevAnimatedRotation = Vec3d.ZERO;
animatedRotation = Vec3d.ZERO;
}
public void queueRedraw() {
redraw = true; redraw = true;
} }
public boolean isEmpty() {
return section == null;
}
public void setEmpty() {
section = null;
}
public void setAnimatedRotation(Vec3d eulerAngles) {
this.animatedRotation = eulerAngles;
}
public Vec3d getAnimatedRotation() {
return animatedRotation;
}
public void setAnimatedOffset(Vec3d offset) {
this.animatedOffset = offset;
}
public Vec3d getAnimatedOffset() {
return animatedOffset;
}
@Override
public boolean isVisible() {
return super.isVisible() && !isEmpty();
}
public void tick(PonderScene scene) { public void tick(PonderScene scene) {
prevAnimatedOffset = animatedOffset;
prevAnimatedRotation = animatedRotation;
if (!isVisible())
return;
if (renderedTileEntities == null) if (renderedTileEntities == null)
return; return;
renderedTileEntities.forEach(te -> { renderedTileEntities.forEach(te -> {
@ -65,6 +149,19 @@ 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 = 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);
renderStructure(world, ms, buffer, type, fade); renderStructure(world, ms, buffer, type, fade);
} }
@ -99,7 +196,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
contraptionBuffer.light(light) contraptionBuffer.light(light)
.renderInto(ms, buffer.getBuffer(type)); .renderInto(ms, buffer.getBuffer(type));
} }
@Override @Override
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {
redraw = false; redraw = false;
@ -108,10 +205,11 @@ public class WorldSectionElement extends AnimatedSceneElement {
private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) {
if (renderedTileEntities == null) { if (renderedTileEntities == null) {
renderedTileEntities = new ArrayList<>(); renderedTileEntities = new ArrayList<>();
section.all() section.forEach(pos -> {
.map(world::getTileEntity) TileEntity tileEntity = world.getTileEntity(pos);
.filter(Objects::nonNull) if (tileEntity != null)
.forEach(renderedTileEntities::add); renderedTileEntities.add(tileEntity);
});
} else } else
renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te);
@ -129,24 +227,23 @@ public class WorldSectionElement extends AnimatedSceneElement {
builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
world.setMask(this.section); world.setMask(this.section);
section.all() section.forEach(pos -> {
.forEach(pos -> { BlockState state = world.getBlockState(pos);
BlockState state = world.getBlockState(pos); IFluidState ifluidstate = world.getFluidState(pos);
IFluidState ifluidstate = world.getFluidState(pos);
ms.push(); ms.push();
ms.translate(pos.getX(), pos.getY(), pos.getZ()); ms.translate(pos.getX(), pos.getY(), pos.getZ());
if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR
&& RenderTypeLookup.canRenderInLayer(state, layer)) && RenderTypeLookup.canRenderInLayer(state, layer))
blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true,
random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE);
if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer))
dispatcher.renderFluid(pos, world, builder, ifluidstate); dispatcher.renderFluid(pos, world, builder, ifluidstate);
ms.pop(); ms.pop();
}); });
world.clearMask(); world.clearMask();
builder.finishDrawing(); builder.finishDrawing();

View file

@ -0,0 +1,68 @@
package com.simibubi.create.foundation.ponder.instructions;
import java.util.function.BiConsumer;
import java.util.function.Function;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import net.minecraft.util.math.Vec3d;
public class AnimateWorldSectionInstruction extends TickingInstruction {
protected Vec3d deltaPerTick;
protected Vec3d totalDelta;
protected Vec3d target;
protected ElementLink<WorldSectionElement> link;
protected WorldSectionElement element;
private BiConsumer<WorldSectionElement, Vec3d> setter;
private Function<WorldSectionElement, Vec3d> getter;
public static AnimateWorldSectionInstruction rotate(ElementLink<WorldSectionElement> link, Vec3d rotation,
int ticks) {
return new AnimateWorldSectionInstruction(link, rotation, ticks, WorldSectionElement::setAnimatedRotation,
WorldSectionElement::getAnimatedRotation);
}
public static AnimateWorldSectionInstruction move(ElementLink<WorldSectionElement> link, Vec3d offset, int ticks) {
return new AnimateWorldSectionInstruction(link, offset, ticks, WorldSectionElement::setAnimatedOffset,
WorldSectionElement::getAnimatedOffset);
}
protected AnimateWorldSectionInstruction(ElementLink<WorldSectionElement> link, Vec3d totalDelta, int ticks,
BiConsumer<WorldSectionElement, Vec3d> setter, Function<WorldSectionElement, Vec3d> getter) {
super(false, ticks);
this.link = link;
this.setter = setter;
this.getter = getter;
this.deltaPerTick = totalDelta.scale(1d / ticks);
this.totalDelta = totalDelta;
this.target = totalDelta;
}
@Override
protected final void firstTick(PonderScene scene) {
super.firstTick(scene);
element = scene.resolve(link);
if (element == null)
return;
target = getter.apply(element)
.add(totalDelta);
}
@Override
public void tick(PonderScene scene) {
super.tick(scene);
if (element == null)
return;
if (remainingTicks == 0) {
setter.accept(element, target);
return;
}
setter.accept(element, getter.apply(element)
.add(deltaPerTick));
}
}

View file

@ -0,0 +1,30 @@
package com.simibubi.create.foundation.ponder.instructions;
import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.content.PonderPalette;
import net.minecraft.util.math.AxisAlignedBB;
public class ChaseAABBInstruction extends TickingInstruction {
private AxisAlignedBB bb;
private Object slot;
private PonderPalette color;
public ChaseAABBInstruction(PonderPalette color, Object slot, AxisAlignedBB bb, int ticks) {
super(false, ticks);
this.color = color;
this.slot = slot;
this.bb = bb;
}
@Override
public void tick(PonderScene scene) {
super.tick(scene);
scene.getOutliner()
.chaseAABB(slot, bb)
.lineWidth(1 / 16f)
.colored(color.getColor());
}
}

View file

@ -9,5 +9,10 @@ public class CreateParrotInstruction extends FadeIntoSceneInstruction<ParrotElem
public CreateParrotInstruction(int fadeInTicks, Direction fadeInFrom, ParrotElement element) { public CreateParrotInstruction(int fadeInTicks, Direction fadeInFrom, ParrotElement element) {
super(fadeInTicks, fadeInFrom, element); super(fadeInTicks, fadeInFrom, element);
} }
@Override
protected Class<ParrotElement> getElementClass() {
return ParrotElement.class;
}
} }

View file

@ -1,13 +1,42 @@
package com.simibubi.create.foundation.ponder.instructions; package com.simibubi.create.foundation.ponder.instructions;
import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction<WorldSectionElement> { public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction<WorldSectionElement> {
public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, WorldSectionElement element) { private Selection initialSelection;
super(fadeInTicks, fadeInFrom, element); private boolean mergeToBase;
public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, boolean mergeToBase) {
super(fadeInTicks, fadeInFrom, new WorldSectionElement(selection));
initialSelection = selection;
this.mergeToBase = mergeToBase;
}
@Override
protected void firstTick(PonderScene scene) {
super.firstTick(scene);
element.set(initialSelection);
element.setVisible(true);
}
@Override
public void tick(PonderScene scene) {
super.tick(scene);
if (remainingTicks > 0)
return;
if (!mergeToBase)
return;
element.mergeOnto(scene.getBaseWorldSection());
} }
@Override
protected Class<WorldSectionElement> getElementClass() {
return WorldSectionElement.class;
}
} }

View file

@ -1,21 +1,25 @@
package com.simibubi.create.foundation.ponder.instructions; package com.simibubi.create.foundation.ponder.instructions;
import java.util.UUID;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
public class FadeIntoSceneInstruction<T extends AnimatedSceneElement> extends TickingInstruction { public abstract class FadeIntoSceneInstruction<T extends AnimatedSceneElement> extends TickingInstruction {
private Direction fadeInFrom; private Direction fadeInFrom;
private T element; protected T element;
private ElementLink<T> elementLink;
public FadeIntoSceneInstruction(int fadeInTicks, Direction fadeInFrom, T element) { public FadeIntoSceneInstruction(int fadeInTicks, Direction fadeInFrom, T element) {
super(false, fadeInTicks); super(false, fadeInTicks);
this.fadeInFrom = fadeInFrom; this.fadeInFrom = fadeInFrom;
this.element = element; this.element = element;
} }
@Override @Override
protected void firstTick(PonderScene scene) { protected void firstTick(PonderScene scene) {
@ -23,6 +27,8 @@ public class FadeIntoSceneInstruction<T extends AnimatedSceneElement> extends Ti
scene.addElement(element); scene.addElement(element);
element.setFade(0); element.setFade(0);
element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f));
if (elementLink != null)
scene.linkElement(element, elementLink);
} }
@Override @Override
@ -34,4 +40,12 @@ public class FadeIntoSceneInstruction<T extends AnimatedSceneElement> extends Ti
element.setFade(1); element.setFade(1);
} }
public ElementLink<T> createLink(PonderScene scene) {
elementLink = new ElementLink<>(getElementClass(), UUID.randomUUID());
scene.linkElement(element, elementLink);
return elementLink;
}
protected abstract Class<T> getElementClass();
} }

View file

@ -0,0 +1,46 @@
package com.simibubi.create.foundation.ponder.instructions;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement;
import net.minecraft.util.Direction;
import net.minecraft.util.math.Vec3d;
public class FadeOutOfSceneInstruction<T extends AnimatedSceneElement> extends TickingInstruction {
private Direction fadeOutTo;
private ElementLink<T> link;
private T element;
public FadeOutOfSceneInstruction(int fadeOutTicks, Direction fadeOutTo, ElementLink<T> link) {
super(false, fadeOutTicks);
this.fadeOutTo = fadeOutTo.getOpposite();
this.link = link;
}
@Override
protected void firstTick(PonderScene scene) {
super.firstTick(scene);
element = scene.resolve(link);
if (element == null)
return;
element.setVisible(true);
element.setFade(1);
element.setFadeVec(new Vec3d(fadeOutTo.getDirectionVec()).scale(.5f));
}
@Override
public void tick(PonderScene scene) {
super.tick(scene);
if (element == null)
return;
float fade = (remainingTicks / (float) totalTicks);
element.setFade(1 - (1 - fade) * (1 - fade));
if (remainingTicks == 0) {
element.setVisible(false);
element.setFade(0);
}
}
}

View file

@ -12,7 +12,7 @@ public class MarkAsFinishedInstruction extends PonderInstruction {
@Override @Override
public void tick(PonderScene scene) { public void tick(PonderScene scene) {
scene.finished = true; scene.setFinished(true);
} }
} }

View file

@ -0,0 +1,28 @@
package com.simibubi.create.foundation.ponder.instructions;
import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.content.PonderPalette;
public class OutlineSelectionInstruction extends TickingInstruction {
private PonderPalette color;
private Object slot;
private Selection selection;
public OutlineSelectionInstruction(PonderPalette color, Object slot, Selection selection, int ticks) {
super(false, ticks);
this.color = color;
this.slot = slot;
this.selection = selection;
}
@Override
public void tick(PonderScene scene) {
super.tick(scene);
selection.makeOutline(scene.getOutliner(), slot)
.lineWidth(1 / 16f)
.colored(color.getColor());
}
}

View file

@ -2,7 +2,7 @@ package com.simibubi.create.foundation.ponder.instructions;
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;
import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.ponder.Selection;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@ -11,27 +11,30 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction {
private BlockState stateToUse; private BlockState stateToUse;
private boolean replaceAir; private boolean replaceAir;
private boolean spawnParticles;
public ReplaceBlocksInstruction(Select selection, BlockState stateToUse, boolean replaceAir) { public ReplaceBlocksInstruction(Selection selection, BlockState stateToUse, boolean replaceAir,
boolean spawnParticles) {
super(selection); super(selection);
this.stateToUse = stateToUse; this.stateToUse = stateToUse;
this.replaceAir = replaceAir; this.replaceAir = replaceAir;
this.spawnParticles = spawnParticles;
} }
@Override @Override
protected void runModification(Select selection, PonderScene scene) { protected void runModification(Selection selection, PonderScene scene) {
PonderWorld world = scene.getWorld(); PonderWorld world = scene.getWorld();
selection.all() selection.forEach(pos -> {
.forEach(pos -> { if (!world.getBounds()
if (!world.getBounds() .isVecInside(pos))
.isVecInside(pos)) return;
return; BlockState prevState = world.getBlockState(pos);
BlockState prevState = world.getBlockState(pos); if (!replaceAir && prevState == Blocks.AIR.getDefaultState())
if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) return;
return; if (spawnParticles)
world.addBlockDestroyEffects(pos, prevState); world.addBlockDestroyEffects(pos, prevState);
world.setBlockState(pos, stateToUse); world.setBlockState(pos, stateToUse);
}); });
} }
@Override @Override

View file

@ -2,14 +2,13 @@ package com.simibubi.create.foundation.ponder.instructions;
import com.simibubi.create.foundation.ponder.PonderInstruction; import com.simibubi.create.foundation.ponder.PonderInstruction;
import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
public class ShowCompleteSchematicInstruction extends PonderInstruction { public class ShowCompleteSchematicInstruction extends PonderInstruction {
@Override @Override
public void tick(PonderScene scene) { public void tick(PonderScene scene) {
scene.addElement(Select.everything(scene.getBounds()) scene.addElement(new WorldSectionElement(scene.getSceneBuildingUtil().select.everywhere()));
.asElement());
} }
@Override @Override

View file

@ -3,7 +3,7 @@ package com.simibubi.create.foundation.ponder.instructions;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.OutlinerElement; import com.simibubi.create.foundation.ponder.elements.OutlinerElement;
import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.TextWindowElement;
@ -18,7 +18,7 @@ public class TextInstruction extends FadeInOutInstruction {
super(duration); super(duration);
} }
public TextInstruction(int color, Supplier<String> text, int duration, Select selection) { public TextInstruction(int color, Supplier<String> text, int duration, Selection selection) {
this(color, text, duration); this(color, text, duration);
element = new TextWindowElement(text).pointAt(selection.getCenter()); element = new TextWindowElement(text).pointAt(selection.getCenter());
element.colored(color); element.colored(color);

View file

@ -4,7 +4,7 @@ import java.util.function.UnaryOperator;
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;
import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import com.simibubi.create.foundation.tileEntity.SyncedTileEntity;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
@ -16,7 +16,7 @@ public class TileEntityDataInstruction extends WorldModifyInstruction {
private UnaryOperator<CompoundNBT> data; private UnaryOperator<CompoundNBT> data;
private Class<? extends TileEntity> type; private Class<? extends TileEntity> type;
public TileEntityDataInstruction(Select selection, Class<? extends TileEntity> type, public TileEntityDataInstruction(Selection selection, Class<? extends TileEntity> type,
UnaryOperator<CompoundNBT> data, boolean redraw) { UnaryOperator<CompoundNBT> data, boolean redraw) {
super(selection); super(selection);
this.type = type; this.type = type;
@ -25,21 +25,20 @@ public class TileEntityDataInstruction extends WorldModifyInstruction {
} }
@Override @Override
protected void runModification(Select selection, PonderScene scene) { protected void runModification(Selection selection, PonderScene scene) {
PonderWorld world = scene.getWorld(); PonderWorld world = scene.getWorld();
selection.all() selection.forEach(pos -> {
.forEach(pos -> { if (!world.getBounds()
if (!world.getBounds() .isVecInside(pos))
.isVecInside(pos)) return;
return; TileEntity tileEntity = world.getTileEntity(pos);
TileEntity tileEntity = world.getTileEntity(pos); if (!type.isInstance(tileEntity))
if (!type.isInstance(tileEntity)) return;
return; CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT()));
CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT())); tileEntity.read(apply);
tileEntity.read(apply); if (tileEntity instanceof SyncedTileEntity)
if (tileEntity instanceof SyncedTileEntity) ((SyncedTileEntity) tileEntity).readClientUpdate(apply);
((SyncedTileEntity) tileEntity).readClientUpdate(apply); });
});
} }
@Override @Override

View file

@ -2,14 +2,14 @@ package com.simibubi.create.foundation.ponder.instructions;
import com.simibubi.create.foundation.ponder.PonderInstruction; import com.simibubi.create.foundation.ponder.PonderInstruction;
import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
public abstract class WorldModifyInstruction extends PonderInstruction { public abstract class WorldModifyInstruction extends PonderInstruction {
private Select selection; private Selection selection;
public WorldModifyInstruction(Select selection) { public WorldModifyInstruction(Selection selection) {
this.selection = selection; this.selection = selection;
} }
@ -22,10 +22,10 @@ public abstract class WorldModifyInstruction extends PonderInstruction {
public void tick(PonderScene scene) { public void tick(PonderScene scene) {
runModification(selection, scene); runModification(selection, scene);
if (needsRedraw()) if (needsRedraw())
scene.forEach(WorldSectionElement.class, wse -> wse.queueRedraw(scene.getWorld())); scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw);
} }
protected abstract void runModification(Select selection, PonderScene scene); protected abstract void runModification(Selection selection, PonderScene scene);
protected abstract boolean needsRedraw(); protected abstract boolean needsRedraw();

View file

@ -60,14 +60,14 @@ public class Outliner {
public OutlineParams showAABB(Object slot, AxisAlignedBB bb, int ttl) { public OutlineParams showAABB(Object slot, AxisAlignedBB bb, int ttl) {
createAABBOutlineIfMissing(slot, bb); createAABBOutlineIfMissing(slot, bb);
ChasingAABBOutline outline = getAndRefreshAABB(slot, ttl); ChasingAABBOutline outline = getAndRefreshAABB(slot, ttl);
outline.prevBB = outline.targetBB = bb; outline.prevBB = outline.targetBB = outline.bb = bb;
return outline.getParams(); return outline.getParams();
} }
public OutlineParams showAABB(Object slot, AxisAlignedBB bb) { public OutlineParams showAABB(Object slot, AxisAlignedBB bb) {
createAABBOutlineIfMissing(slot, bb); createAABBOutlineIfMissing(slot, bb);
ChasingAABBOutline outline = getAndRefreshAABB(slot); ChasingAABBOutline outline = getAndRefreshAABB(slot);
outline.prevBB = outline.targetBB = bb; outline.prevBB = outline.targetBB = outline.bb = bb;
return outline.getParams(); return outline.getParams();
} }
@ -107,7 +107,7 @@ public class Outliner {
// Utility // Utility
private void createAABBOutlineIfMissing(Object slot, AxisAlignedBB bb) { private void createAABBOutlineIfMissing(Object slot, AxisAlignedBB bb) {
if (!outlines.containsKey(slot)) { if (!outlines.containsKey(slot) || !(outlines.get(slot).outline instanceof AABBOutline)) {
ChasingAABBOutline outline = new ChasingAABBOutline(bb); ChasingAABBOutline outline = new ChasingAABBOutline(bb);
outlines.put(slot, new OutlineEntry(outline)); outlines.put(slot, new OutlineEntry(outline));
} }

Binary file not shown.