From c4e1f680c9cce2c9359a4a2e3888ecf5676efc7b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 21 Feb 2021 03:18:04 +0100 Subject: [PATCH] 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 --- src/generated/resources/.cache/cache | 30 +- .../create/blockstates/radial_chassis.json | 72 +-- .../resources/assets/create/lang/en_us.json | 19 +- .../assets/create/lang/unfinished/de_de.json | 21 +- .../assets/create/lang/unfinished/es_es.json | 21 +- .../assets/create/lang/unfinished/es_mx.json | 21 +- .../assets/create/lang/unfinished/fr_fr.json | 21 +- .../assets/create/lang/unfinished/it_it.json | 21 +- .../assets/create/lang/unfinished/ja_jp.json | 21 +- .../assets/create/lang/unfinished/ko_kr.json | 21 +- .../assets/create/lang/unfinished/nl_nl.json | 21 +- .../assets/create/lang/unfinished/pt_br.json | 21 +- .../assets/create/lang/unfinished/ru_ru.json | 21 +- .../assets/create/lang/unfinished/zh_cn.json | 21 +- .../assets/create/lang/unfinished/zh_tw.json | 21 +- .../data/create/advancements/aesthetics.json | 4 +- .../create/foundation/ponder/ElementLink.java | 23 + .../foundation/ponder/PonderElement.java | 4 +- .../foundation/ponder/PonderInstruction.java | 26 + .../foundation/ponder/PonderRegistry.java | 57 +- .../create/foundation/ponder/PonderScene.java | 273 ++------- .../foundation/ponder/PonderStoryBoard.java | 14 - .../ponder/PonderStoryBoardEntry.java | 25 + .../create/foundation/ponder/PonderUI.java | 4 +- .../create/foundation/ponder/PonderWorld.java | 4 +- .../foundation/ponder/SceneBuilder.java | 292 ++++++++++ .../foundation/ponder/SceneBuildingUtil.java | 115 ++++ .../create/foundation/ponder/Select.java | 167 ------ .../create/foundation/ponder/Selection.java | 155 +++++ .../ponder/content/DebugScenes.java | 550 ++++++++++-------- .../ponder/content/KineticsScenes.java | 99 ++++ .../ponder/content/PonderIndex.java | 17 +- .../ponder/content/ShaftAsRelay.java | 57 -- .../ponder/content/ShaftsCanBeEncased.java | 66 --- .../ponder/elements/AnimatedSceneElement.java | 7 +- .../ponder/elements/WorldSectionElement.java | 147 ++++- .../AnimateWorldSectionInstruction.java | 68 +++ .../instructions/ChaseAABBInstruction.java | 30 + .../instructions/CreateParrotInstruction.java | 5 + .../DisplayWorldSectionInstruction.java | 33 +- .../FadeIntoSceneInstruction.java | 26 +- .../FadeOutOfSceneInstruction.java | 46 ++ .../MarkAsFinishedInstruction.java | 2 +- .../OutlineSelectionInstruction.java | 28 + .../ReplaceBlocksInstruction.java | 29 +- .../ShowCompleteSchematicInstruction.java | 5 +- .../ponder/instructions/TextInstruction.java | 4 +- .../TileEntityDataInstruction.java | 31 +- .../instructions/WorldModifyInstruction.java | 10 +- .../foundation/utility/outliner/Outliner.java | 6 +- src/main/resources/ponder/debug/scene_8.nbt | Bin 0 -> 319 bytes .../{encasing_shafts.nbt => encasing.nbt} | Bin .../ponder/shaft/{shaft.nbt => relay.nbt} | Bin 53 files changed, 1771 insertions(+), 1031 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/Select.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/Selection.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java create mode 100644 src/main/resources/ponder/debug/scene_8.nbt rename src/main/resources/ponder/shaft/{encasing_shafts.nbt => encasing.nbt} (100%) rename src/main/resources/ponder/shaft/{shaft.nbt => relay.nbt} (100%) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 208ff9692..d8d0cdebf 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.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 da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.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 b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -880014dda429e6e2f21e227398d861e4da5e90c6 assets/create/lang/en_us.json -c07a94266b5ccde4d9e35467943cc512fe4b5896 assets/create/lang/unfinished/de_de.json -e5a0e1b67981159c16eb4563736f85310c77f979 assets/create/lang/unfinished/es_es.json -4c492fcb95abe9242c3149ba2b08451ba078c223 assets/create/lang/unfinished/es_mx.json -a9ea43cba7ebf87860d165839c98986b8da17f8e assets/create/lang/unfinished/fr_fr.json -cc4fe91e45becc807f49b7114d32d44812d0ec42 assets/create/lang/unfinished/it_it.json -287f5a8985786f1fe4a44a4ff4907902074aa725 assets/create/lang/unfinished/ja_jp.json -2125c67df82987c0bf66efb0b6c59da916362480 assets/create/lang/unfinished/ko_kr.json -9cfd8839a607ba5230a9716bcda3fae0fc9fd9fd assets/create/lang/unfinished/nl_nl.json -d972eac60bf24d8102c013667b3c76291912edb4 assets/create/lang/unfinished/pt_br.json -a552694a6a62274a33cdea255584c3ea3bbc25ef assets/create/lang/unfinished/ru_ru.json -d4ea1d09bb09cd8fdbf9a9c996ab66e8db290e92 assets/create/lang/unfinished/zh_cn.json -5b453190f3d422b4124b426fe61cc831b89fd2fa assets/create/lang/unfinished/zh_tw.json +4bc90775f20e4373d8acfcd68df5a65134e04866 assets/create/lang/en_us.json +556b49bc145684816fe4ed3d01b8292b027785f6 assets/create/lang/unfinished/de_de.json +0112e46354dc5a3e404e80f18c3e9cf2ce2ac3a7 assets/create/lang/unfinished/es_es.json +22d8dbe2f7a2b7bb7b8175e6ea7ffe5461138339 assets/create/lang/unfinished/es_mx.json +5aac59946786fe76ff0d5ab8e548c086adb46a7b assets/create/lang/unfinished/fr_fr.json +479b811f2a0a687e7a1d14cfbed85af8ed8167b9 assets/create/lang/unfinished/it_it.json +22ab034f6f8cadcbc689f27e8697e52bc9fd701f assets/create/lang/unfinished/ja_jp.json +c046e6335a67a8685bb7e74cd6b14a5ee9c376db assets/create/lang/unfinished/ko_kr.json +96995633b85eaff2ac1b38a8958c6d167150d255 assets/create/lang/unfinished/nl_nl.json +8e8159926be6be37f97f6d4cf47deb8c236b83dc assets/create/lang/unfinished/pt_br.json +4485be9e7a8a2b0d006464390e664d6d504328b5 assets/create/lang/unfinished/ru_ru.json +8bfa521e0220fe71dbeb537a08845522e1ae0899 assets/create/lang/unfinished/zh_cn.json +eeaa83dafc8a683b4834cd87a49cb9b3c88e4121 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1587,7 +1587,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 8bd829ffc..f97d8c8bc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "true" + "sticky_west": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "true" + "sticky_west": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "true" + "sticky_west": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "false" + "sticky_west": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "false" + "sticky_west": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "false" + "sticky_west": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "true" + "sticky_east": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "true" + "sticky_east": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "true" + "sticky_east": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "false" + "sticky_east": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "false" + "sticky_east": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "false" + "sticky_east": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 7b70e9d81..c60e2f77b 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1813,20 +1813,25 @@ "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.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.title": "Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "Showing Fluids", "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.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.title": "Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index e8f533dd4..0cb77f8ea 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 994", + "_": "Missing Localizations: 999", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 0574cbdcc..221c74307 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 36", + "_": "Missing Localizations: 41", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 1b52d7196..52d63a589 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 924", + "_": "Missing Localizations: 929", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 6b3650342..eb814a792 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 706", + "_": "Missing Localizations: 711", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 0f7271a5a..475eac406 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 41", + "_": "Missing Localizations: 46", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index de73897c0..84938edd3 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 48", + "_": "Missing Localizations: 53", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index cc4731bfb..c7f7cb301 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 95", + "_": "Missing Localizations: 100", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 3afae9153..2dba21e1c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1193", + "_": "Missing Localizations: 1198", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 9ba011116..8fc37b357 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1259", + "_": "Missing Localizations: 1264", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 3c7745036..f3920d706 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 45", + "_": "Missing Localizations: 50", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 73a434dea..6f7297f43 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 43", + "_": "Missing Localizations: 48", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index b5d3185c0..e99ebdaa8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 48", + "_": "Missing Localizations: 53", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "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.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.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "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_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.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.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "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.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!" diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java b/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java new file mode 100644 index 000000000..02e4eb7a7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.UUID; + +public class ElementLink { + + private Class elementClass; + private UUID id; + + public ElementLink(Class elementClass, UUID id) { + this.elementClass = elementClass; + this.id = id; + } + + public UUID getId() { + return id; + } + + public T cast(PonderElement e) { + return elementClass.cast(e); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java index e22fcae23..9c482406e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java @@ -5,6 +5,8 @@ public class PonderElement { boolean visible = true; public void tick(PonderScene scene) {} + + public void reset(PonderScene scene) {} public boolean isVisible() { return visible; @@ -13,5 +15,5 @@ public class PonderElement { public void setVisible(boolean visible) { this.visible = visible; } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java index 10316af3f..36eb4ce40 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.ponder; +import java.util.function.Consumer; + public abstract class PonderInstruction { public boolean isBlocking() { @@ -12,4 +14,28 @@ public abstract class PonderInstruction { public abstract void tick(PonderScene scene); + public static PonderInstruction simple(Consumer callback) { + return new Simple(callback); + } + + private static class Simple extends PonderInstruction { + + private Consumer callback; + + public Simple(Consumer callback) { + this.callback = callback; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + callback.accept(scene); + } + + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 3f8b855ea..ab705012b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -12,7 +12,7 @@ import java.util.zip.GZIPInputStream; import com.google.gson.JsonElement; 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.SharedText; import com.tterrag.registrate.util.entry.ItemProviderEntry; @@ -28,12 +28,16 @@ import net.minecraft.world.gen.feature.template.Template; public class PonderRegistry { - static Map> all = new HashMap<>(); + static Map> 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(); 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 compile(ResourceLocation id) { @@ -44,28 +48,31 @@ public class PonderRegistry { SharedText.gatherText(); } - List list = all.get(id); + List list = all.get(id); List scenes = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { - - PonderStoryBoard sb = list.get(i); + PonderStoryBoardEntry sb = list.get(i); Template activeTemplate = loadSchematic(sb.getSchematicName()); PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); world.createBackup(); - - PonderScene scene = new PonderScene(world, id, i); - PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - SceneBuilder builder = scene.builder(); - sb.program(builder, builder.getSceneBuildingUtil()); + PonderScene scene = compileScene(id, i, sb, world); scene.begin(); scenes.add(scene); - } 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) { Template t = new Template(); String filepath = "ponder/" + path + ".nbt"; @@ -87,15 +94,25 @@ public class PonderRegistry { PonderIndex.register(); SharedText.gatherText(); all.forEach((id, list) -> { - for (int i = 0; i < list.size(); i++) { - PonderStoryBoard sb = list.get(i); - PonderScene scene = new PonderScene(null, id, i); - PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - SceneBuilder builder = scene.builder(); - sb.program(builder, builder.getSceneBuildingUtil()); - } + for (int i = 0; i < list.size(); i++) + compileScene(id, i, list.get(i), null); }); 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; + } + + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 7157d1891..ff655e3dd 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -1,77 +1,61 @@ package com.simibubi.create.foundation.ponder; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; -import java.util.function.UnaryOperator; 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.PonderSceneElement; 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.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.utility.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.Outliner; -import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; 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.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; public class PonderScene { + boolean finished; + int sceneIndex; + List schedule, activeSchedule; + Map linkedElements; Set elements; + PonderWorld world; ResourceLocation component; - int sceneIndex; SceneTransform transform; - public boolean finished; SceneRenderInfo info; Outliner outliner; + String defaultTitle; Vec3d pointOfInterest; Vec3d chasingPointOfInterest; + WorldSectionElement baseWorldSection; - private int offsetX; - private int offsetZ; - private int size; + int offsetX; + int offsetZ; + int size; public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { pointOfInterest = Vec3d.ZERO; @@ -82,11 +66,16 @@ public class PonderScene { outliner = new Outliner(); elements = new HashSet<>(); + linkedElements = new HashMap<>(); schedule = new ArrayList<>(); activeSchedule = new ArrayList<>(); transform = new SceneTransform(); size = getBounds().getXSize(); info = new SceneRenderInfo(); + baseWorldSection = new WorldSectionElement(); + + PonderLocalization.registerSpecific(component, sceneIndex, "title", "Untitled Scene"); + setPointOfInterest(new Vec3d(0, 4, 0)); } public String getTitle() { @@ -107,9 +96,19 @@ public class PonderScene { world.restore(); transform = new SceneTransform(); finished = false; - forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); + setPointOfInterest(new Vec3d(0, 4, 0)); + forEach(pe -> pe.reset(this)); elements.clear(); + linkedElements.clear(); activeSchedule.addAll(schedule); + + baseWorldSection.setEmpty(); + baseWorldSection.forceApplyFade(1); + elements.add(baseWorldSection); + } + + public WorldSectionElement getBaseWorldSection() { + return baseWorldSection; } public void fadeOut() { @@ -176,6 +175,22 @@ public class PonderScene { elements.add(e); } + public void linkElement(E e, ElementLink link) { + linkedElements.put(link.getId(), e); + } + + public E resolve(ElementLink link) { + return link.cast(linkedElements.get(link.getId())); + } + + public void runWith(ElementLink link, Consumer callback) { + callback.accept(resolve(link)); + } + + public F applyTo(ElementLink link, Function function) { + return function.apply(resolve(link)); + } + public PonderWorld getWorld() { return world; } @@ -206,10 +221,14 @@ public class PonderScene { } public SceneBuilder builder() { - return new SceneBuilder(); + return new SceneBuilder(this); } - private Supplier textGetter(String key) { + public SceneBuildingUtil getSceneBuildingUtil() { + return new SceneBuildingUtil(getBounds()); + } + + Supplier textGetter(String 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 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() { return outliner; } + public boolean isFinished() { + return finished; + } + + public void setFinished(boolean finished) { + this.finished = finished; + } + } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java deleted file mode 100644 index 1fb3fc6a4..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java +++ /dev/null @@ -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); - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java new file mode 100644 index 000000000..aa397e763 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java @@ -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; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index acaf4089b..4f5290764 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -106,7 +106,7 @@ public class PonderUI extends AbstractSimiScreen { int prevIndex = index; index = forward ? index + 1 : index - 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) .fadeOut(); scenes.get(index) @@ -228,7 +228,7 @@ public class PonderUI extends AbstractSimiScreen { if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) right.fade(scenes.size() - lazyIndexValue - 1); - if (scenes.get(index).finished) + if (scenes.get(index).isFinished()) right.flash(); else right.dim(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java index b478ec6d4..fd62396bc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -38,7 +38,7 @@ public class PonderWorld extends SchematicWorld { protected PonderWorldParticles particles; int overrideLight; - Select mask; + Selection mask; public PonderWorld(BlockPos anchor, World original) { super(anchor, original); @@ -81,7 +81,7 @@ public class PonderWorld extends SchematicWorld { return overrideLight == -1 ? 15 : overrideLight; } - public void setMask(Select mask) { + public void setMask(Selection mask) { this.mask = mask; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java new file mode 100644 index 000000000..e9cb9a5f6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -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 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 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 link, Direction fadeOutDirection) { + addInstruction(new FadeOutOfSceneInstruction<>(15, fadeOutDirection, link)); + } + + public ElementLink makeSectionIndependent(Selection selection) { + WorldSectionElement worldSectionElement = new WorldSectionElement(selection); + ElementLink 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 link, double xRotation, double yRotation, + double zRotation, int duration) { + addInstruction( + AnimateWorldSectionInstruction.rotate(link, new Vec3d(xRotation, yRotation, zRotation), duration)); + } + + public void moveSection(ElementLink 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 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 callback) { + scene.schedule.add(PonderInstruction.simple(callback)); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java new file mode 100644 index 000000000..d6a47ae91 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java @@ -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))); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Select.java b/src/main/java/com/simibubi/create/foundation/ponder/Select.java deleted file mode 100644 index 869482b0f..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/Select.java +++ /dev/null @@ -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 { - - 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 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 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 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 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))); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Selection.java b/src/main/java/com/simibubi/create/foundation/ponder/Selection.java new file mode 100644 index 000000000..589a9834f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/Selection.java @@ -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 { + + 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 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 posSet; + Vec3d center; + + public Compound(Simple initial) { + posSet = new HashSet<>(); + add(initial); + } + + private Compound(Set 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 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 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)); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 1d93364d7..353b1caaf 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -6,13 +6,14 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; 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.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.PonderStoryBoardEntry.PonderStoryBoard; +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.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.utility.Pointing; import com.tterrag.registrate.util.entry.ItemEntry; @@ -22,273 +23,328 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; 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() { + 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 = AllItems.BRASS_HAND; - int i = 0; - PonderRegistry.addStoryBoard(item, new CoordinateScene(++i)); - PonderRegistry.addStoryBoard(item, new BlocksScene(++i)); - 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)); + String schematicPath = "debug/scene_" + index; + PonderRegistry.addStoryBoard(item, schematicPath, sb); + index++; } - public DebugScenes(int index) { - this.index = index; + public static void coordinateScene(SceneBuilder scene, SceneBuildingUtil util) { + 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 final String getSchematicName() { - return "debug/scene_" + index; + public static void blocksScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Changing Blocks"); + 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 String getStoryTitle() { - return "Debug Scene " + index + (getTitle().isEmpty() ? "" : ": " + getTitle()); - } + public static void fluidsScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Showing Fluids"); + 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() { - return ""; - } + Object outlineSlot = new Object(); - 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) { - super(index); + for (int i = 0; i < 10; i++) { + 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 - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - 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"; - } + scene.idle(12); + scene.special.movePointOfInterest(util.grid.at(-4, 5, 4)); + scene.overlay.showTargetedText(PonderPalette.RED, parrotPos.add(-.25f, 0.25f, .25f), "wut", "dafuq?", 40); } - 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) { - super(index); - } + Selection out1 = util.select.fromTo(7, 0, 0, 8, 0, 5); + Selection out2 = util.select.fromTo(0, 0, 0, 0, 0, 5); + Selection blocksExceptBasePlate = util.select.layersFrom(1) + .add(out1) + .add(out2); - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - 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(); - } + scene.idle(10); + scene.world.showSection(blocksExceptBasePlate, Direction.DOWN); + scene.idle(10); - @Override - protected String getTitle() { - return "Changing Blocks"; - } + scene.overlay.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds", + "Blocks outside of the base plate do not affect scaling", 100); + 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 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 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"; - } - - } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java new file mode 100644 index 000000000..7917de013 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -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 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 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); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index 7ff108e90..f5c46f990 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -4,20 +4,19 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.ponder.PonderRegistry; 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 void register() { - // Register storyboards here (Requires re-launch) + // Register storyboards here (Changes require re-launch) - PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftAsRelay()); - PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftsCanBeEncased()); + PonderRegistry.forComponent(AllBlocks.SHAFT) + .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(); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java deleted file mode 100644 index 627e014ed..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java +++ /dev/null @@ -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(); - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java deleted file mode 100644 index 2ddf32ba9..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java +++ /dev/null @@ -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 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 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); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java index 61326ecba..e7b04fb40 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; public abstract class AnimatedSceneElement extends PonderSceneElement { @@ -20,6 +21,10 @@ public abstract class AnimatedSceneElement extends PonderSceneElement { .startWithValue(0); } + public void forceApplyFade(float fade) { + this.fade.startWithValue(fade); + } + public void setFade(float fade) { this.fade.setValue(fade); } @@ -71,7 +76,7 @@ public abstract class AnimatedSceneElement extends PonderSceneElement { protected int lightCoordsFromFade(float fade) { int light = 0xF000F0; if (fade != 1) { - light = (int) (0xF * fade); + light = (int) (MathHelper.lerp(fade, 5, 0xF)); light = light << 4 | light << 20; } return light; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index bc5321c4b..b46466c6b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.ponder.elements; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Random; 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.foundation.ponder.PonderScene; 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.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; 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.BlockState; @@ -34,6 +36,7 @@ import net.minecraft.fluid.IFluidState; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; @@ -42,18 +45,99 @@ public class WorldSectionElement extends AnimatedSceneElement { public static final Compartment> DOC_WORLD_SECTION = new Compartment<>(); List renderedTileEntities; - Select section; + Selection section; boolean redraw; - public WorldSectionElement(Select section) { - this.section = section; + Vec3d prevAnimatedOffset = Vec3d.ZERO; + 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; } + 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) { + prevAnimatedOffset = animatedOffset; + prevAnimatedRotation = animatedRotation; + if (!isVisible()) + return; if (renderedTileEntities == null) return; renderedTileEntities.forEach(te -> { @@ -65,6 +149,19 @@ public class WorldSectionElement extends AnimatedSceneElement { @Override protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, 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); } @@ -99,7 +196,7 @@ public class WorldSectionElement extends AnimatedSceneElement { contraptionBuffer.light(light) .renderInto(ms, buffer.getBuffer(type)); } - + @Override protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { redraw = false; @@ -108,10 +205,11 @@ public class WorldSectionElement extends AnimatedSceneElement { private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { if (renderedTileEntities == null) { renderedTileEntities = new ArrayList<>(); - section.all() - .map(world::getTileEntity) - .filter(Objects::nonNull) - .forEach(renderedTileEntities::add); + section.forEach(pos -> { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + renderedTileEntities.add(tileEntity); + }); } else renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); @@ -129,24 +227,23 @@ public class WorldSectionElement extends AnimatedSceneElement { builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); world.setMask(this.section); - section.all() - .forEach(pos -> { - BlockState state = world.getBlockState(pos); - IFluidState ifluidstate = world.getFluidState(pos); + section.forEach(pos -> { + BlockState state = world.getBlockState(pos); + IFluidState ifluidstate = world.getFluidState(pos); - ms.push(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); + ms.push(); + ms.translate(pos.getX(), pos.getY(), pos.getZ()); - if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR - && RenderTypeLookup.canRenderInLayer(state, layer)) - blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, - random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR + && RenderTypeLookup.canRenderInLayer(state, layer)) + blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, + random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); - if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) - dispatcher.renderFluid(pos, world, builder, ifluidstate); + if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) + dispatcher.renderFluid(pos, world, builder, ifluidstate); - ms.pop(); - }); + ms.pop(); + }); world.clearMask(); builder.finishDrawing(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java new file mode 100644 index 000000000..5b67ebb56 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java @@ -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 link; + protected WorldSectionElement element; + + private BiConsumer setter; + private Function getter; + + public static AnimateWorldSectionInstruction rotate(ElementLink link, Vec3d rotation, + int ticks) { + return new AnimateWorldSectionInstruction(link, rotation, ticks, WorldSectionElement::setAnimatedRotation, + WorldSectionElement::getAnimatedRotation); + } + + public static AnimateWorldSectionInstruction move(ElementLink link, Vec3d offset, int ticks) { + return new AnimateWorldSectionInstruction(link, offset, ticks, WorldSectionElement::setAnimatedOffset, + WorldSectionElement::getAnimatedOffset); + } + + protected AnimateWorldSectionInstruction(ElementLink link, Vec3d totalDelta, int ticks, + BiConsumer setter, Function 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)); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java new file mode 100644 index 000000000..e0a19f30b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java @@ -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()); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java index 7d400aa2d..56ada8ae2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java @@ -9,5 +9,10 @@ public class CreateParrotInstruction extends FadeIntoSceneInstruction getElementClass() { + return ParrotElement.class; + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java index f7532c299..07cd403c8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java @@ -1,13 +1,42 @@ 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 net.minecraft.util.Direction; public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction { - public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, WorldSectionElement element) { - super(fadeInTicks, fadeInFrom, element); + private Selection initialSelection; + 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 getElementClass() { + return WorldSectionElement.class; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java index 49e0b402a..04af5ceaf 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java @@ -1,21 +1,25 @@ 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.elements.AnimatedSceneElement; import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; -public class FadeIntoSceneInstruction extends TickingInstruction { +public abstract class FadeIntoSceneInstruction extends TickingInstruction { private Direction fadeInFrom; - private T element; + protected T element; + private ElementLink elementLink; public FadeIntoSceneInstruction(int fadeInTicks, Direction fadeInFrom, T element) { - super(false, fadeInTicks); - this.fadeInFrom = fadeInFrom; - this.element = element; - } + super(false, fadeInTicks); + this.fadeInFrom = fadeInFrom; + this.element = element; + } @Override protected void firstTick(PonderScene scene) { @@ -23,6 +27,8 @@ public class FadeIntoSceneInstruction extends Ti scene.addElement(element); element.setFade(0); element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); + if (elementLink != null) + scene.linkElement(element, elementLink); } @Override @@ -34,4 +40,12 @@ public class FadeIntoSceneInstruction extends Ti element.setFade(1); } + public ElementLink createLink(PonderScene scene) { + elementLink = new ElementLink<>(getElementClass(), UUID.randomUUID()); + scene.linkElement(element, elementLink); + return elementLink; + } + + protected abstract Class getElementClass(); + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java new file mode 100644 index 000000000..88545e101 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java @@ -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 extends TickingInstruction { + + private Direction fadeOutTo; + private ElementLink link; + private T element; + + public FadeOutOfSceneInstruction(int fadeOutTicks, Direction fadeOutTo, ElementLink 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); + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java index ecaf7b30d..a7f2e15b2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java @@ -12,7 +12,7 @@ public class MarkAsFinishedInstruction extends PonderInstruction { @Override public void tick(PonderScene scene) { - scene.finished = true; + scene.setFinished(true); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java new file mode 100644 index 000000000..23207f9fc --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java @@ -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()); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java index c723b4d93..0b61a362c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.ponder.instructions; import com.simibubi.create.foundation.ponder.PonderScene; 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.Blocks; @@ -11,27 +11,30 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction { private BlockState stateToUse; 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); this.stateToUse = stateToUse; this.replaceAir = replaceAir; + this.spawnParticles = spawnParticles; } @Override - protected void runModification(Select selection, PonderScene scene) { + protected void runModification(Selection selection, PonderScene scene) { PonderWorld world = scene.getWorld(); - selection.all() - .forEach(pos -> { - if (!world.getBounds() - .isVecInside(pos)) - return; - BlockState prevState = world.getBlockState(pos); - if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) - return; + selection.forEach(pos -> { + if (!world.getBounds() + .isVecInside(pos)) + return; + BlockState prevState = world.getBlockState(pos); + if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) + return; + if (spawnParticles) world.addBlockDestroyEffects(pos, prevState); - world.setBlockState(pos, stateToUse); - }); + world.setBlockState(pos, stateToUse); + }); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java index 0368437c3..6ed5b5a6e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java @@ -2,14 +2,13 @@ package com.simibubi.create.foundation.ponder.instructions; import com.simibubi.create.foundation.ponder.PonderInstruction; 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 { @Override public void tick(PonderScene scene) { - scene.addElement(Select.everything(scene.getBounds()) - .asElement()); + scene.addElement(new WorldSectionElement(scene.getSceneBuildingUtil().select.everywhere())); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java index ab7c84761..31c3c44a4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.ponder.instructions; import java.util.function.Supplier; 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.TextWindowElement; @@ -18,7 +18,7 @@ public class TextInstruction extends FadeInOutInstruction { super(duration); } - public TextInstruction(int color, Supplier text, int duration, Select selection) { + public TextInstruction(int color, Supplier text, int duration, Selection selection) { this(color, text, duration); element = new TextWindowElement(text).pointAt(selection.getCenter()); element.colored(color); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java index efcae7a9e..d484bae49 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java @@ -4,7 +4,7 @@ import java.util.function.UnaryOperator; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import net.minecraft.nbt.CompoundNBT; @@ -16,7 +16,7 @@ public class TileEntityDataInstruction extends WorldModifyInstruction { private UnaryOperator data; private Class type; - public TileEntityDataInstruction(Select selection, Class type, + public TileEntityDataInstruction(Selection selection, Class type, UnaryOperator data, boolean redraw) { super(selection); this.type = type; @@ -25,21 +25,20 @@ public class TileEntityDataInstruction extends WorldModifyInstruction { } @Override - protected void runModification(Select selection, PonderScene scene) { + protected void runModification(Selection selection, PonderScene scene) { PonderWorld world = scene.getWorld(); - selection.all() - .forEach(pos -> { - if (!world.getBounds() - .isVecInside(pos)) - return; - TileEntity tileEntity = world.getTileEntity(pos); - if (!type.isInstance(tileEntity)) - return; - CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT())); - tileEntity.read(apply); - if (tileEntity instanceof SyncedTileEntity) - ((SyncedTileEntity) tileEntity).readClientUpdate(apply); - }); + selection.forEach(pos -> { + if (!world.getBounds() + .isVecInside(pos)) + return; + TileEntity tileEntity = world.getTileEntity(pos); + if (!type.isInstance(tileEntity)) + return; + CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT())); + tileEntity.read(apply); + if (tileEntity instanceof SyncedTileEntity) + ((SyncedTileEntity) tileEntity).readClientUpdate(apply); + }); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java index 02ab81aac..7e387de05 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java @@ -2,14 +2,14 @@ package com.simibubi.create.foundation.ponder.instructions; import com.simibubi.create.foundation.ponder.PonderInstruction; 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; public abstract class WorldModifyInstruction extends PonderInstruction { - private Select selection; + private Selection selection; - public WorldModifyInstruction(Select selection) { + public WorldModifyInstruction(Selection selection) { this.selection = selection; } @@ -22,10 +22,10 @@ public abstract class WorldModifyInstruction extends PonderInstruction { public void tick(PonderScene scene) { runModification(selection, scene); 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(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java index 3d0311265..67e1a46c4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java @@ -60,14 +60,14 @@ public class Outliner { public OutlineParams showAABB(Object slot, AxisAlignedBB bb, int ttl) { createAABBOutlineIfMissing(slot, bb); ChasingAABBOutline outline = getAndRefreshAABB(slot, ttl); - outline.prevBB = outline.targetBB = bb; + outline.prevBB = outline.targetBB = outline.bb = bb; return outline.getParams(); } public OutlineParams showAABB(Object slot, AxisAlignedBB bb) { createAABBOutlineIfMissing(slot, bb); ChasingAABBOutline outline = getAndRefreshAABB(slot); - outline.prevBB = outline.targetBB = bb; + outline.prevBB = outline.targetBB = outline.bb = bb; return outline.getParams(); } @@ -107,7 +107,7 @@ public class Outliner { // Utility 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); outlines.put(slot, new OutlineEntry(outline)); } diff --git a/src/main/resources/ponder/debug/scene_8.nbt b/src/main/resources/ponder/debug/scene_8.nbt new file mode 100644 index 0000000000000000000000000000000000000000..eb2a7ac88bd906d7c2c437cefee318dd02deef21 GIT binary patch literal 319 zcmb2|=3sz;-l>lMM-&8Fm!H|N?e*1W`@^5-eSdQ?yP0L`4sKt?n@8lIy`L-^@Ei&DDZLo! zW0gAj?)ffn|Lu=nuCw8KU~oXNVKJj$==BdJ+VfuT6*-XDpv>UTJZIgtR`<1Yp4 zSDd@||J=NLHD!x?51w16aQ^k_4LKV(7tXq46E(S}LihNNyR&oV-I-Iv