From 18067e8d5ce8d4b2f01034c0fbd95e6eb56b66e0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Feb 2021 19:35:26 +0100 Subject: [PATCH] Ponder - rebrand - support for particles - support for fluids - support for outliner - coloured text labels - debug scenes - proper UI stuff - proper layered rendering --- src/generated/resources/.cache/cache | 26 +- .../create/blockstates/radial_chassis.json | 72 +-- .../resources/assets/create/lang/en_us.json | 36 +- .../assets/create/lang/unfinished/de_de.json | 38 +- .../assets/create/lang/unfinished/es_mx.json | 38 +- .../assets/create/lang/unfinished/fr_fr.json | 38 +- .../assets/create/lang/unfinished/it_it.json | 38 +- .../assets/create/lang/unfinished/ja_jp.json | 38 +- .../assets/create/lang/unfinished/ko_kr.json | 38 +- .../assets/create/lang/unfinished/nl_nl.json | 38 +- .../assets/create/lang/unfinished/pt_br.json | 38 +- .../assets/create/lang/unfinished/ru_ru.json | 38 +- .../assets/create/lang/unfinished/zh_cn.json | 38 +- .../assets/create/lang/unfinished/zh_tw.json | 38 +- .../com/simibubi/create/CreateClient.java | 6 +- .../particle/RotationIndicatorParticle.java | 5 +- .../content/schematics/SchematicWorld.java | 5 + .../simibubi/create/events/ClientEvents.java | 8 +- .../foundation/data/AllLangPartials.java | 4 +- .../create/foundation/gui/AllIcons.java | 6 +- .../metadoc/MetaDocInstruction.java | 15 - .../foundation/metadoc/MetaDocScene.java | 330 ------------- .../foundation/metadoc/MetaDocStoryBoard.java | 15 - .../foundation/metadoc/MetaDocWorld.java | 78 --- .../create/foundation/metadoc/Select.java | 69 --- .../metadoc/content/CogwheelStory.java | 51 -- .../metadoc/content/MetaDocIndex.java | 22 - .../metadoc/content/SharedText.java | 23 - .../elements/AnimatedOverlayElement.java | 29 -- .../elements/AnimatedSceneElement.java | 53 -- .../elements/MetaDocOverlayElement.java | 14 - .../metadoc/elements/MetaDocSceneElement.java | 13 - .../metadoc/elements/ParrotElement.java | 72 --- .../metadoc/elements/TextWindowElement.java | 69 --- .../ShowCompleteSchematicInstruction.java | 20 - .../instructions/TextWindowInstruction.java | 52 -- .../instructions/WorldModifyInstruction.java | 32 -- .../PonderElement.java} | 6 +- .../foundation/ponder/PonderInstruction.java | 15 + .../PonderLocalization.java} | 20 +- .../PonderRegistry.java} | 56 ++- .../create/foundation/ponder/PonderScene.java | 462 ++++++++++++++++++ .../foundation/ponder/PonderStoryBoard.java | 14 + .../PonderTooltipHandler.java} | 57 ++- .../PonderUI.java} | 207 ++++++-- .../create/foundation/ponder/PonderWorld.java | 158 ++++++ .../ponder/PonderWorldParticles.java | 109 +++++ .../create/foundation/ponder/Select.java | 167 +++++++ .../ponder/content/CogwheelStory.java | 42 ++ .../ponder/content/DebugScenes.java | 198 ++++++++ .../ponder/content/PonderIndex.java | 27 + .../ponder/content/PonderPalette.java | 27 + .../ponder/content/ShaftAsRelay.java | 54 ++ .../ponder/content/ShaftsCanBeEncased.java | 55 +++ .../foundation/ponder/content/SharedText.java | 23 + .../elements/AnimatedOverlayElement.java | 29 ++ .../ponder/elements/AnimatedSceneElement.java | 80 +++ .../ponder/elements/OutlinerElement.java | 26 + .../ponder/elements/ParrotElement.java | 119 +++++ .../ponder/elements/PonderOverlayElement.java | 14 + .../ponder/elements/PonderSceneElement.java | 18 + .../ponder/elements/TextWindowElement.java | 89 ++++ .../elements/WorldSectionElement.java | 90 ++-- .../instructions/CreateParrotInstruction.java | 4 +- .../instructions/DelayInstruction.java | 2 +- .../DisplayWorldSectionInstruction.java | 4 +- .../EmitParticlesInstruction.java | 50 ++ .../FadeIntoSceneInstruction.java | 10 +- .../instructions/HideAllInstruction.java | 12 +- .../MarkAsFinishedInstruction.java | 18 + .../instructions/MovePoiInstruction.java | 26 + .../ReplaceBlocksInstruction.java | 16 +- .../instructions/RotateSceneInstruction.java | 12 +- .../ShowCompleteSchematicInstruction.java | 20 + .../ponder/instructions/TextInstruction.java | 84 ++++ .../instructions/TickingInstruction.java | 14 +- .../TileEntityDataInstruction.java | 12 +- .../instructions/WorldModifyInstruction.java | 32 ++ .../foundation/ponder/ui/PonderButton.java | 136 ++++++ .../foundation/utility/ColorHelper.java | 25 +- .../create/foundation/utility/VecHelper.java | 7 +- .../resources/META-INF/accesstransformer.cfg | 5 +- .../assets/create/textures/gui/icons.png | Bin 4765 -> 2598 bytes src/main/resources/doc/cogwheel/s1.nbt | Bin 540 -> 0 bytes src/main/resources/doc/cogwheel/s2.nbt | Bin 420 -> 0 bytes src/main/resources/doc/cogwheel/s3.nbt | Bin 854 -> 0 bytes src/main/resources/doc/cogwheel/s4.nbt | Bin 845 -> 0 bytes src/main/resources/doc/cogwheel/s5.nbt | Bin 290 -> 0 bytes src/main/resources/ponder/cogwheel/first.nbt | Bin 0 -> 679 bytes src/main/resources/ponder/debug/scene_1.nbt | Bin 0 -> 341 bytes src/main/resources/ponder/debug/scene_2.nbt | Bin 0 -> 344 bytes src/main/resources/ponder/debug/scene_3.nbt | Bin 0 -> 845 bytes src/main/resources/ponder/debug/scene_4.nbt | Bin 0 -> 608 bytes src/main/resources/ponder/debug/scene_5.nbt | Bin 0 -> 333 bytes .../ponder/shaft/encasing_shafts.nbt | Bin 0 -> 497 bytes src/main/resources/ponder/shaft/shaft.nbt | Bin 0 -> 541 bytes 96 files changed, 2829 insertions(+), 1365 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/Select.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocElement.java => ponder/PonderElement.java} (57%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocLocalization.java => ponder/PonderLocalization.java} (77%) rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocs.java => ponder/PonderRegistry.java} (56%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocTooltipHandler.java => ponder/PonderTooltipHandler.java} (66%) rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocScreen.java => ponder/PonderUI.java} (50%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/Select.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/elements/WorldSectionElement.java (61%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/CreateParrotInstruction.java (67%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/DelayInstruction.java (67%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/DisplayWorldSectionInstruction.java (68%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/FadeIntoSceneInstruction.java (72%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/HideAllInstruction.java (77%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/ReplaceBlocksInstruction.java (55%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/RotateSceneInstruction.java (65%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/TickingInstruction.java (58%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/TileEntityDataInstruction.java (76%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java delete mode 100644 src/main/resources/doc/cogwheel/s1.nbt delete mode 100644 src/main/resources/doc/cogwheel/s2.nbt delete mode 100644 src/main/resources/doc/cogwheel/s3.nbt delete mode 100644 src/main/resources/doc/cogwheel/s4.nbt delete mode 100644 src/main/resources/doc/cogwheel/s5.nbt create mode 100644 src/main/resources/ponder/cogwheel/first.nbt create mode 100644 src/main/resources/ponder/debug/scene_1.nbt create mode 100644 src/main/resources/ponder/debug/scene_2.nbt create mode 100644 src/main/resources/ponder/debug/scene_3.nbt create mode 100644 src/main/resources/ponder/debug/scene_4.nbt create mode 100644 src/main/resources/ponder/debug/scene_5.nbt create mode 100644 src/main/resources/ponder/shaft/encasing_shafts.nbt create mode 100644 src/main/resources/ponder/shaft/shaft.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 91688b763..588bd62e9 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 -6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json +4439fc83a8c7370ab44b211a3fd48abde20a4728 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,18 +401,18 @@ 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 -a3e1a1b7946534a5db2482cc6d43aadbdaf0938f assets/create/lang/en_us.json -56c92fc5d2526d6ab9086d2edb03956234cad255 assets/create/lang/unfinished/de_de.json -4cab4140761c85fe6f2cb0a636ade5d63be422c4 assets/create/lang/unfinished/es_mx.json -c1436ba5bd506cd531586a1ca87f7bcc1091a2d6 assets/create/lang/unfinished/fr_fr.json -4747471601a24efbc6cb01b339bafb984b6903c6 assets/create/lang/unfinished/it_it.json -5b87db032d1726cc10a225bf0c4740f50169517f assets/create/lang/unfinished/ja_jp.json -acc6638d1ae47eab3c33431e3b794d85bf158f8f assets/create/lang/unfinished/ko_kr.json -88a425173c828ce221435dfd9a29316cfe05204b assets/create/lang/unfinished/nl_nl.json -4672e12982db0283e4826904c2538a5465c5c1e6 assets/create/lang/unfinished/pt_br.json -85d5f3d8fd543c5f8d2d50e689b5ad25765c7cc2 assets/create/lang/unfinished/ru_ru.json -ad1f7b8a42bc74dd416380faf2b66f2ca1302ec0 assets/create/lang/unfinished/zh_cn.json -c561cc74bcfc00b664ec299fb8d6f9ee2c236d24 assets/create/lang/unfinished/zh_tw.json +694cfe3d8fe9793b7ac0fbc7bbd3cf6bf455bf92 assets/create/lang/en_us.json +499d461cf16f5a94049fbbe9eb758e0eaa19fa83 assets/create/lang/unfinished/de_de.json +8e486714ce38b6702fc614f4ba7cd34e003800aa assets/create/lang/unfinished/es_mx.json +53f2918966bd9c045314a02ff0f5439720969087 assets/create/lang/unfinished/fr_fr.json +073ead0ceacdcf666fece6a78071a36fa9c3d356 assets/create/lang/unfinished/it_it.json +0967bfc8888598329563ff6ee419038aef03df0a assets/create/lang/unfinished/ja_jp.json +50e210e32d4a55561ffed5a62ac10802107b719e assets/create/lang/unfinished/ko_kr.json +40784b923f0defdecbd35f73c7d7ead9c3fe9d8a assets/create/lang/unfinished/nl_nl.json +ad719b1559c58c9e7c1b22023c5e686d4fa1ca19 assets/create/lang/unfinished/pt_br.json +1190f9152de89c7e0b7561c3cdddae6fe2f1aa19 assets/create/lang/unfinished/ru_ru.json +bbcd8d37a18c779dfcca9aeaeb2b2d101a4b4fe2 assets/create/lang/unfinished/zh_cn.json +be270f1d2bc61ebd4a9f1be5b00daa56947de2d7 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index f97d8c8bc..8bd829ffc 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": { - "sticky_west": "true", - "axis": "x" + "axis": "x", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "y" + "axis": "y", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "z" + "axis": "z", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "x" + "axis": "x", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "y" + "axis": "y", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "z" + "axis": "z", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "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 69da8b46a..42a9f52d3 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1789,18 +1789,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "This is Shared stuff", - "create.metadoc.shared.when_wrenched": "When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder", + "create.ponder.pondering": "Pondering about...", + "create.ponder.shared.more_shared": "This is Shared stuff", + "create.ponder.shared.when_wrenched": "When Wrenched", + "create.ponder.cogwheel.scene_0.title": "My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "Encasing Shafts", + "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_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_2.fluids": "Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "Incoming...", + "create.ponder.brass_hand.scene_4.title": "Debug Scene 5: Emitting particles", "_": "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 7ffbf545b..799d157eb 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: 1107", + "_": "Missing Localizations: 1119", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 1e175818f..440b56c5b 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: 898", + "_": "Missing Localizations: 910", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 0c4230e07..9afcc1138 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: 678", + "_": "Missing Localizations: 690", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 50077225a..3d2f316b5 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: 15", + "_": "Missing Localizations: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 33203a9f6..004d882f2 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: 24", + "_": "Missing Localizations: 36", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 baf40797c..51612fa21 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: 67", + "_": "Missing Localizations: 79", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 7b9c03a39..2fb0077c9 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: 1167", + "_": "Missing Localizations: 1179", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 071a3425e..be5288f9b 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: 1233", + "_": "Missing Localizations: 1245", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 102977f20..261a60115 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: 17", + "_": "Missing Localizations: 29", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 56c4a2cbe..135caaf45 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: 15", + "_": "Missing Localizations: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "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 f3a73370e..c300d3e80 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: 20", + "_": "Missing Localizations: 32", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "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_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_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: 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", "_": "Thank you for translating Create!" diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 861006a1d..4ff75d77b 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,8 +16,8 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; @@ -76,7 +76,7 @@ public class CreateClient { AllEntityTypes.registerRenderers(); getColorHandler().init(); AllFluids.assignRenderLayers(); - MetaDocIndex.register(); + PonderIndex.register(); IResourceManager resourceManager = Minecraft.getInstance() .getResourceManager(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java index 5ca7b26e6..a54ab7a67 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java @@ -84,8 +84,9 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { public Particle makeParticle(RotationIndicatorParticleData data, World worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { - ClientPlayerEntity player = Minecraft.getInstance().player; - boolean visible = player != null && GogglesItem.canSeeParticles(player); + Minecraft mc = Minecraft.getInstance(); + ClientPlayerEntity player = mc.player; + boolean visible = worldIn != mc.world || player != null && GogglesItem.canSeeParticles(player); return new RotationIndicatorParticle(worldIn, x, y, z, data.color, data.radius1, data.radius2, data.speed, data.getAxis(), data.lifeSpan, visible, this.spriteSet); } diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java index 7fabee37f..06abab70c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java @@ -187,6 +187,11 @@ public class SchematicWorld extends WrappedWorld { renderedTileEntities.remove(tileEntity); } } + + TileEntity tileEntity = getTileEntity(pos); + if (tileEntity != null) + tileEntities.put(pos, tileEntity); + return true; } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index a434233c7..957bde4ad 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -26,9 +26,9 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionP import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.metadoc.MetaDocTooltipHandler; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; +import com.simibubi.create.foundation.ponder.PonderTooltipHandler; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -88,7 +88,7 @@ public class ClientEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); - MetaDocTooltipHandler.tick(); + PonderTooltipHandler.tick(); ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); @@ -150,7 +150,7 @@ public class ClientEvents { @SubscribeEvent public static void getItemTooltipColor(RenderTooltipEvent.Color event) { - MetaDocTooltipHandler.handleTooltipColor(event); + PonderTooltipHandler.handleTooltipColor(event); } @SubscribeEvent @@ -175,7 +175,7 @@ public class ClientEvents { itemTooltip.addAll(0, toolTip); } - MetaDocTooltipHandler.addToTooltip(event.getToolTip(), stack); + PonderTooltipHandler.addToTooltip(event.getToolTip(), stack); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index 8a4aaef81..eddac4b90 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.data; import com.google.common.base.Supplier; import com.google.gson.JsonElement; import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.MetaDocs; +import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.utility.FilesHelper; import com.simibubi.create.foundation.utility.Lang; @@ -12,7 +12,7 @@ public enum AllLangPartials { ADVANCEMENTS("Advancements"), MESSAGES("UI & Messages"), TOOLTIPS("Item Descriptions"), - METADOC("MetaDoc Text", MetaDocs::provideLangEntries), + METADOC("MetaDoc Text", PonderRegistry::provideLangEntries), ; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index c1279fce0..51e0c0764 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -115,7 +115,11 @@ public class AllIcons { I_FOLLOW_DIAGONAL = next(), I_FOLLOW_MATERIAL = next(), - I_SCHEMATIC = newRow(); + I_SCHEMATIC = newRow(), + + I_MTD_LEFT = newRow(), + I_MTD_CLOSE = next(), + I_MTD_RIGHT = next(); public AllIcons(int x, int y) { iconX = x * 16; diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java deleted file mode 100644 index 13bdda9e9..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -public abstract class MetaDocInstruction { - - public boolean isBlocking() { - return false; - } - - public void reset(MetaDocScene scene) {} - - public abstract boolean isComplete(); - - public abstract void tick(MetaDocScene scene); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java deleted file mode 100644 index eb92fb29d..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java +++ /dev/null @@ -1,330 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; -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.logistics.block.funnel.FunnelTileEntity; -import com.simibubi.create.foundation.metadoc.elements.MetaDocOverlayElement; -import com.simibubi.create.foundation.metadoc.elements.MetaDocSceneElement; -import com.simibubi.create.foundation.metadoc.elements.ParrotElement; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; -import com.simibubi.create.foundation.metadoc.instructions.CreateParrotInstruction; -import com.simibubi.create.foundation.metadoc.instructions.DelayInstruction; -import com.simibubi.create.foundation.metadoc.instructions.DisplayWorldSectionInstruction; -import com.simibubi.create.foundation.metadoc.instructions.HideAllInstruction; -import com.simibubi.create.foundation.metadoc.instructions.ReplaceBlocksInstruction; -import com.simibubi.create.foundation.metadoc.instructions.RotateSceneInstruction; -import com.simibubi.create.foundation.metadoc.instructions.ShowCompleteSchematicInstruction; -import com.simibubi.create.foundation.metadoc.instructions.TextWindowInstruction; -import com.simibubi.create.foundation.metadoc.instructions.TileEntityDataInstruction; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.MatrixStacker; - -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.Vector4f; -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 MetaDocScene { - - List schedule, activeSchedule; - Set elements; - MetaDocWorld world; - ResourceLocation component; - int sceneIndex; - SceneTransform transform; - - public MetaDocScene(MetaDocWorld world, ResourceLocation component, int sceneIndex) { - this.world = world; - this.component = component; - this.sceneIndex = sceneIndex; - elements = new HashSet<>(); - schedule = new ArrayList<>(); - activeSchedule = new ArrayList<>(); - transform = new SceneTransform(); - } - - public String getTitle() { - return getString("title"); - } - - public String getString(String key) { - return MetaDocLocalization.getSpecific(component, sceneIndex, key); - } - - public void reset() { - activeSchedule.clear(); - schedule.forEach(mdi -> mdi.reset(this)); - } - - public void begin() { - reset(); - world.restore(); - transform = new SceneTransform(); - forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); - elements.clear(); - activeSchedule.addAll(schedule); - } - - public void fadeOut() { - reset(); - activeSchedule.add(new HideAllInstruction(10, null)); - } - - public void renderScene(IRenderTypeBuffer buffer, MatrixStack ms) { - ms.push(); - forEach(MetaDocSceneElement.class, e -> { - if (e.isVisible()) - e.render(world, buffer, ms); - }); - ms.pop(); - } - - public void renderOverlay(MetaDocScreen screen, MatrixStack ms, float partialTicks) { - ms.push(); - forEach(MetaDocOverlayElement.class, e -> { - if (e.isVisible()) - e.render(this, screen, ms, partialTicks); - }); - ms.pop(); - } - - public void tick() { - transform.tick(); - forEach(MetaDocElement::tick); - for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { - MetaDocInstruction metaDocInstruction = iterator.next(); - metaDocInstruction.tick(this); - if (metaDocInstruction.isComplete()) { - iterator.remove(); - continue; - } - if (metaDocInstruction.isBlocking()) - break; - } - } - - public void addElement(MetaDocElement e) { - elements.add(e); - } - - public MetaDocWorld getWorld() { - return world; - } - - public Set getElements() { - return elements; - } - - public void forEach(Consumer function) { - for (MetaDocElement metaDocElement : elements) - function.accept(metaDocElement); - } - - public void forEach(Class type, Consumer function) { - for (MetaDocElement metaDocElement : elements) - if (type.isInstance(metaDocElement)) - function.accept(type.cast(metaDocElement)); - } - - public MutableBoundingBox getBounds() { - return world == null ? new MutableBoundingBox() : world.getBounds(); - } - - public SceneBuilder builder() { - return new SceneBuilder(); - } - - private Supplier textGetter(String key) { - return () -> MetaDocLocalization.getSpecific(component, sceneIndex, key); - } - - public SceneTransform getTransform() { - return transform; - } - - public class SceneTransform { - - public LerpedFloat xRotation, yRotation; - - // Screen params - int width, height; - double offset; - Matrix4f cachedMat; - - public SceneTransform() { - xRotation = LerpedFloat.angular() - .startWithValue(-35); - yRotation = LerpedFloat.angular() - .startWithValue(55); - } - - public void tick() { - xRotation.tickChaser(); - yRotation.tickChaser(); - } - - public void updateScreenParams(int width, int height, double offset) { - this.width = width; - this.height = height; - this.offset = offset; - cachedMat = null; - } - - public MatrixStack apply(MatrixStack ms) { - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); - ms.translate(width / 2, height / 2, 200); - - MatrixStacker.of(ms) - .rotateX(-35) - .rotateY(55); - ms.translate(offset, 0, 0); - MatrixStacker.of(ms) - .rotateY(-55) - .rotateX(35); - - MatrixStacker.of(ms) - .rotateX(xRotation.getValue(pt)) - .rotateY(yRotation.getValue(pt)); - ms.scale(30, -30, 30); - - MutableBoundingBox bounds = getBounds(); - ms.translate(bounds.getXSize() / -2f, -.5f, bounds.getZSize() / -2f); - - return ms; - } - - public Vec3d screenToScene(float x, float y) { - refreshMatrix(); - Vector4f vec = new Vector4f(x, y, 0, 1); - cachedMat.invert(); - vec.transform(cachedMat); - cachedMat.invert(); - MutableBoundingBox bounds = getBounds(); - return new Vec3d(vec.getX() + bounds.getXSize() / -2f, vec.getY(), vec.getZ() + bounds.getZSize() / -2f); - } - - public Vec2f sceneToScreen(Vec3d vec) { - refreshMatrix(); - Vector4f vec4 = new Vector4f((float) vec.x, (float) vec.y, (float) vec.z, 1); - vec4.transform(cachedMat); - return new Vec2f(vec4.getX(), vec4.getY()); - } - - protected void refreshMatrix() { - if (cachedMat != null) - return; - MatrixStack ms = apply(new MatrixStack()); -// MatrixStacker.of(ms) -// .rotateY(180); - cachedMat = ms.peek() - .getModel(); - } - - } - - public class SceneBuilder { - - public SceneBuilder showBasePlate() { - Vec3i length = getBounds().getLength(); - return showSection(Select.cuboid(BlockPos.ZERO, new Vec3i(length.getX(), 0, length.getZ())), Direction.UP); - } - - public SceneBuilder showText(Vec3d position, String key, String defaultText, int fadeTime, int duration) { - MetaDocLocalization.registerSpecific(component, sceneIndex, key, defaultText); - return addInstruction(new TextWindowInstruction(textGetter(key), fadeTime, duration, position)); - } - - 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 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, false)); - } - - 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) { - return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { - if (!nbt.contains("Speed")) - return 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 createParrotOn(BlockPos pos, Direction fadeInDirection) { - return addInstruction( - new CreateParrotInstruction(15, fadeInDirection, new ParrotElement(new Vec3d(pos).add(.5, 0, .5)))); - } - - public SceneBuilder createParrot(Vec3d location, Direction fadeInDirection) { - return addInstruction(new CreateParrotInstruction(15, fadeInDirection, new ParrotElement(location))); - } - - public SceneBuilder addInstruction(MetaDocInstruction instruction) { - schedule.add(instruction); - return this; - } - - // - - public Select everywhere() { - return Select.cuboid(BlockPos.ZERO, getBounds().getLength()); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java deleted file mode 100644 index 5199eec25..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; - -import net.minecraft.util.math.Vec3i; - -public abstract class MetaDocStoryBoard { - - public abstract String getSchematicName(); - - public abstract String getStoryTitle(); - - public abstract void program(SceneBuilder scene, Vec3i worldSize); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java deleted file mode 100644 index 4673cee68..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import java.util.HashMap; -import java.util.Map; - -import com.simibubi.create.content.schematics.SchematicWorld; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; -import net.minecraft.world.World; - -public class MetaDocWorld extends SchematicWorld { - - protected Map originalBlocks; - protected Map originalTileEntities; - - int overrideLight; - Select mask; - - public MetaDocWorld(BlockPos anchor, World original) { - super(anchor, original); - originalBlocks = new HashMap<>(); - originalTileEntities = new HashMap<>(); - } - - public void createBackup() { - originalBlocks.clear(); - originalTileEntities.clear(); - blocks.forEach((k, v) -> originalBlocks.put(k, v)); - tileEntities.forEach((k, v) -> originalTileEntities.put(k, TileEntity.create(v.write(new CompoundNBT())))); - } - - public void restore() { - blocks.clear(); - tileEntities.clear(); - renderedTileEntities.clear(); - originalBlocks.forEach((k, v) -> blocks.put(k, v)); - originalTileEntities.forEach((k, v) -> { - TileEntity te = TileEntity.create(v.write(new CompoundNBT())); - te.setLocation(this, te.getPos()); - tileEntities.put(k, te); - renderedTileEntities.add(te); - }); - } - - public void pushFakeLight(int light) { - this.overrideLight = light; - } - - public void popLight() { - this.overrideLight = -1; - } - - @Override - public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { - return overrideLight == -1 ? 15 : overrideLight; - } - - public void setMask(Select mask) { - this.mask = mask; - } - - public void clearMask() { - this.mask = null; - } - - @Override - public BlockState getBlockState(BlockPos globalPos) { - if (mask != null && !mask.test(globalPos.subtract(anchor))) - return Blocks.AIR.getDefaultState(); - return super.getBlockState(globalPos); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/Select.java b/src/main/java/com/simibubi/create/foundation/metadoc/Select.java deleted file mode 100644 index 688b59ed3..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/Select.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import java.util.function.Predicate; -import java.util.stream.Stream; - -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MutableBoundingBox; -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 everything(MetaDocScene scene) { - MutableBoundingBox bounds = scene.getBounds(); - return cuboid(BlockPos.ZERO, bounds.getLength()); - } - - // - - public WorldSectionElement asElement() { - return new WorldSectionElement(this); - } - - // - - @Override - public abstract int hashCode(); - - public abstract Stream all(); - - 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(); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java deleted file mode 100644 index e332e4e15..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.simibubi.create.foundation.metadoc.content; - -import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; -import com.simibubi.create.foundation.metadoc.MetaDocStoryBoard; -import com.simibubi.create.foundation.metadoc.Select; - -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; - -public class CogwheelStory extends MetaDocStoryBoard { - - private int index; - - public CogwheelStory(int index) { - this.index = index; - } - - @Override - public String getSchematicName() { - return "cogwheel/s" + index; - } - - @Override - public String getStoryTitle() { - return "My First Metadoc Story, Part " + index; - } - - @Override - public void program(SceneBuilder scene, Vec3i worldSize) { - scene.showBasePlate(); - scene.idle(10); - - scene.showSection(Select.cuboid(BlockPos.ZERO.up(), worldSize), Direction.DOWN); - scene.multiplyKineticSpeed(scene.everywhere(), 2); - scene.rotateCameraY(90); - scene.createParrotOn(new BlockPos(0.5, 2.5, 1.5), Direction.DOWN); -// scene.idle(10); -// scene.createParrotOn(new BlockPos(5, 1, 5), Direction.DOWN); -// scene.idle(10); -// scene.createParrotOn(new BlockPos(0, 1, 5), Direction.DOWN); - - scene.idle(40); - scene.showText(new Vec3d(0.5, 2, 1.5), "swinging_text", "there's a parrot", 10, 50); - scene.idle(10); - scene.rotateCameraY(180); - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java deleted file mode 100644 index db91c27a1..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.simibubi.create.foundation.metadoc.content; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.metadoc.MetaDocs; - -public class MetaDocIndex { - - /** - * When true, lang files are bypassed and any text in metadoc 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) - - for (int i = 1; i < 6; i++) - MetaDocs.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory(i)); - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java deleted file mode 100644 index b2d061111..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.simibubi.create.foundation.metadoc.content; - -import com.simibubi.create.foundation.metadoc.MetaDocLocalization; - -public class SharedText { - - public static void gatherText() { - // Add entries used across several metadoc stories (Safe for hotswap) - - add("when_wrenched", "When Wrenched"); - add("more_shared", "This is Shared stuff"); - - } - - public static String get(String key) { - return MetaDocLocalization.getShared(key); - } - - private static void add(String k, String v) { - MetaDocLocalization.registerShared(k, v); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java deleted file mode 100644 index 1c8cf29a0..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScreen; -import com.simibubi.create.foundation.utility.LerpedFloat; - -public abstract class AnimatedOverlayElement extends MetaDocOverlayElement { - - protected LerpedFloat fade; - - public AnimatedOverlayElement() { - fade = LerpedFloat.linear() - .startWithValue(0); - } - - public void setFade(float fade) { - this.fade.setValue(fade); - } - - @Override - public final void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks) { - float currentFade = fade.getValue(partialTicks); - render(scene, screen, ms, partialTicks, currentFade); - } - - protected abstract void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks, float fade); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java deleted file mode 100644 index a3d2bfc82..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.MatrixStacker; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.math.Vec3d; - -public abstract class AnimatedSceneElement extends MetaDocSceneElement { - - protected Vec3d fadeVec; - protected LerpedFloat fade; - - public AnimatedSceneElement() { - fade = LerpedFloat.linear() - .startWithValue(0); - } - - public void setFade(float fade) { - this.fade.setValue(fade); - } - - public void setFadeVec(Vec3d fadeVec) { - this.fadeVec = fadeVec; - } - - @Override - public final void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { - ms.push(); - float currentFade = fade.getValue(Minecraft.getInstance() - .getRenderPartialTicks()); - if (fadeVec != null) - MatrixStacker.of(ms) - .translate(fadeVec.scale(-1 + currentFade)); - render(world, buffer, ms, currentFade); - ms.pop(); - } - - protected abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade); - - protected int lightCoordsFromFade(float fade) { - int light = 0xF000F0; - if (fade != 1) { - light = (int) (0xF * fade); - light = light << 4 | light << 20; - } - return light; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java deleted file mode 100644 index 29566ef8c..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocElement; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScreen; - -public abstract class MetaDocOverlayElement extends MetaDocElement { - - public void tick() {} - - public abstract void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java deleted file mode 100644 index a5507a70a..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocElement; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; - -import net.minecraft.client.renderer.IRenderTypeBuffer; - -public abstract class MetaDocSceneElement extends MetaDocElement { - - public abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java deleted file mode 100644 index 5df7d845b..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.ParrotEntity; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; - -public class ParrotElement extends AnimatedSceneElement { - - private Vec3d location; - private ParrotEntity entity; - - public ParrotElement(Vec3d location) { - this.location = location; - } - - @Override - public void tick() { - super.tick(); - if (entity == null) - return; - entity.ticksExisted++; - -// entity.prevRotationYawHead = entity.rotationYawHead; - entity.oFlapSpeed = entity.flapSpeed; - entity.oFlap = entity.flap; - entity.onGround = true; - -// entity.rotationYawHead++; - entity.flapSpeed = .5f; - entity.flap = 1; -// entity.flap += entity.flapSpeed; -// entity.flap += .5f + Create.random.nextFloat(); - } - - @Override - protected void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { - EntityRendererManager entityrenderermanager = Minecraft.getInstance() - .getRenderManager(); - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); - - if (entity == null) { - entity = new ParrotEntity(EntityType.PARROT, world); - entity.setVariant(Create.random.nextInt(5)); -// entity.setPartying(BlockPos.ZERO, true); - } - - ms.push(); - ms.translate(location.x, location.y, location.z); - - MatrixStacker.of(ms) - .rotateY(AnimationTickHolder.getRenderTick() * 15) - .rotateZ(30); - ms.translate(-.25f, 0, 0); - - entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); - ms.pop(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java deleted file mode 100644 index 4cbb84268..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import java.util.List; -import java.util.function.Supplier; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScreen; -import com.simibubi.create.foundation.utility.ColorHelper; - -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; -import net.minecraftforge.fml.client.gui.GuiUtils; - -public class TextWindowElement extends AnimatedOverlayElement { - - Supplier textGetter; - String bakedText; - Vec3d vec; - - public TextWindowElement(Supplier textGetter) { - this.textGetter = textGetter; - } - - public TextWindowElement moveTo(Vec3d vec) { - this.vec = vec; - return this; - } - - @Override - protected void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks, float fade) { - if (bakedText == null) - bakedText = textGetter.get(); - if (fade < 1 / 16f) - return; - Vec2f sceneToScreen = scene.getTransform() - .sceneToScreen(vec); - int targetX = screen.width * 6 / 8; - int textWidth = screen.width - targetX; - - List list = screen.getFontRenderer() - .listFormattedStringToWidth(bakedText, textWidth); - int boxWidth = 0; - for (String string : list) - boxWidth = Math.max(boxWidth, screen.getFontRenderer() - .getStringWidth(string)); - int boxHeight = screen.getFontRenderer() - .getWordWrappedHeight(bakedText, textWidth); - - RenderSystem.pushMatrix(); - RenderSystem.translatef(0, sceneToScreen.y, 400); - - screen.renderBox(targetX - 10, 3, boxWidth, boxHeight -1 , 0x55000000, 0x30eebb00, 0x10eebb00); - - RenderSystem.pushMatrix(); - RenderSystem.translatef(sceneToScreen.x, 0, 0); - double lineTarget = (targetX - sceneToScreen.x) * fade; - RenderSystem.scaled(lineTarget, 1, 1); - GuiUtils.drawGradientRect(-100, 0, 0, 1, 1, 0xFFFFFFFF, 0xFFFFFFFF); - GuiUtils.drawGradientRect(-100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); - RenderSystem.popMatrix(); - - screen.getFontRenderer() - .drawSplitString(bakedText, targetX - 10, 3, textWidth, ColorHelper.applyAlpha(0xeeeeee, fade)); - RenderSystem.popMatrix(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java deleted file mode 100644 index 1824e7187..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.simibubi.create.foundation.metadoc.instructions; - -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.Select; - -public class ShowCompleteSchematicInstruction extends MetaDocInstruction { - - @Override - public void tick(MetaDocScene scene) { - scene.addElement(Select.everything(scene) - .asElement()); - } - - @Override - public boolean isComplete() { - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java deleted file mode 100644 index f1d232d29..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.foundation.metadoc.instructions; - -import java.util.function.Supplier; - -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.elements.TextWindowElement; - -import net.minecraft.util.math.Vec3d; - -public class TextWindowInstruction extends TickingInstruction { - - private TextWindowElement element; - private int fadeTime; - - public TextWindowInstruction(Supplier text, int fadeTime, int duration, Vec3d position) { - super(false, duration + 2 * fadeTime); - this.fadeTime = fadeTime; - element = new TextWindowElement(text).moveTo(position); - } - - @Override - protected void firstTick(MetaDocScene scene) { - super.firstTick(scene); - scene.addElement(element); - element.setVisible(true); - element.setFade(0); - } - - @Override - public void tick(MetaDocScene scene) { - super.tick(scene); - int elapsed = totalTicks - remainingTicks; - - if (elapsed < fadeTime) { - float fade = (elapsed / (float) fadeTime); - element.setFade(fade * fade); - - } else if (remainingTicks < fadeTime) { - float fade = (remainingTicks / (float) fadeTime); - element.setFade(fade * fade); - - } else - element.setFade(1); - - if (remainingTicks == 0) { - element.setFade(0); - element.setFade(0); - element.setVisible(false); - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java deleted file mode 100644 index 0fc337b00..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.simibubi.create.foundation.metadoc.instructions; - -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.Select; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; - -public abstract class WorldModifyInstruction extends MetaDocInstruction { - - private Select selection; - - public WorldModifyInstruction(Select selection) { - this.selection = selection; - } - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(MetaDocScene scene) { - runModification(selection, scene); - if (needsRedraw()) - scene.forEach(WorldSectionElement.class, wse -> wse.queueRedraw(scene.getWorld())); - } - - protected abstract void runModification(Select selection, MetaDocScene scene); - - protected abstract boolean needsRedraw(); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java similarity index 57% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java index 753d454c8..e22fcae23 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java @@ -1,10 +1,10 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; -public class MetaDocElement { +public class PonderElement { boolean visible = true; - public void tick() {} + public void tick(PonderScene scene) {} public boolean isVisible() { return 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 new file mode 100644 index 000000000..10316af3f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java @@ -0,0 +1,15 @@ +package com.simibubi.create.foundation.ponder; + +public abstract class PonderInstruction { + + public boolean isBlocking() { + return false; + } + + public void reset(PonderScene scene) {} + + public abstract boolean isComplete(); + + public abstract void tick(PonderScene scene); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java similarity index 77% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java index 55b28c150..2ab41b185 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.util.HashMap; import java.util.Map; @@ -6,12 +6,12 @@ import java.util.Map; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; +import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.util.ResourceLocation; -public class MetaDocLocalization { +public class PonderLocalization { static Map shared = new HashMap<>(); static Map>> specific = new HashMap<>(); @@ -31,13 +31,13 @@ public class MetaDocLocalization { // public static String getShared(String key) { - if (MetaDocIndex.EDITOR_MODE) + if (PonderIndex.EDITOR_MODE) return shared.get(key); return Lang.translate(langKeyForShared(key)); } public static String getSpecific(ResourceLocation component, int scene, String k) { - if (MetaDocIndex.EDITOR_MODE) + if (PonderIndex.EDITOR_MODE) return specific.get(component) .get(scene) .get(k); @@ -46,10 +46,14 @@ public class MetaDocLocalization { // - static final String LANG_PREFIX = "metadoc."; + static final String LANG_PREFIX = "ponder."; public static JsonElement record() { JsonObject object = new JsonObject(); + + addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder"); + addGeneral(object, PonderUI.PONDERING, "Pondering about..."); + shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); specific.forEach((rl, map) -> { String component = rl.getPath(); @@ -62,6 +66,10 @@ public class MetaDocLocalization { }); return object; } + + private static void addGeneral(JsonObject json, String key, String enUS) { + json.addProperty(Create.ID + "." + key, enUS); + } protected static String langKeyForSpecific(String component, int scene, String k) { return LANG_PREFIX + component + ".scene_" + scene + "." + k; diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java similarity index 56% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 7d94caf57..fcc7945d1 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.io.BufferedInputStream; import java.io.DataInputStream; @@ -12,8 +12,9 @@ import java.util.zip.GZIPInputStream; import com.google.gson.JsonElement; import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; -import com.simibubi.create.foundation.metadoc.content.SharedText; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.SharedText; import com.tterrag.registrate.util.entry.ItemProviderEntry; import net.minecraft.client.Minecraft; @@ -26,38 +27,38 @@ import net.minecraft.util.math.Vec3i; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; -public class MetaDocs { +public class PonderRegistry { - static Map> all = new HashMap<>(); + static Map> all = new HashMap<>(); - public static void addStoryBoard(ItemProviderEntry component, MetaDocStoryBoard storyBoard) { + public static void addStoryBoard(ItemProviderEntry component, PonderStoryBoard storyBoard) { ResourceLocation id = component.getId(); all.computeIfAbsent(id, $ -> new ArrayList<>()) .add(storyBoard); } - public static List compile(ResourceLocation id) { + public static List compile(ResourceLocation id) { - if (MetaDocIndex.EDITOR_MODE) { - MetaDocLocalization.shared.clear(); - MetaDocLocalization.specific.clear(); + if (PonderIndex.EDITOR_MODE) { + PonderLocalization.shared.clear(); + PonderLocalization.specific.clear(); SharedText.gatherText(); } - List list = all.get(id); - List scenes = new ArrayList<>(); + List list = all.get(id); + List scenes = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { - MetaDocStoryBoard sb = list.get(i); + PonderStoryBoard sb = list.get(i); Template activeTemplate = loadSchematic(sb.getSchematicName()); - MetaDocWorld world = new MetaDocWorld(BlockPos.ZERO, Minecraft.getInstance().world); + PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); world.createBackup(); - MetaDocScene scene = new MetaDocScene(world, id, i); - MetaDocLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - sb.program(scene.builder(), world.getBounds() - .getLength()); + PonderScene scene = new PonderScene(world, id, i); + PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); + SceneBuilder builder = scene.builder(); + sb.program(builder, builder.getSceneBuildingUtil()); scene.begin(); scenes.add(scene); @@ -68,33 +69,34 @@ public class MetaDocs { public static Template loadSchematic(String path) { Template t = new Template(); - String filepath = "doc/" + path + ".nbt"; + String filepath = "ponder/" + path + ".nbt"; InputStream resourceAsStream = Create.class.getClassLoader() .getResourceAsStream(filepath); if (resourceAsStream == null) - throw new IllegalStateException("Could not find metadoc schematic: " + filepath); + throw new IllegalStateException("Could not find ponder schematic: " + filepath); try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); t.read(nbt); } catch (IOException e) { - Create.logger.warn("Failed to read metadoc schematic", e); + Create.logger.warn("Failed to read ponder schematic", e); } return t; } public static JsonElement provideLangEntries() { - MetaDocIndex.register(); + PonderIndex.register(); SharedText.gatherText(); all.forEach((id, list) -> { for (int i = 0; i < list.size(); i++) { - MetaDocStoryBoard sb = list.get(i); - MetaDocScene scene = new MetaDocScene(null, id, i); - MetaDocLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - sb.program(scene.builder(), Vec3i.NULL_VECTOR); + 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()); } }); - return MetaDocLocalization.record(); + return PonderLocalization.record(); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java new file mode 100644 index 000000000..84fd7d8f5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -0,0 +1,462 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +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.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.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.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.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 { + + List schedule, activeSchedule; + Set elements; + PonderWorld world; + ResourceLocation component; + int sceneIndex; + SceneTransform transform; + public boolean finished; + SceneRenderInfo info; + Outliner outliner; + + Vec3d pointOfInterest; + Vec3d chasingPointOfInterest; + + private int offsetX; + private int offsetZ; + private int size; + + public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { + pointOfInterest = Vec3d.ZERO; + + this.world = world; + this.component = component; + this.sceneIndex = sceneIndex; + + outliner = new Outliner(); + elements = new HashSet<>(); + schedule = new ArrayList<>(); + activeSchedule = new ArrayList<>(); + transform = new SceneTransform(); + size = getBounds().getXSize(); + info = new SceneRenderInfo(); + } + + public String getTitle() { + return getString("title"); + } + + public String getString(String key) { + return PonderLocalization.getSpecific(component, sceneIndex, key); + } + + public void reset() { + activeSchedule.clear(); + schedule.forEach(mdi -> mdi.reset(this)); + } + + public void begin() { + reset(); + world.restore(); + transform = new SceneTransform(); + finished = false; + forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); + elements.clear(); + activeSchedule.addAll(schedule); + } + + public void fadeOut() { + reset(); + activeSchedule.add(new HideAllInstruction(10, null)); + } + + public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms) { + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + + ms.push(); + forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms)); + for (RenderType type : RenderType.getBlockLayers()) + forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms)); + forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms)); + info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt)); + world.renderParticles(ms, buffer, info); + outliner.renderOutlines(ms, buffer); + ms.pop(); + } + + public void renderOverlay(PonderUI screen, MatrixStack ms, float partialTicks) { + ms.push(); + forEachVisible(PonderOverlayElement.class, e -> e.render(this, screen, ms, partialTicks)); + ms.pop(); + } + + public void setPointOfInterest(Vec3d poi) { + if (chasingPointOfInterest == null) + pointOfInterest = poi; + chasingPointOfInterest = poi; + } + + public Vec3d getPointOfInterest() { + return pointOfInterest; + } + + public void tick() { + if (chasingPointOfInterest != null) + pointOfInterest = VecHelper.lerp(.25f, pointOfInterest, chasingPointOfInterest); + + outliner.tickOutlines(); + world.tickParticles(); + transform.tick(); + forEach(e -> e.tick(this)); + + for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { + PonderInstruction instruction = iterator.next(); + instruction.tick(this); + if (instruction.isComplete()) { + iterator.remove(); + continue; + } + if (instruction.isBlocking()) + break; + } + + if (activeSchedule.isEmpty()) + finished = true; + } + + public void addElement(PonderElement e) { + elements.add(e); + } + + public PonderWorld getWorld() { + return world; + } + + public Set getElements() { + return elements; + } + + public void forEach(Consumer function) { + for (PonderElement elemtent : elements) + function.accept(elemtent); + } + + public void forEach(Class type, Consumer function) { + for (PonderElement element : elements) + if (type.isInstance(element)) + function.accept(type.cast(element)); + } + + public void forEachVisible(Class type, Consumer function) { + for (PonderElement element : elements) + if (type.isInstance(element) && element.isVisible()) + function.accept(type.cast(element)); + } + + public MutableBoundingBox getBounds() { + return world == null ? new MutableBoundingBox() : world.getBounds(); + } + + public SceneBuilder builder() { + return new SceneBuilder(); + } + + private Supplier textGetter(String key) { + return () -> PonderLocalization.getSpecific(component, sceneIndex, key); + } + + public SceneTransform getTransform() { + return transform; + } + + public class SceneTransform { + + public LerpedFloat xRotation, yRotation; + + // Screen params + int width, height; + double offset; + Matrix4f cachedMat; + + public SceneTransform() { + xRotation = LerpedFloat.angular() + .startWithValue(-35); + yRotation = LerpedFloat.angular() + .startWithValue(55 + 90); + } + + public void tick() { + xRotation.tickChaser(); + yRotation.tickChaser(); + } + + public void updateScreenParams(int width, int height, double offset) { + this.width = width; + this.height = height; + this.offset = offset; + cachedMat = null; + } + + public MatrixStack apply(MatrixStack ms) { + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + ms.translate(width / 2, height / 2, 200); + + MatrixStacker.of(ms) + .rotateX(-35) + .rotateY(55); + ms.translate(offset, 0, 0); + MatrixStacker.of(ms) + .rotateY(-55) + .rotateX(35); + + MatrixStacker.of(ms) + .rotateX(xRotation.getValue(pt)) + .rotateY(yRotation.getValue(pt)); + ms.scale(30, -30, 30); + ms.translate((size + offsetX) / -2f, -.5f, (size + offsetZ) / -2f); + + return ms; + } + + public Vec3d screenToScene(float x, float y) { + refreshMatrix(); + Vector4f vec = new Vector4f(x, y, 0, 1); + cachedMat.invert(); + vec.transform(cachedMat); + cachedMat.invert(); + MutableBoundingBox bounds = getBounds(); + return new Vec3d(vec.getX() + bounds.getXSize() / -2f, vec.getY(), vec.getZ() + bounds.getZSize() / -2f); + } + + public Vec2f sceneToScreen(Vec3d vec) { + refreshMatrix(); + Vector4f vec4 = new Vector4f((float) vec.x, (float) vec.y, (float) vec.z, 1); + vec4.transform(cachedMat); + return new Vec2f(vec4.getX(), vec4.getY()); + } + + protected void refreshMatrix() { + if (cachedMat != null) + return; + cachedMat = apply(new MatrixStack()).peek() + .getModel(); + } + + } + + public class SceneRenderInfo extends ActiveRenderInfo { + + public void set(float xRotation, float yRotation) { + setDirection(yRotation, xRotation); + } + + } + + 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, false)); + } + + 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 -> { + if (!nbt.contains("Speed")) + return nbt; + float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); + // TODO speed gauge consistency + nbt.putFloat("Value", Math.abs(newSpeed) / 256f); + return nbt; + }, false)); + + return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { + if (!nbt.contains("Speed")) + return 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 createParrotSpinningOn(BlockPos pos, Direction fadeInDirection) { + return addInstruction(new CreateParrotInstruction(15, fadeInDirection, + ParrotElement.spinOnComponent(new Vec3d(pos).add(.5, 0, .5), pos.down()))); + } + + public SceneBuilder createParrotLookingAtPOI(Vec3d location, Direction fadeInDirection) { + return addInstruction(new CreateParrotInstruction(15, fadeInDirection, ParrotElement.lookAtPOI(location))); + } + + public SceneBuilder movePOI(Vec3d location) { + return addInstruction(new MovePoiInstruction(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 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; + } + +} \ 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 new file mode 100644 index 000000000..1fb3fc6a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java @@ -0,0 +1,14 @@ +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/metadoc/MetaDocTooltipHandler.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java similarity index 66% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java index 75247e7c8..a691b96cc 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -1,15 +1,18 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.util.List; import com.google.common.base.Strings; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.util.InputMappings; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; @@ -18,11 +21,12 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.RenderTooltipEvent; -public class MetaDocTooltipHandler { +public class PonderTooltipHandler { static LerpedFloat holdWProgress = LerpedFloat.linear() .startWithValue(0); static ItemStack lastHoveredStack = null; + public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder"; public static void tick() { Minecraft instance = Minecraft.getInstance(); @@ -39,7 +43,7 @@ public class MetaDocTooltipHandler { ItemStack stack = slotUnderMouse.getStack(); - if (!MetaDocs.all.containsKey(stack.getItem() + if (!PonderRegistry.all.containsKey(stack.getItem() .getRegistryName())) return; @@ -47,14 +51,14 @@ public class MetaDocTooltipHandler { holdWProgress.startWithValue(0); float value = holdWProgress.getValue(); - int keyCode = instance.gameSettings.keyBindForward.getKey() + int keyCode = ponderKeybind().getKey() .getKeyCode(); long window = instance.getWindow() .getHandle(); if (InputMappings.isKeyDown(window, keyCode)) { if (value >= 1) - ScreenOpener.open(new MetaDocScreen(MetaDocs.compile(stack.getItem() + ScreenOpener.open(new PonderUI(PonderRegistry.compile(stack.getItem() .getRegistryName()))); holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); } else @@ -68,7 +72,7 @@ public class MetaDocTooltipHandler { return; float renderPartialTicks = Minecraft.getInstance() .getRenderPartialTicks(); - toolTip.add(makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); + toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); } public static void handleTooltipColor(RenderTooltipEvent.Color event) { @@ -92,29 +96,36 @@ public class MetaDocTooltipHandler { private static int getSmoothColorForProgress(float progress) { if (progress < .5f) return ColorHelper.mixColors(0x5000FF, 5592575, progress * 2); -// if (progress < .75f) -// return ColorHelper.mixColors(16733695, 5636095, (progress - .5f) * 4); return ColorHelper.mixColors(5592575, 0xffffff, (progress - .5f) * 2); } private static ITextComponent makeProgressBar(float progress) { - String bar = ""; - int filledLength = (int) (12 * progress); - bar += Strings.repeat("\u2588", filledLength); - if (progress < 1) - bar += Strings.repeat("\u2592", 12 - filledLength); + String holdW = Lang + .createTranslationTextComponent(HOLD_TO_PONDER, new StringTextComponent(ponderKeybind().getKeyBinding() + .getLocalizedName()).applyTextStyle(TextFormatting.WHITE)) + .applyTextStyle(TextFormatting.GRAY) + .getFormattedText(); - TextFormatting color = TextFormatting.DARK_GRAY; - if (progress > 0) - color = TextFormatting.GRAY; - if (progress == 1f) - color = TextFormatting.WHITE; + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; + float charWidth = fontRenderer.getStringWidth("|"); + float tipWidth = fontRenderer.getStringWidth(holdW); - ITextComponent leftBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); - ITextComponent rightBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); - ITextComponent barComponent = new StringTextComponent(bar).applyTextStyle(color); - return leftBr.appendSibling(barComponent) - .appendSibling(rightBr); + int total = (int) (tipWidth / charWidth); + int current = (int) (progress * total); + + if (progress > 0) { + String bars = ""; + bars += TextFormatting.WHITE + Strings.repeat("|", current); + if (progress < 1) + bars += TextFormatting.GRAY + Strings.repeat("|", total - current); + return new StringTextComponent(bars); + } + + return new StringTextComponent(holdW); + } + + protected static KeyBinding ponderKeybind() { + return Minecraft.getInstance().gameSettings.keyBindForward; } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java similarity index 50% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index e9188f03b..04c3b7935 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -1,32 +1,45 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.util.List; +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; import net.minecraft.client.GameSettings; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.MutableBoundingBox; import net.minecraftforge.fml.client.gui.GuiUtils; +import net.minecraftforge.registries.ForgeRegistries; -public class MetaDocScreen extends AbstractSimiScreen { +public class PonderUI extends AbstractSimiScreen { - private List scenes; + public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering"; + private List scenes; private LerpedFloat fadeIn; + ItemStack stack; private LerpedFloat lazyIndex; private int index = 0; - public MetaDocScreen(List scenes) { + private PonderButton left, right, icon; + + public PonderUI(List scenes) { this.scenes = scenes; lazyIndex = LerpedFloat.linear() .startWithValue(index); @@ -35,6 +48,39 @@ public class MetaDocScreen extends AbstractSimiScreen { .chase(1, .1f, Chaser.EXP); } + @Override + protected void init() { + super.init(); + widgets.clear(); + + ResourceLocation component = scenes.get(0).component; + if (ForgeRegistries.ITEMS.containsKey(component)) + stack = new ItemStack(ForgeRegistries.ITEMS.getValue(component)); + else + stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); + + int bY = height - 20 - 31; + widgets.add(icon = new PonderButton(31, 31, () -> { + }).showing(stack) + .fade(0, -1)); + + int spacing = 8; + int bX = (width - 20) / 2 - (20 + spacing); + GameSettings bindings = minecraft.gameSettings; + widgets.add(left = new PonderButton(bX, bY, () -> this.scroll(false)).showing(AllIcons.I_MTD_LEFT) + .shortcut(bindings.keyBindLeft) + .fade(0, -1)); + bX += 20 + spacing; + widgets.add(new PonderButton(bX, bY, this::onClose).showing(AllIcons.I_MTD_CLOSE) + .shortcut(bindings.keyBindInventory) + .fade(0, -1)); + bX += 20 + spacing; + widgets.add(right = new PonderButton(bX, bY, () -> this.scroll(true)).showing(AllIcons.I_MTD_RIGHT) + .shortcut(bindings.keyBindRight) + .fade(0, -1)); + + } + @Override public void tick() { lazyIndex.tickChaser(); @@ -73,30 +119,65 @@ public class MetaDocScreen extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderStories(partialTicks); + renderVisibleScenes(partialTicks); renderWidgets(mouseX, mouseY, partialTicks); } - protected void renderStories(float partialTicks) { - renderStory(index, partialTicks); + protected void renderVisibleScenes(float partialTicks) { + renderScene(index, partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks); if (Math.abs(lazyIndexValue - index) > 1 / 512f) - renderStory(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + renderScene(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); } - protected void renderStory(int i, float partialTicks) { + protected void renderScene(int i, float partialTicks) { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); - MetaDocScene story = scenes.get(i); + PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); double value = lazyIndex.getValue(partialTicks); double diff = i - value; double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; + RenderSystem.enableAlphaTest(); + RenderSystem.enableBlend(); + RenderSystem.enableDepthTest(); + ms.push(); story.transform.updateScreenParams(width, height, slide); story.transform.apply(ms); story.renderScene(buffer, ms); buffer.draw(); + + // coords for debug + if (PonderIndex.EDITOR_MODE) { + MutableBoundingBox bounds = story.getBounds(); + + RenderSystem.pushMatrix(); + RenderSystem.multMatrix(ms.peek().getModel()); + RenderSystem.scaled(-1/16d, -1/16d, 1/16d); + RenderSystem.translated(1, -8, -1/64f); + + RenderSystem.pushMatrix(); + for (int x = 0; x <= bounds.getXSize(); x++) { + RenderSystem.translated(-16, 0, 0); + font.drawString(x == bounds.getXSize() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); + } + RenderSystem.popMatrix(); + + RenderSystem.pushMatrix(); + RenderSystem.scaled(-1, 1, 1); + RenderSystem.rotatef(-90, 0, 1, 0); + RenderSystem.translated(-8, -2, 2/64f); + for (int z = 0; z <= bounds.getZSize(); z++) { + RenderSystem.translated(16, 0, 0); + font.drawString(z == bounds.getZSize() ? "z" : "" + z, 0, 0, 0xFFFFFFFF); + } + RenderSystem.popMatrix(); + + buffer.draw(); + RenderSystem.popMatrix(); + } + ms.pop(); } @@ -107,41 +188,68 @@ public class MetaDocScreen extends AbstractSimiScreen { int textColor = 0xeeeeee; { - int y = 34; - drawString(font, "MetaDoc Experimental 0", 50, y, textColor); - y += 10; - drawString(font, "> " + scenes.get(index) - .getTitle(), 50, y, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); - y += 10; - if (MetaDocIndex.EDITOR_MODE) - drawString(font, "Mouse: " + mouseX + ", " + mouseY, 50, y, 0x8d8d8d); + // Chapter title + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 800); + int x = icon.x + icon.getWidth() + 8; + int y = icon.y; + drawString(font, Lang.translate(PONDERING), x, y, 0xffa3a3a3); + y += 12; + x += 0; + RenderSystem.translated(0, 3 * (indexDiff), 0); + font.drawSplitString(scenes.get(index) + .getTitle(), x, y, left.x - x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + RenderSystem.popMatrix(); } - // Scene overlay - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 100); - renderOverlay(index, partialTicks); - if (indexDiff > 1 / 512f) - renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); - RenderSystem.popMatrix(); + { + // Scene overlay + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 100); + renderOverlay(index, partialTicks); + if (indexDiff > 1 / 512f) + renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + RenderSystem.popMatrix(); + } + + // Widgets + widgets.forEach(w -> { + if (w instanceof PonderButton) { + PonderButton mtdButton = (PonderButton) w; + mtdButton.fade(fade); + } + }); + + if (index == 0 || index == 1 && lazyIndexValue < index) + left.fade(lazyIndexValue); + if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) + right.fade(scenes.size() - lazyIndexValue - 1); + + if (scenes.get(index).finished) + right.flash(); + else + right.dim(); + } + + protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { + int bWidth = 20; + int bHeight = 20; + int bX = (width - bWidth) / 2 + (index - 1) * (bWidth + 8); + int bY = height - bHeight - 31; - // Close button RenderSystem.pushMatrix(); if (fade < fadeIn.getChaseTarget()) RenderSystem.translated(0, (1 - fade) * 5, 0); - int closeWidth = 24; - int closeHeight = 24; - int closeX = (width - closeWidth) / 2; - int closeY = height - closeHeight - 31; - boolean hovered = isMouseOver(mouseX, mouseY, closeX, closeY, closeWidth, closeHeight); - renderBox(closeX, closeY, closeWidth, closeHeight, hovered); - AllIcons.I_CONFIRM.draw(closeX + 4, closeY + 4); + boolean hovered = isMouseOver(mouseX, mouseY, bX, bY, bWidth, bHeight); + renderBox(bX, bY, bWidth, bHeight, hovered); + icon.draw(bX + 2, bY + 2); + drawCenteredString(font, key.getLocalizedName(), bX + bWidth / 2 + 8, bY + bHeight - 6, 0xff606060); RenderSystem.popMatrix(); } private void renderOverlay(int i, float partialTicks) { RenderSystem.pushMatrix(); - MetaDocScene story = scenes.get(i); + PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); story.renderOverlay(this, ms, partialTicks); RenderSystem.popMatrix(); @@ -149,14 +257,22 @@ public class MetaDocScreen extends AbstractSimiScreen { @Override public boolean mouseClicked(double x, double y, int button) { - int closeWidth = 24; - int closeHeight = 24; - int closeX = (width - closeWidth) / 2; - int closeY = height - closeHeight - 31; - if (isMouseOver(x, y, closeX, closeY, closeWidth, closeHeight)) { - onClose(); + MutableBoolean handled = new MutableBoolean(false); + widgets.forEach(w -> { + if (handled.booleanValue()) + return; + if (!w.isMouseOver(x, y)) + return; + if (w instanceof PonderButton) { + PonderButton mtdButton = (PonderButton) w; + mtdButton.runCallback(); + handled.setTrue(); + return; + } + }); + + if (handled.booleanValue()) return true; - } return super.mouseClicked(x, y, button); } @@ -188,7 +304,7 @@ public class MetaDocScreen extends AbstractSimiScreen { return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } - + public FontRenderer getFontRenderer() { return font; } @@ -203,11 +319,12 @@ public class MetaDocScreen extends AbstractSimiScreen { drawString(font, s, x, y, color); } - public void renderBox(int x, int y, int w, int h, boolean highlighted) { + public static void renderBox(int x, int y, int w, int h, boolean highlighted) { renderBox(x, y, w, h, 0xdd000000, highlighted ? 0x70ffffff : 0x30eebb00, highlighted ? 0x30ffffff : 0x10eebb00); } - public void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, int borderColorEnd) { + public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, + int borderColorEnd) { int zLevel = 100; GuiUtils.drawGradientRect(zLevel, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java new file mode 100644 index 000000000..0c67d647a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -0,0 +1,158 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Nullable; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.schematics.SchematicWorld; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import net.minecraftforge.registries.ForgeRegistries; + +public class PonderWorld extends SchematicWorld { + + protected Map originalBlocks; + protected Map originalTileEntities; + protected PonderWorldParticles particles; + + int overrideLight; + Select mask; + + public PonderWorld(BlockPos anchor, World original) { + super(anchor, original); + originalBlocks = new HashMap<>(); + originalTileEntities = new HashMap<>(); + particles = new PonderWorldParticles(this); + } + + public void createBackup() { + originalBlocks.clear(); + originalTileEntities.clear(); + blocks.forEach((k, v) -> originalBlocks.put(k, v)); + tileEntities.forEach((k, v) -> originalTileEntities.put(k, TileEntity.create(v.write(new CompoundNBT())))); + } + + public void restore() { + blocks.clear(); + tileEntities.clear(); + renderedTileEntities.clear(); + originalBlocks.forEach((k, v) -> blocks.put(k, v)); + originalTileEntities.forEach((k, v) -> { + TileEntity te = TileEntity.create(v.write(new CompoundNBT())); + te.setLocation(this, te.getPos()); + tileEntities.put(k, te); + renderedTileEntities.add(te); + }); + particles.clearEffects(); + } + + public void pushFakeLight(int light) { + this.overrideLight = light; + } + + public void popLight() { + this.overrideLight = -1; + } + + @Override + public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { + return overrideLight == -1 ? 15 : overrideLight; + } + + public void setMask(Select mask) { + this.mask = mask; + } + + public void clearMask() { + this.mask = null; + } + + @Override + public BlockState getBlockState(BlockPos globalPos) { + if (mask != null && !mask.test(globalPos.subtract(anchor))) + return Blocks.AIR.getDefaultState(); + return super.getBlockState(globalPos); + } + + @Override // For particle collision + public IBlockReader getExistingChunk(int p_225522_1_, int p_225522_2_) { + return this; + } + + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari) { + particles.renderParticles(ms, buffer, ari); + } + + public void tickParticles() { + particles.tick(); + } + + @Override + public void addParticle(IParticleData data, double x, double y, double z, double mx, double my, double mz) { + addParticle(makeParticle(data, x, y, z, mx, my, mz)); + } + + @Nullable + @SuppressWarnings("unchecked") + private Particle makeParticle(T data, double x, double y, double z, double mx, double my, + double mz) { + ParticleManager particleManager = Minecraft.getInstance().particles; + ResourceLocation key = ForgeRegistries.PARTICLE_TYPES.getKey(data.getType()); + IParticleFactory iparticlefactory = (IParticleFactory) particleManager.factories.get(key); + return iparticlefactory == null ? null : iparticlefactory.makeParticle(data, this, x, y, z, mx, my, mz); + } + + public void addParticle(Particle p) { + if (p != null) + particles.addParticle(p); + } + + public void addBlockDestroyEffects(BlockPos pos, BlockState state) { + VoxelShape voxelshape = state.getShape(this, pos); + AxisAlignedBB bb = voxelshape.getBoundingBox(); + double d1 = Math.min(1.0D, bb.maxX - bb.minX); + double d2 = Math.min(1.0D, bb.maxY - bb.minY); + double d3 = Math.min(1.0D, bb.maxZ - bb.minZ); + int i = Math.max(2, MathHelper.ceil(d1 / 0.25D)); + int j = Math.max(2, MathHelper.ceil(d2 / 0.25D)); + int k = Math.max(2, MathHelper.ceil(d3 / 0.25D)); + + for (int l = 0; l < i; ++l) { + for (int i1 = 0; i1 < j; ++i1) { + for (int j1 = 0; j1 < k; ++j1) { + double d4 = (l + 0.5D) / i; + double d5 = (i1 + 0.5D) / j; + double d6 = (j1 + 0.5D) / k; + double d7 = d4 * d1 + bb.minX; + double d8 = d5 * d2 + bb.minY; + double d9 = d6 * d3 + bb.minZ; + addParticle(new BlockParticleData(ParticleTypes.BLOCK, state), pos.getX() + d7, pos.getY() + d8, + pos.getZ() + d9, d4 - 0.5D, d5 - 0.5D, d6 - 0.5D); + } + } + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java new file mode 100644 index 000000000..902c1e766 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java @@ -0,0 +1,109 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Queue; + +import com.google.common.collect.EvictingQueue; +import com.google.common.collect.Maps; +import com.google.common.collect.Queues; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Tessellator; + +public class PonderWorldParticles { + + private final Map> byType = Maps.newIdentityHashMap(); + private final Queue queue = Queues.newArrayDeque(); + + PonderWorld world; + + public PonderWorldParticles(PonderWorld world) { + this.world = world; + } + + public void addParticle(Particle p) { + this.queue.add(p); + } + + public void tick() { + this.byType.forEach((p_228347_1_, p_228347_2_) -> this.tickParticleList(p_228347_2_)); + + Particle particle; + if (queue.isEmpty()) + return; + while ((particle = this.queue.poll()) != null) + this.byType.computeIfAbsent(particle.getRenderType(), $ -> EvictingQueue.create(16384)) + .add(particle); + } + + private void tickParticleList(Collection p_187240_1_) { + if (p_187240_1_.isEmpty()) + return; + + Iterator iterator = p_187240_1_.iterator(); + while (iterator.hasNext()) { + Particle particle = iterator.next(); + particle.tick(); + if (!particle.isAlive()) + iterator.remove(); + } + } + + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_) { + Minecraft mc = Minecraft.getInstance(); + LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager(); + float p_228345_5_ = mc.getRenderPartialTicks(); + + p_228345_3_.enableLightmap(); + Runnable enable = () -> { + RenderSystem.enableAlphaTest(); + RenderSystem.defaultAlphaFunc(); + RenderSystem.enableDepthTest(); + RenderSystem.enableFog(); + }; + RenderSystem.pushMatrix(); + RenderSystem.multMatrix(ms.peek() + .getModel()); + + for (IParticleRenderType iparticlerendertype : this.byType.keySet()) { // Forge: allow custom + // IParticleRenderType's + if (iparticlerendertype == IParticleRenderType.NO_RENDER) + continue; + enable.run(); // Forge: MC-168672 Make sure all render types have the correct GL state. + Iterable iterable = this.byType.get(iparticlerendertype); + if (iterable != null) { + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferbuilder = tessellator.getBuffer(); + iparticlerendertype.beginRender(bufferbuilder, mc.textureManager); + + for (Particle particle : iterable) + particle.buildGeometry(bufferbuilder, p_228345_4_, p_228345_5_); + + iparticlerendertype.finishRender(tessellator); + } + } + + RenderSystem.popMatrix(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + RenderSystem.defaultAlphaFunc(); + p_228345_3_.disableLightmap(); + RenderSystem.disableFog(); + } + + public void clearEffects() { + this.byType.clear(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Select.java b/src/main/java/com/simibubi/create/foundation/ponder/Select.java new file mode 100644 index 000000000..869482b0f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/Select.java @@ -0,0 +1,167 @@ +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/content/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java new file mode 100644 index 000000000..921db2309 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java @@ -0,0 +1,42 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.foundation.ponder.PonderStoryBoard; +import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class CogwheelStory extends PonderStoryBoard { + + public CogwheelStory() { + } + + @Override + public String getSchematicName() { + return "cogwheel/first"; + } + + @Override + public String getStoryTitle() { + return "My First Ponder Story, Parrots"; + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + + scene.movePOI(new Vec3d(3.5, 4, 4.5)); + scene.showBasePlate(); + scene.idle(10); + + scene.createParrotSpinningOn(new BlockPos(1, 4, 2), Direction.DOWN); + scene.showSection(util.layersFrom(1), Direction.DOWN); + + scene.idle(10); + scene.rotateCameraY(180); + + } + +} 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 new file mode 100644 index 000000000..2d3327ba5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -0,0 +1,198 @@ +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.AllItems; +import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; +import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; +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.instructions.EmitParticlesInstruction; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.tterrag.registrate.util.entry.ItemEntry; + +import net.minecraft.block.Blocks; +import net.minecraft.item.Item; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; + +public abstract class DebugScenes extends PonderStoryBoard { + + private int index; + + public static void registerAll() { + 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)); + } + + public DebugScenes(int index) { + this.index = index; + } + + @Override + public final String getSchematicName() { + return "debug/scene_" + index; + } + + @Override + public String getStoryTitle() { + return "Debug Scene " + index + (getTitle().isEmpty() ? "" : ": " + getTitle()); + } + + protected String getTitle() { + return ""; + } + + static class CoordinateScene extends DebugScenes { + + public CoordinateScene(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.5, 1.5, 1.5), "coordinate", "Schematic orientation: ", 40); + + scene.idle(10); + scene.showSelectionWithText(PonderPalette.RED, Select.fromTo(2, 1, 1, 4, 1, 1), "x", "Das X axis", 20); + scene.idle(20); + scene.showSelectionWithText(PonderPalette.GREEN, Select.fromTo(1, 2, 1, 1, 4, 1), "y", "Das Y axis", 20); + scene.idle(20); + scene.showSelectionWithText(PonderPalette.BLUE, Select.fromTo(1, 1, 2, 1, 1, 4), "z", "Das Z axis", 20); + scene.idle(10); + } + + @Override + protected String getTitle() { + return "Coordinate Space"; + } + + } + + static class BlocksScene extends DebugScenes { + + public BlocksScene(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); + scene.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000); + scene.idle(20); + scene.replaceBlocks(Select.fromTo(1, 1, 2, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState()); + scene.idle(10); + scene.replaceBlocks(Select.pos(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState()); + scene.markAsFinished(); + } + + @Override + protected String getTitle() { + return "Changing Blocks"; + } + + } + + 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 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 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"; + } + + } + +} 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 new file mode 100644 index 000000000..4a560622f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.ponder.content; + +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) + + PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + + PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftAsRelay()); + PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftsCanBeEncased()); + + DebugScenes.registerAll(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java new file mode 100644 index 000000000..ede4108ed --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.ponder.content; + +public enum PonderPalette { + + WHITE(0xFF_eeeeee), + BLACK(0xFF_221111), + + RED(0xFF_ff5d6c), + GREEN(0xFF_8cba51), + BLUE(0xFF_5f6caf), + + SLOW(0xFF_22ff22), + MEDIUM(0xFF_0084ff), + FAST(0xFF_ff55ff), + + ; + + private int color; + + private PonderPalette(int color) { + this.color = color; + } + + public int getColor() { + return color; + } +} 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 new file mode 100644 index 000000000..90f5fa097 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java @@ -0,0 +1,54 @@ +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; +import net.minecraft.util.math.Vec3i; + +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.showBasePlate(); + + Select encased = util.column(4, 2); + Select gauge = util.column(0, 2); + Select shafts = Select.cuboid(new BlockPos(1, 1, 2), new Vec3i(2, 0, 0)); + + scene.idle(10); + scene.showSection(encased, Direction.DOWN); + scene.idle(10); + scene.showSection(gauge, Direction.DOWN); + scene.setKineticSpeed(gauge, 0); + + scene.idle(20); + scene.showSection(shafts, Direction.DOWN); + scene.setKineticSpeed(gauge, -112); + + scene.idle(10); + scene.showTargetedText(WHITE, new Vec3d(3, 1.5, 2.5), "shaft_relay", + "Shafts seem to 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 new file mode 100644 index 000000000..a93b98143 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java @@ -0,0 +1,55 @@ +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 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); + + scene.setBlocks(andesite, AllBlocks.ANDESITE_ENCASED_SHAFT.getDefaultState() + .with(EncasedShaftBlock.AXIS, Axis.X)); + scene.setKineticSpeed(shaft, -112); + scene.idle(10); + + scene.setBlocks(brass, AllBlocks.BRASS_ENCASED_SHAFT.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", + "I could use Brass or Andesite Casing to hide them.", 1000); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java new file mode 100644 index 000000000..c0c449599 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.foundation.ponder.PonderLocalization; + +public class SharedText { + + public static void gatherText() { + // Add entries used across several ponder scenes (Safe for hotswap) + + add("when_wrenched", "When Wrenched"); + add("more_shared", "This is Shared stuff"); + + } + + public static String get(String key) { + return PonderLocalization.getShared(key); + } + + private static void add(String k, String v) { + PonderLocalization.registerShared(k, v); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java new file mode 100644 index 000000000..ef2950bf0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java @@ -0,0 +1,29 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.utility.LerpedFloat; + +public abstract class AnimatedOverlayElement extends PonderOverlayElement { + + protected LerpedFloat fade; + + public AnimatedOverlayElement() { + fade = LerpedFloat.linear() + .startWithValue(0); + } + + public void setFade(float fade) { + this.fade.setValue(fade); + } + + @Override + public final void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks) { + float currentFade = fade.getValue(partialTicks); + render(scene, screen, ms, partialTicks, currentFade); + } + + protected abstract void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks, float fade); + +} 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 new file mode 100644 index 000000000..61326ecba --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java @@ -0,0 +1,80 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.LerpedFloat; +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.Vec3d; + +public abstract class AnimatedSceneElement extends PonderSceneElement { + + protected Vec3d fadeVec; + protected LerpedFloat fade; + + public AnimatedSceneElement() { + fade = LerpedFloat.linear() + .startWithValue(0); + } + + public void setFade(float fade) { + this.fade.setValue(fade); + } + + public void setFadeVec(Vec3d fadeVec) { + this.fadeVec = fadeVec; + } + + @Override + public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { + ms.push(); + float currentFade = applyFade(ms); + renderFirst(world, buffer, ms, currentFade); + ms.pop(); + } + + @Override + public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) { + ms.push(); + float currentFade = applyFade(ms); + renderLayer(world, buffer, type, ms, currentFade); + ms.pop(); + } + + @Override + public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { + ms.push(); + float currentFade = applyFade(ms); + renderLast(world, buffer, ms, currentFade); + ms.pop(); + } + + protected float applyFade(MatrixStack ms) { + float currentFade = fade.getValue(Minecraft.getInstance() + .getRenderPartialTicks()); + if (fadeVec != null) + MatrixStacker.of(ms) + .translate(fadeVec.scale(-1 + currentFade)); + return currentFade; + } + + protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, + float fade) {} + + protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} + + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} + + protected int lightCoordsFromFade(float fade) { + int light = 0xF000F0; + if (fade != 1) { + light = (int) (0xF * fade); + light = light << 4 | light << 20; + } + return light; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java new file mode 100644 index 000000000..087190cf8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.ponder.elements; + +import java.util.function.Consumer; + +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.utility.outliner.Outliner; + +public class OutlinerElement extends AnimatedSceneElement { + + private Consumer outlinerCall; + + public OutlinerElement(Consumer outlinerCall) { + this.outlinerCall = outlinerCall; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (fade.getValue() < 1/16f) + return; + if (fade.getValue(0) > fade.getValue(1)) + return; + outlinerCall.accept(scene.getOutliner()); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java new file mode 100644 index 000000000..428274395 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java @@ -0,0 +1,119 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.command.arguments.EntityAnchorArgument; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.ParrotEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class ParrotElement extends AnimatedSceneElement { + + private Vec3d location; + private ParrotEntity entity; + private ParrotPose pose; + + public static ParrotElement lookAtPOI(Vec3d location) { + ParrotElement parrotElement = new ParrotElement(location); + parrotElement.pose = parrotElement.new FacePointOfInterestPose(); + return parrotElement; + } + + public static ParrotElement spinOnComponent(Vec3d location, BlockPos componentPos) { + ParrotElement parrotElement = new ParrotElement(location); + parrotElement.pose = parrotElement.new SpinOnComponentPose(componentPos); + return parrotElement; + } + + protected ParrotElement(Vec3d location) { + this.location = location; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (entity == null) + return; + + entity.ticksExisted++; + entity.prevRotationYawHead = entity.rotationYawHead; + entity.oFlapSpeed = entity.flapSpeed; + entity.oFlap = entity.flap; + entity.onGround = true; + + pose.tick(scene); + } + + @Override + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + EntityRendererManager entityrenderermanager = Minecraft.getInstance() + .getRenderManager(); + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + + if (entity == null) + pose.create(world); + + ms.push(); + ms.translate(location.x, location.y, location.z); + + MatrixStacker.of(ms) + .rotateY(MathHelper.lerp(pt, entity.prevRotationYaw, entity.rotationYaw)); + + entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); + ms.pop(); + } + + abstract class ParrotPose { + + abstract void tick(PonderScene scene); + + void create(PonderWorld world) { + entity = new ParrotEntity(EntityType.PARROT, world); + entity.setVariant(Create.random.nextInt(5)); + } + + } + + class SpinOnComponentPose extends ParrotPose { + + private BlockPos componentPos; + + public SpinOnComponentPose(BlockPos componentPos) { + this.componentPos = componentPos; + } + + @Override + void tick(PonderScene scene) { + TileEntity tileEntity = scene.getWorld() + .getTileEntity(componentPos); + if (!(tileEntity instanceof KineticTileEntity)) + return; + float rpm = ((KineticTileEntity) tileEntity).getSpeed(); + entity.prevRotationYaw = entity.rotationYaw; + entity.rotationYaw += (rpm * .3f); + } + + } + + class FacePointOfInterestPose extends ParrotPose { + + @Override + void tick(PonderScene scene) { + entity.lookAt(EntityAnchorArgument.Type.EYES, scene.getPointOfInterest()); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java new file mode 100644 index 000000000..89db05a60 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderElement; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderUI; + +public abstract class PonderOverlayElement extends PonderElement { + + public void tick(PonderScene scene) {} + + public abstract void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks); + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java new file mode 100644 index 000000000..e07338444 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderElement; +import com.simibubi.create.foundation.ponder.PonderWorld; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; + +public abstract class PonderSceneElement extends PonderElement { + + public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + + public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms); + + public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java new file mode 100644 index 000000000..cab914bf0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java @@ -0,0 +1,89 @@ +package com.simibubi.create.foundation.ponder.elements; + +import java.util.List; +import java.util.function.Supplier; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.utility.ColorHelper; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.client.gui.GuiUtils; + +public class TextWindowElement extends AnimatedOverlayElement { + + Supplier textGetter; + String bakedText; + + // from 0 to 200 + int y; + + Vec3d vec; + int color; + + public TextWindowElement(Supplier textGetter) { + this.textGetter = textGetter; + } + + public void colored(int color) { + this.color = color; + } + + public TextWindowElement pointAt(Vec3d vec) { + this.vec = vec; + return this; + } + + public TextWindowElement setY(int y) { + this.y = y; + return this; + } + + @Override + protected void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks, float fade) { + if (bakedText == null) + bakedText = textGetter.get(); + if (fade < 1 / 16f) + return; + Vec2f sceneToScreen = vec != null ? scene.getTransform() + .sceneToScreen(vec) : new Vec2f(0, (screen.height - 200) / 2 + y - 8); + + float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; + int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); + int textWidth = screen.width - targetX; + + List list = screen.getFontRenderer() + .listFormattedStringToWidth(bakedText, textWidth); + int boxWidth = 0; + for (String string : list) + boxWidth = Math.max(boxWidth, screen.getFontRenderer() + .getStringWidth(string)); + int boxHeight = screen.getFontRenderer() + .getWordWrappedHeight(bakedText, textWidth); + + RenderSystem.pushMatrix(); + RenderSystem.translatef(0, sceneToScreen.y, 400); + + PonderUI.renderBox(targetX - 10, 3, boxWidth, boxHeight - 1, 0xaa000000, 0x30eebb00, 0x10eebb00); + + int brighterColor = ColorHelper.mixAlphaColors(color, 0xFFffffdd, 1 / 2f); + if (vec != null) { + RenderSystem.pushMatrix(); + RenderSystem.translatef(sceneToScreen.x, 0, 0); + double lineTarget = (targetX - sceneToScreen.x) * fade; + RenderSystem.scaled(lineTarget, 1, 1); + GuiUtils.drawGradientRect(-100, 0, 0, 1, 1, brighterColor, brighterColor); + GuiUtils.drawGradientRect(-100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); + RenderSystem.popMatrix(); + } + + screen.getFontRenderer() + .drawSplitString(bakedText, targetX - 10, 3, textWidth, ColorHelper.applyAlpha(brighterColor, fade)); + RenderSystem.popMatrix(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java similarity index 61% rename from src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java rename to src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index c3f867a6b..4114ba1a4 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc.elements; +package com.simibubi.create.foundation.ponder.elements; import java.util.ArrayList; import java.util.List; @@ -10,8 +10,9 @@ import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.metadoc.Select; +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.utility.SuperByteBuffer; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; @@ -19,6 +20,7 @@ import com.simibubi.create.foundation.utility.TileEntityRenderHelper; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelRenderer; import net.minecraft.client.renderer.BlockRendererDispatcher; @@ -26,9 +28,9 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.fluid.IFluidState; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; @@ -47,11 +49,11 @@ public class WorldSectionElement extends AnimatedSceneElement { this.section = section; } - public void queueRedraw(MetaDocWorld world) { + public void queueRedraw(PonderWorld world) { redraw = true; } - public void tick() { + public void tick(PonderScene scene) { if (renderedTileEntities == null) return; renderedTileEntities.forEach(te -> { @@ -61,7 +63,13 @@ public class WorldSectionElement extends AnimatedSceneElement { } @Override - public void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, + float fade) { + renderStructure(world, ms, buffer, type, fade); + } + + @Override + public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { int light = -1; if (fade != 1) light = (int) (MathHelper.lerp(fade, 5, 14)); @@ -71,36 +79,33 @@ public class WorldSectionElement extends AnimatedSceneElement { world.pushFakeLight(light); renderTileEntities(world, ms, buffer); world.popLight(); + } - if (buffer instanceof IRenderTypeBuffer.Impl) - ((IRenderTypeBuffer.Impl) buffer).draw(); - renderStructure(world, ms, buffer, fade); + protected void renderStructure(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, RenderType type, + float fade) { + SuperByteBufferCache bufferCache = CreateClient.bufferCache; + int code = hashCode() ^ world.hashCode(); + + Pair key = Pair.of(code, RenderType.getBlockLayers() + .indexOf(type)); + if (redraw) + bufferCache.invalidate(DOC_WORLD_SECTION, key); + SuperByteBuffer contraptionBuffer = + bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, type)); + if (contraptionBuffer.isEmpty()) + return; + + int light = lightCoordsFromFade(fade); + contraptionBuffer.light(light) + .renderInto(ms, buffer.getBuffer(type)); + } + + @Override + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { redraw = false; } - protected void renderStructure(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float fade) { - SuperByteBufferCache bufferCache = CreateClient.bufferCache; - List blockLayers = RenderType.getBlockLayers(); - int code = hashCode() ^ world.hashCode(); - - buffer.getBuffer(RenderType.getSolid()); - for (int i = 0; i < blockLayers.size(); i++) { - RenderType layer = blockLayers.get(i); - Pair key = Pair.of(code, i); - if (redraw) - bufferCache.invalidate(DOC_WORLD_SECTION, key); - SuperByteBuffer contraptionBuffer = - bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, layer)); - if (contraptionBuffer.isEmpty()) - continue; - - int light = lightCoordsFromFade(fade); - contraptionBuffer.light(light) - .renderInto(ms, buffer.getBuffer(layer)); - } - } - - private void renderTileEntities(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { + private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { if (renderedTileEntities == null) { renderedTileEntities = new ArrayList<>(); section.all() @@ -113,7 +118,7 @@ public class WorldSectionElement extends AnimatedSceneElement { TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer); } - private SuperByteBuffer buildStructureBuffer(MetaDocWorld world, RenderType layer) { + private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) { ForgeHooksClient.setRenderLayer(layer); MatrixStack ms = new MatrixStack(); BlockRendererDispatcher dispatcher = Minecraft.getInstance() @@ -127,16 +132,19 @@ public class WorldSectionElement extends AnimatedSceneElement { section.all() .forEach(pos -> { BlockState state = world.getBlockState(pos); - if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) - return; - if (!RenderTypeLookup.canRenderInLayer(state, layer)) - return; + IFluidState ifluidstate = world.getFluidState(pos); - IBakedModel originalModel = dispatcher.getModelForState(state); ms.push(); ms.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.renderModel(world, originalModel, 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); + ms.pop(); }); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java similarity index 67% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java index b279103a5..7d400aa2d 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DelayInstruction.java similarity index 67% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/DelayInstruction.java index a44bed1fb..0965aa74b 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DelayInstruction.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; public class DelayInstruction extends TickingInstruction { diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java similarity index 68% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java index b1116ff0c..f7532c299 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java new file mode 100644 index 000000000..7c1d0197c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java @@ -0,0 +1,50 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.particles.IParticleData; +import net.minecraft.util.math.Vec3d; + +public class EmitParticlesInstruction extends TickingInstruction { + + private Vec3d anchor; + private Emitter emitter; + private float runsPerTick; + + @FunctionalInterface + public static interface Emitter { + + public static Emitter simple(T data, Vec3d motion) { + return (w, x, y, z) -> w.addParticle(data, x, y, z, motion.x, motion.y, motion.z); + } + + static ParticleManager paticleManager() { + return Minecraft.getInstance().particles; + } + + public void create(PonderWorld world, double x, double y, double z); + + } + + public EmitParticlesInstruction(Vec3d anchor, Emitter emitter, float runsPerTick, int ticks) { + super(false, ticks); + this.anchor = anchor; + this.emitter = emitter; + this.runsPerTick = runsPerTick; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + int runs = (int) runsPerTick; + if (Create.random.nextFloat() < (runsPerTick - runs)) + runs++; + for (int i = 0; i < runs; i++) + emitter.create(scene.getWorld(), anchor.x, anchor.y, anchor.z); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java similarity index 72% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java index d37ab5296..49e0b402a 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.elements.AnimatedSceneElement; +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; @@ -18,7 +18,7 @@ public class FadeIntoSceneInstruction extends Ti } @Override - protected void firstTick(MetaDocScene scene) { + protected void firstTick(PonderScene scene) { super.firstTick(scene); scene.addElement(element); element.setFade(0); @@ -26,7 +26,7 @@ public class FadeIntoSceneInstruction extends Ti } @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { super.tick(scene); float fade = (remainingTicks / (float) totalTicks); element.setFade(1 - fade * fade); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java similarity index 77% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java index ce2941c0d..4849d2a64 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.elements.AnimatedOverlayElement; -import com.simibubi.create.foundation.metadoc.elements.AnimatedSceneElement; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.elements.AnimatedOverlayElement; +import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; @@ -17,7 +17,7 @@ public class HideAllInstruction extends TickingInstruction { } @Override - protected void firstTick(MetaDocScene scene) { + protected void firstTick(PonderScene scene) { super.firstTick(scene); scene.getElements() .forEach(element -> { @@ -35,7 +35,7 @@ public class HideAllInstruction extends TickingInstruction { } @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { super.tick(scene); float fade = (remainingTicks / (float) totalTicks); 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 new file mode 100644 index 000000000..ecaf7b30d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; + +public class MarkAsFinishedInstruction extends PonderInstruction { + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + scene.finished = true; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java new file mode 100644 index 000000000..7209eda0f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; + +import net.minecraft.util.math.Vec3d; + +public class MovePoiInstruction extends PonderInstruction { + + private Vec3d poi; + + public MovePoiInstruction(Vec3d poi) { + this.poi = poi; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + scene.setPointOfInterest(poi); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java similarity index 55% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java index 7812fff46..c723b4d93 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.metadoc.Select; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.ponder.Select; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -19,15 +19,17 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction { } @Override - protected void runModification(Select selection, MetaDocScene scene) { - MetaDocWorld world = scene.getWorld(); + protected void runModification(Select selection, PonderScene scene) { + PonderWorld world = scene.getWorld(); selection.all() .forEach(pos -> { if (!world.getBounds() .isVecInside(pos)) return; - if (!replaceAir && world.getBlockState(pos) == Blocks.AIR.getDefaultState()) + BlockState prevState = world.getBlockState(pos); + if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) return; + world.addBlockDestroyEffects(pos, prevState); world.setBlockState(pos, stateToUse); }); } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java similarity index 65% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java index 57075f101..04c49d793 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java @@ -1,11 +1,11 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneTransform; +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; -public class RotateSceneInstruction extends MetaDocInstruction { +public class RotateSceneInstruction extends PonderInstruction { private float xRot; private float yRot; @@ -23,7 +23,7 @@ public class RotateSceneInstruction extends MetaDocInstruction { } @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { SceneTransform transform = scene.getTransform(); float targetX = relative ? transform.xRotation.getChaseTarget() + xRot : xRot; float targetY = relative ? transform.yRotation.getChaseTarget() + yRot : yRot; 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 new file mode 100644 index 000000000..0368437c3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java @@ -0,0 +1,20 @@ +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; + +public class ShowCompleteSchematicInstruction extends PonderInstruction { + + @Override + public void tick(PonderScene scene) { + scene.addElement(Select.everything(scene.getBounds()) + .asElement()); + } + + @Override + public boolean isComplete() { + return true; + } + +} 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 new file mode 100644 index 000000000..ca81f4bb6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -0,0 +1,84 @@ +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.elements.OutlinerElement; +import com.simibubi.create.foundation.ponder.elements.TextWindowElement; + +import net.minecraft.util.math.Vec3d; + +public class TextInstruction extends TickingInstruction { + + private TextWindowElement element; + private OutlinerElement outline; + private static final int fadeTime = 5; + + protected TextInstruction(int color, Supplier text, int duration) { + super(false, duration + 2 * fadeTime); + } + + public TextInstruction(int color, Supplier text, int duration, Select selection) { + this(color, text, duration); + element = new TextWindowElement(text).pointAt(selection.getCenter()); + element.colored(color); + outline = new OutlinerElement(o -> selection.makeOutline(o) + .lineWidth(1 / 16f) + .colored(color)); + } + + public TextInstruction(int color, Supplier text, int duration, Vec3d position) { + this(color, text, duration); + element = new TextWindowElement(text).pointAt(position); + element.colored(color); + } + + public TextInstruction(int color, Supplier text, int duration, int y) { + this(color, text, duration); + element = new TextWindowElement(text).setY(y); + element.colored(color); + } + + @Override + protected void firstTick(PonderScene scene) { + super.firstTick(scene); + scene.addElement(element); + element.setVisible(true); + element.setFade(0); + if (outline != null) { + scene.addElement(outline); + outline.setFade(1); + outline.setVisible(true); + } + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + int elapsed = totalTicks - remainingTicks; + + if (elapsed < fadeTime) { + float fade = (elapsed / (float) fadeTime); + element.setFade(fade * fade); + + } else if (remainingTicks < fadeTime) { + float fade = (remainingTicks / (float) fadeTime); + element.setFade(fade * fade); + + } else + element.setFade(1); + + if (remainingTicks == 0) { + element.setFade(0); + element.setFade(0); + element.setVisible(false); + if (outline != null) { + outline.setFade(0); + outline.setVisible(false); + } + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java similarity index 58% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java index eae1b3f41..aed61a680 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java @@ -1,9 +1,9 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; -public abstract class TickingInstruction extends MetaDocInstruction { +public abstract class TickingInstruction extends PonderInstruction { private boolean blocking; protected int totalTicks; @@ -15,15 +15,15 @@ public abstract class TickingInstruction extends MetaDocInstruction { } @Override - public void reset(MetaDocScene scene) { + public void reset(PonderScene scene) { super.reset(scene); remainingTicks = totalTicks; } - protected void firstTick(MetaDocScene scene) {} + protected void firstTick(PonderScene scene) {} @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { if (remainingTicks == totalTicks) firstTick(scene); if (remainingTicks > 0) diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java similarity index 76% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java index 070af58b6..efcae7a9e 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java @@ -1,10 +1,10 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; import java.util.function.UnaryOperator; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.metadoc.Select; +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.tileEntity.SyncedTileEntity; import net.minecraft.nbt.CompoundNBT; @@ -25,8 +25,8 @@ public class TileEntityDataInstruction extends WorldModifyInstruction { } @Override - protected void runModification(Select selection, MetaDocScene scene) { - MetaDocWorld world = scene.getWorld(); + protected void runModification(Select selection, PonderScene scene) { + PonderWorld world = scene.getWorld(); selection.all() .forEach(pos -> { if (!world.getBounds() 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 new file mode 100644 index 000000000..02ab81aac --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java @@ -0,0 +1,32 @@ +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 abstract class WorldModifyInstruction extends PonderInstruction { + + private Select selection; + + public WorldModifyInstruction(Select selection) { + this.selection = selection; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + runModification(selection, scene); + if (needsRedraw()) + scene.forEach(WorldSectionElement.class, wse -> wse.queueRedraw(scene.getWorld())); + } + + protected abstract void runModification(Select selection, PonderScene scene); + + protected abstract boolean needsRedraw(); + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java new file mode 100644 index 000000000..9ff50f0e7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java @@ -0,0 +1,136 @@ +package com.simibubi.create.foundation.ponder.ui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.item.ItemStack; + +public class PonderButton extends AbstractSimiWidget { + + private AllIcons icon; + private ItemStack item; + protected boolean pressed; + private Runnable onClick; + private int xFadeModifier; + private int yFadeModifier; + private float fade; + private KeyBinding shortcut; + private LerpedFloat flash; + + public static final int SIZE = 20; + + public PonderButton(int x, int y, Runnable onClick) { + super(x, y, SIZE, SIZE); + this.onClick = onClick; + flash = LerpedFloat.linear() + .startWithValue(0); + } + + public PonderButton showing(AllIcons icon) { + this.icon = icon; + return this; + } + + public PonderButton showing(ItemStack item) { + this.item = item; + return this; + } + + public PonderButton shortcut(KeyBinding key) { + this.shortcut = key; + return this; + } + + public PonderButton fade(int xModifier, int yModifier) { + this.xFadeModifier = xModifier; + this.yFadeModifier = yModifier; + return this; + } + + public void fade(float fade) { + this.fade = fade; + } + + public void flash() { + float value = flash.getValue(); + flash.setValue(value + (1 - value) * .2f); + } + + public void dim() { + float value = flash.getValue(); + flash.setValue(value * .5f); + } + + @Override + public void renderButton(int mouseX, int mouseY, float partialTicks) { + if (!visible) + return; + if (fade < .1f) + return; + + isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height && fade > .75f; + + RenderSystem.pushMatrix(); + RenderSystem.disableDepthTest(); + if (fade < 1) + RenderSystem.translated((1 - fade) * -5 * xFadeModifier, (1 - fade) * -5 * yFadeModifier, 0); + + float flashValue = flash.getValue(partialTicks); + if (flashValue > .1f) + fade *= 3 * flashValue + (Math.sin(AnimationTickHolder.getRenderTick() / 6)) / 1f; + + int backgroundColor = ColorHelper.applyAlpha(0xdd000000, fade); + int borderColorStart = ColorHelper.applyAlpha(isHovered ? 0x70ffffff : 0x40aa9999, fade); + int borderColorEnd = ColorHelper.applyAlpha(isHovered ? 0x30ffffff : 0x20aa9999, fade); + + PonderUI.renderBox(x, y, width, height, backgroundColor, borderColorStart, borderColorEnd); + RenderSystem.translated(0, 0, 800); + + if (icon != null) { + RenderSystem.enableBlend(); + RenderSystem.color4f(1, 1, 1, fade); + icon.draw(this, x + 2, y + 2); + } + if (item != null) { + GuiGameElement.of(item) + .at(x - 2, y - 2) + .scale(1.5f) + .render(); + } + if (shortcut != null) + drawCenteredString(Minecraft.getInstance().fontRenderer, shortcut.getLocalizedName(), x + SIZE / 2 + 8, + y + SIZE - 6, ColorHelper.applyAlpha(0xff606060, fade)); + + RenderSystem.popMatrix(); + } + + public void runCallback() { + onClick.run(); + } + + @Override + public void onClick(double p_onClick_1_, double p_onClick_3_) { + super.onClick(p_onClick_1_, p_onClick_3_); + this.pressed = true; + } + + @Override + public void onRelease(double p_onRelease_1_, double p_onRelease_3_) { + super.onRelease(p_onRelease_1_, p_onRelease_3_); + this.pressed = false; + } + + public void setToolTip(String text) { + toolTip.clear(); + toolTip.add(text); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java index dbe8ffca1..e1d369fbb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java @@ -30,8 +30,11 @@ public class ColorHelper { else return 255 - progress; } - + public static int applyAlpha(int color, float alpha) { + int prevAlphaChannel = (color >> 24) & 0xFF; + if (prevAlphaChannel > 0) + alpha *= prevAlphaChannel / 256f; int alphaChannel = (int) (0xFF * MathHelper.clamp(alpha, 0, 1)); return (color & 0xFFFFFF) | alphaChannel << 24; } @@ -49,9 +52,25 @@ public class ColorHelper { return color; } + public static int mixAlphaColors(int color1, int color2, float w) { + int a1 = (color1 >> 24); + int r1 = (color1 >> 16) & 0xFF; + int g1 = (color1 >> 8) & 0xFF; + int b1 = color1 & 0xFF; + int a2 = (color2 >> 24); + int r2 = (color2 >> 16) & 0xFF; + int g2 = (color2 >> 8) & 0xFF; + int b2 = color2 & 0xFF; + + int color = ((int) (a1 + (a2 - a1) * w) << 24) + ((int) (r1 + (r2 - r1) * w) << 16) + + ((int) (g1 + (g2 - g1) * w) << 8) + (int) (b1 + (b2 - b1) * w); + + return color; + } + public static void glColor(int color) { color = mixColors(color, 0xFFFFFF, .5f); - int r = (color >> 16); + int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; int b = color & 0xFF; @@ -63,7 +82,7 @@ public class ColorHelper { } public static Vec3d getRGB(int color) { - int r = (color >> 16); + int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; int b = color & 0xFF; return new Vec3d(r, g, b).scale(1 / 256d); diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index d5cac157a..61691caf0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -72,7 +72,7 @@ public class VecHelper { vec = vec.normalize(); return new Vec3d(1, 1, 1).subtract(Math.abs(vec.x), Math.abs(vec.y), Math.abs(vec.z)); } - + public static Vec3d axisAlingedPlaneOf(Direction face) { return axisAlingedPlaneOf(new Vec3d(face.getDirectionVec())); } @@ -118,6 +118,11 @@ public class VecHelper { .scale(maxLength) : vec; } + public static Vec3d lerp(float p, Vec3d from, Vec3d to) { + return from.add(from.subtract(to) + .scale(p)); + } + public static Vec3d clampComponentWise(Vec3d vec, float maxLength) { return new Vec3d(MathHelper.clamp(vec.x, -maxLength, maxLength), MathHelper.clamp(vec.y, -maxLength, maxLength), MathHelper.clamp(vec.z, -maxLength, maxLength)); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 98de531a9..aabe3062b 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -23,4 +23,7 @@ public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments # Server Tick List (For stopping placed fluids from spilling) public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickListEntriesHashSet -public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet \ No newline at end of file +public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet + +# Particle Manager +public net.minecraft.client.particle.ParticleManager field_178932_g # factories \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index e305d5bf327f3e51a08b67913d965c706f64bbdc..8bc0cb6a5651c9be3005c7c353cc406b42b56589 100644 GIT binary patch literal 2598 zcmdT`i#ycY8vgyvxQ|QZHo|OjNlor;BzMVmGTMk-i*eaRluL|X7`I&Jpc;m9sZcTs znWWflr;SjVHcGCE7{g#(8e^R4?0wGp8_s&3^}Or-p6^-fdET|Y_gguqUG2q0kRkv8 zh&i0H#R34xTY`WPj0X`7UT1!=SggG@&^UNtfk)stD;FyOcw8vT3FPPTgQuO(*zs^? zW@cz;=Wj~zF7fQZAoy6^pO08*2KgS@zK z^r^G403hD*V}hUSg3@`hSO;6HGYNhS()A?db8*5|YqH_oJn#Lm|C{g znc@#|S&*ObfFwJLz*E8s=!Wq8ON{p3iMIaMdv0yWDZc5G(r!-RA+<<@3Q?)b*73OK zm&rdRwUFoTs)?G;ftg#Si_I_8NY(mriN(Ga9_wM*tH7W$i3dY(6!e;Sl z!%d^4>DD}2n@6VX$D*T$ikCxcEJQAa6}k6SJdOPGHHgS6IY+xzu}m!lr5MRHb#MO+ z4aT@=To|@626QVN~}TxSu(XhAfLa!bzTxuCmuxU}5G6-y_c0Z}ZCIU-ekyh>%<1O_aN4}WPbnvlHPnCq z40NF*C?D=MfV0xJb?N`)xykC1m)shydQzTcY4zl&k>Zo_{#Ki%^9oWP z|8v;?JvAW{Ts@W^V`Gc#J$nb`K9C&Vyjasp(|&g#&h|r^13~N&&F9I3oy-FlAo1Av zt-R9gD}gTid(0aMc)@&|*moaKiXOu~ZE-HSCF>b?&Uzn=+WA@blXZF6yV2Ti87-N1 z?`+md|D5)G#k@$Z=1phQhFYd4WctRXDFDzsU(m0KBGi@VG0xJfPZ5l}LY2b>*E1Q+ zI`kTXNy8Qb z{Sd>w9aRTTV$24o#gv0DzG&S@?SpFXAuOGp6d)}L;jK!NGRx{t#;S03r^l;n&rXER zQu4lwY=3Dg!_Pd_+zesR=dBRL@lqA72-!&5LvMAOcfQiVdZc>zT$#D_h8|1WGBz>E zzk0#L>w25&yx#Stii-<)pD&cIWPUT2`xT2;s(o#6(}JmsFiT!leKya>CA;kK%|uRQ z3k8}iaNqI1ay~+^#m9!-BST3kT&1J)jfE7u$T4Hju(AJKNx;yhdP?h645it4yw{3x z5YRcmI&5@r4dbU(zwB)Ks~5Yc6!z(@9IEk)xPau{&*EDw=@=bYKL(Ntb(b3d9+kqs zt5AuhdUP88Y8l=Kbhjj52d`qXaY<<1{pqsPSL=}%+@~)MbfJ-uGnd8g*@`6;&Z+7o9gjS^R^3LM3mOVe!IgnYVf2Wl zcz1(#P*vd<4pI(ZHL=mU>ym<#6?><^HOGD$th(wnAdncD_RP*a#o5R;X>BcQ33nmCfeHjm1d%)-oFi=~}UMP$^&lxzN zA3&!5Rwwwz)Pvu>B<|dDzY=0wdorfsi`g}>@W*?269|jiu3pAJQ`up7Mjh*-Zy$GS zsYh=zpsW}I$d#P7%ock;40LC5br!=Al{LaxVaJ#~qmtW^Z|8oEsAsmy{X(#^NJCc2 zea6@Mz3YfP&6ni-Ii9A6Oat53XbQSY)G*mH{g|{TI z+G49YDQCxT_yw}P!|c{J(#N7pXMz+(-0OACyrj7HT#b-ZvOQcd2cyq;kBoiWnE%Lu zx1d)GzHq(TkvS($yz>bYju_jNxWsJhLbQ&Nj1w@@Ot!EjtUy<#sz&hc&x6lubEM^& zM%_iVQ%xZ5?-EErzgtkhR_EFcTCOoa0zX5eSWNde zoTQYiD|7Hlh6Q?lnnM=Is4Bdx7@$OKCc)hLw95mPRRmD`%7tEJ=_8sfVh#vl+nshj zh#Bk@%QNmH8_KzQ0ZWcp%2}gFx$4^TCK}OyJgD=fKlXwdsAZ&aC}`X^3dS zO=PZ|yp3|^u1K6MNhCh_cOqwQpZ3`47y9~7AJ*Bq5mP1pFoO$LJLh1l9PneSk-&Zl zUBLpRq$MwR@@e{&+QG8_oV>i*yIk!1ByTyM2U6b<#7+@8iA$dgw+Y?a4vab4n!u39eqo2czT)>irSH^&|L z5&5Y~5q#kiTGq@%B*+#-tAv*UD z%M`wU_lLg@G?)_8Q_`JctnIv2aVZ926RD{kyDke5lDWxUO?=jolG{U&XP(6EQ9FFO z8gY==_BwZGZKwDgwPQXOLTs;ZRj7b+c*Jb%lw8FgqjRfJVr^=D1=ok^(llYNI#BWo zfkXi!j0NvW#Opyy)Po$hXb@n+yv?NR)PZ|XlsgrPxBgOdX5tPNv#QBd4}duNsSM($ zA~*^yB$tR1Yp+xyrru0^cTMId2|WNAdD^Nt^HhU?4Q77x zZQh1A|8qS*+=*vOVTb+X*>C`Gsxrhwp)LuZ@>}K4|?2;{b`E^h1Gp7nA3Aua9^yb zp^I9Qi!5p-@tik2b{#=tFCR1NErK!EO$=!H;^& zJ9MpYTvV}^tIXa{F`drj{`%(Ix3&UO;o_nnCa?N=s3PxD1b25zRboh0a;29h>#cgg zU0Gew^zvm=oj0S8R@S7!A1hCz9))#pK6@Nf`bqzgiobb4U=c7%YA ztYA`wYJ3uB5JE)z;FkpEyDXZ zd+HX~U=IO#_98719jH@svb*6)I&%x77RHjMBD-jjc}JhAb+{X!!x_qu)f2lC=0Orgy8aO#0-12?&BDxd3cZ=ozd#YNE8 zHH6w9S4neoY6<^vZ6W#K92_o|C*yR;>>;XO?c4!zo#Bo{ykSY6U zE0!q_r|n8~Uu8lv9!ZI~5$bJjv_Je^a1GXF%CXw(w}3$IqV3_YX^H=HSN3J0;3fE?s<&%nV?2;#Y>22+b!MqmL_XK$(iDuufOX33jcaMOPRaoFNcs zd# zuS=O8YTa5?g73j$AB4h^oj%0NLp{)7BgT<$Nb}F|EAmuJt-BO~d>^N$3(g`FxS6PStfYh9QI->rzbn!bdr%BLp|x?0*X@#0 zIB=C!xS0<(bEv)idxn4Jg@A?@wqs@j+uyhv-~|H zhI5PV+pl5vv;|L(S>kw$6Lyo8iGCWm*vcDcX%XFjP%gx_HljR^bcN=Mg zxh2ExD|yMEEEl%5aNR`Pi!yR$`IvFr*7gq-tgEMX8FAx5(1H6jMlIB zFE?e=T+ijx_jUW%>k$*MXbB46Q8A(jo8h%!&hEEogwswY@kC9@Hd#stZr4jBhNaQs zgwU>twY&BxX33myO5R3#yt34h#yLA^OVh#oh%H5pTKbsKv@Bsca*B**Y)RF|chK`! zg7)k@Fz-gwvpc~y!#BsCp29o}>n#c1P0gDoX%w|NCH2~5cK9YJhlNfl!#?pt;TB5H z8++Ay?U1a^hC%QguxItn;&YAH>4m*WA?&St7`-sr(woL5aCrfVY_rLt zb>Mp|lM>U;LeiKH9@gAK8Ru||)=Y z)PL$PWuM4<7A3d!NGi?G%nZ~;EpDyE*Y!z*o&qcBrpql^YFNyzWr&@-GklEFh1{U!4;Oz_l;C zP@{j(o@*}fORCC|7K%-5t4IHC%i!F~qPGZA%lEcKmt2DVbPG10&4qw*1<-&Ddgb%HZX=1 zy*Pl7k+Nmuf2v5Oi+!pSRx28kn3aY31q2Ypzf9ba9x7IRct~5bG?M>PgqrfI7I`qx znsiET@zYH1BSDzec_uJZ$nEN3E(( z$kPcNu<|mhkLVSnhKpy9qxqh@WZR2?#f$um0F3y<51B!hZgiW3b$pGj5O{lsp~Yw> zlnb4Q+V@;uV}#mHk3$cu0+F{8G*SJBo4aeGk@d-8&&;88lmY2Z3!B~OqIMonIw8xx zjSMX#)mj9P1kkA&4et&C$CR7)kf#HS29;g)A_#Z~{g zLnX_1<#>NNi9z#!oiD^}ImpfVR%jCt6S1#Tw{x-^)bM5yYqE8tXVV2@@<+=<^7|2bP_V7g)4wNFQJN=4@dGf* z-CtZ;=NEs_!&9hUicqF81Y11J;XDGX0h(HQ?gjv>W{|m2b;8aGFp`kQl{WJr(bhFD zwah@WF+=hs!hsEX>`BDctty4!$-&hRQ@+zt-s-{~ z%Wrr0KTDZA^=l)9K9Oc)tf-g%}<2;>^GmdDKb?I*sP_waHNFa@!q9 zcoNp%G;{ultKZCYe^4!6aC0n)Y=8VW+TS9d-bZ8#SxRoqA~3ZcINB9GOFSIO5TE3c zdYpR<8LtP{Q}}YZ{EDw`ik1&{b9PhB#Tb)ob%P@}-xj}1A#}XU%<<4PW5=+$JI2>& z)OoOdu>l<-tlgI4*(8kv!3qZIA^kM*l(wZfB*qzlz$V5>MQVvamI zsGootCb>uqPfA4Mf(AT;6O9mbSzSwd<-JBrY`8(szt7OK%|ll#Sz?BKd#8G#%X4$S z7KXS&@JA;XWADhmhRWyxXYgB}`1=OvshZfW;^fyHv5gKf-F@&bug0RI z+!S-k;DCI$LpNUQDtHFZ&wqnpyN&X^leSi2#`Iekp+FiJUD|p@U8uACb$9g%9!VDu zdoq-Yi>bQ<54Fk-Lm@&rCIQ>@6NLJhzU#adWFlMOqYjfi%>%E7{t)O!ayravaCU6i^&sjIi?)WxAF1u5IzhmTl|vZT_@an z$0S+ZA;Q4_)T6M|Q?7wKI~P3WVdsdga(19W(<(#6lyBSm zjtUkFE{lb-U(FvL25pq{7fWMv=KRiNV7nIj#0lC&CH0}D{dOZvPQrsTjP>Q3tesjZ zX>XVxIia}oN^m=d4pL-0HU-!!S+Bx zOM*aP-54yp^pMj)XxKFrsWOX?x!E4LKMq6h2~>VE^I(eO#B8n$xLF_>CbQ%DRuM+* zm>RNVL2TZ*yKI4*fbXw~!3wU5BSGHT$jY+zOZ*`LdHubNvJ0AzT~!T$eHwrhK(Jid z4zSRZYCu$`5x_Fn048`QpiZNgvYF@zrUAFwYHT*G=A_^cU$!PNu>-84LO{#3_Rs@w zqkMEDmtF#el}as#)(d$u*_G;K#8sEupaa5b2+mZAGWunrGgysfdS|3H97EU!^8z}D z7b!sPMqllVro|;@2#p(iHvr5j3V;hbBsuZ0a0hFDApo$Yd-qK2_-@aCb+`awJ5$Zt z%c54?h#e~C!N%J~@9!<=&IK9U&ua;R_?Ubn9JyWn;pn5*4bK*JlZ@3&+Ee`t0o+8? z>JBGo`SAA=joVPS#v-A#v({BBa9>xQCbYSZdVG|WqB1una)mz;vmhiWsPoSnrp+0- zVdIYGzzQlh++ue_++fNNZw86Hd-?HKo}e*;3_md0%2JFwl$y9X8>zU6SKSlWs03xD zM}jK-uxa?RG@_u%>DXX7ZC2a5qAg|P#`Crc-+%k|`@OLRjRjt`w?VKnbKrk z8^^L|e~37{tmdG#iZE-5l}u%rjbXpOGCDKr2*z5VIyHf)fFUCsg{e$HDn7SJ#zvbz zwDt(SA=M-j)FE1Y0sX3`+AOEt6#+|*~issQlwkP zDlstm{%nf!o6z`Y#;Q_o0Gc>y2M501qGTy+d9anm0b{j~Q^YDeHO3OhcTM}lTC;4D zd~RfFp%=zvtgcE0Stade6qw>mo3R>0@wMyw9v3wS?bQlOYl39J9p<{>l6bTH!b7_) zNvkW8Yem@Qp;4beY@Fl+G4Ly87N^;)*m)|M)Fn@JRtZcJw~x}tlWieVZa|`_){K2w z%>S#m2=vE76Jve$2}p)-avO7@$9CXPB70TcUb?4Q3M$~wXE-c7JB-P@B3HpF3Uhg9 z?|1*aic|^H==;kohWX7IU|qk=+*Dcg#SHp27r-sN-it#T027R2Re)78eAm{J(SyXLNKGXbfodK50W;Ui(r4oKLtNuRePI G&wl~&$vRO0 diff --git a/src/main/resources/doc/cogwheel/s1.nbt b/src/main/resources/doc/cogwheel/s1.nbt deleted file mode 100644 index 4aa492260c6e802598f0ab4f0bcc9350bbc987a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmV+%0^|K3iwFP!000000KJyMZqq;zhR5FB#CDP3Ql5e*=mkY^fJ=lFfq+Z3wWsM4 zCu_W01#;@+zzcBabvSY2>W)Jlg~+x>ZOll~#>wor`TfPKO#ot$&TLQsK>ZpuV+;|l zyzvGd)D^?%BDd+nC3NvD22ohoOxl$I<-GQIH)FpiXz2+KdO`+AFgTLIQ4CH~K~GQ6 z(sQ_0$lwSDM>05y!D%XF_zD@m`Z$8YkqnMvaCS-=z68TpA4f1alEG07PE(TMOEP@* zaRh@S863snG^H566vI~^M=&^&!BMT81jOpXD^RlnF`L}f^PWuUt=oR^w#cY6NMJlg zzqaKoa@F54vvF!38hIu~X|NVUQ<#>P(F_4c{ zmk&8ij$`>a%wfB7sDEJ%W=p%`S60pJN8vvc>V@YQ818xC#-Pr4G3;+P$tq8dQ diff --git a/src/main/resources/doc/cogwheel/s2.nbt b/src/main/resources/doc/cogwheel/s2.nbt deleted file mode 100644 index e7889a802b2378bbe288f9fa797d8abf5a36a6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmb2|=3sz;z0>Y`9X1d-?*G~Fw%-NmTJHFS>v8;!U&>P6M)JO%?whiU{qs+s(?(gE zPYu?vJI(s``*t^vd+Op8n$h-rB6*d+X-a-|bm%3NPQSjoJAzIQZ&~E!P(bOk+3SeR8!<@z&FGPw`qc z{kp=|q%W~bCA6%<`HcSJnBQ0T?_8zl{Db#Q=;VjbV))vhF5dJ?RC@7hA%#C}^3r+j J?h;%K3;@j}$B6&{ diff --git a/src/main/resources/doc/cogwheel/s3.nbt b/src/main/resources/doc/cogwheel/s3.nbt deleted file mode 100644 index b60d58b68ada73bcccf62049f528e5753266bdae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 854 zcmV-c1F8HUiwFP!000000M(eyZrVT)$H!i;V@&#SY2TyQTq+=_MT$t&C{^1_ zCvdW1l*};-=Hz{u1P&u`ECPoUIN2}>`7#OlD&sH$$0Bezfiq7jAzzG;uQCoJa4Z6c z6FAwh2>G%I`6}Zu0>>h7IDwN5PRJK0o+B~Z$G z>cjyv@Zm{EpoVS9V334(*bgF9LC4iI;}g-*jof%MnM^+F<6CW0*T;AI{C!bPrP?m` z33L78_#T{i=$tZk9-`A7>71#MLwRT2p8N&94QfpA&Q*y zOA#Hg8=efJE?Di|b~C@)PXz{SdxT)scMh5cY_{a36TM7(2cxd)rAuCkrq!9IM;NMt ze6yTR*77jW#+sZP~Ir z?XehDbm$5Pa@OY`?8Q<)%b((|@b$`yHf>&HJ16pw^=m%ibvJ{>hr|tH9ModDbbdpz zd?_%P77Kszs@ZJc?`oND%LSF43XvwA(z+nL#9>5U+occr?Y@!u5 z%duJk92UUg0UQy)sZT4QU#)w->R>143~#Y*jlXpf9hshR7t*zrlGJlZn$t0sYg zn&D-7gLM`Wh3J>Ihm$fbh^n+J#lxA_s8$q@FNqQ_w0MQy1)cE=)LGYaQRhyjQ-Jt9 zMNFZ{r+?~>jP}+jg*J*{|BP1>7c?vobCx`*TO?tp;ZaX;@1dU}5&6-G`F_9|VeQD%~nZGGcy6Xf?yT7P?4 zyze*nD@RGKq6x>#q^vj9@xq!Z+WfCVn-q-Y6rrDKDvHA-f7+=zLzxuKDau<6XsKDZZRmAC@Y_h2@1_L>3d&B@FvGa7A}LGEuTYMf`Qn)!RQ1sL>> XrI+7mK8l~z_Fwo1I8@9g(GLIsF%+TR diff --git a/src/main/resources/doc/cogwheel/s5.nbt b/src/main/resources/doc/cogwheel/s5.nbt deleted file mode 100644 index 056249163b06bf89d63030cf0b3f6666204fb0e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmV+-0p0!|iwFP!000000F9KfPQx%1MW5s6l9Ztv19QKkGczM=WYR~mNa7M3A@#%f zJ`z+%s7kDRB`b=2e3GXtc}r9g2X_%oMAO=gOHI#;O6jAEP6AD-X!F|o<|Ay!mwiS0 z>_a*D#NG+rdXLP$7q0IfH4cq?d&N9&{qNU zmGfx8!+^&Cp1D$>FP-^TvB0eLmGdy*F@Pt9fxZ~%i-Eav9tJ!H@T3@^F9YeuBB13S#Cn|sF7edT?*~kR|0Kde|7bzCIi0I$KlH`*THQXy3!;1X@^ZL*4! zHS3K+d+OW3kyGzH4llsf?8aU>0l7{ll+*Xg`WT<~lRw9sX^sT~w}X@!-|9osokPfpayAqWmda2SHa5u7lh zft;u(r@IzGa43Sq5FC!+gh3GfB8YwsaVUbr5FC!+v@J#Siz50p#GwcdLvT2P69z-{ ziy`_o#GwcdLvT2P69z~0izE6q#GwcdLvVO6Cjq)Vvx%G1D?4)`UuxqnVjwDm$ElGn z^WZ#RsccfHLiULBg>FBzq=9nar-hW+*DIg%=)_%?n~B#&<}#xM_D-Z-YcuB%ABjSw z%3i#<@=$i_-t1m01M)Jfs&7^G{mU_j(Wy1Etl#Uk!Y7TwQZ0&HPUdPUtx6M@saGa- z{|?dHs;WM@^E-FXp*z2K@w{&n`eXYcrFUfx`9I7#8Zw7;>R|V`j^m*^=r8IxgnLuR z^V{kmp_Z*W_+4#QID0kmbC?vRz469PtfiayO^>$!8b&wl zK~w@{Rrm!ny;cpL*e5eo?q8+N91y-+SU{P1+) znvfcCZVx`Jgt3>C&6l)WGnYEM6rexNvd{n#N zM73`r(-#%4>(c6|71h(Fj-FlxOng)&L>Db5?6+K)shp&Gx}Hgy@5Xu%_U_DiwHqQd z;Wi<)$&F=09=GA&H5uRZj-YnkjiN@L7ZjBKQ$5=b{Um4;4C$e;e=MwcBTcEadm!U$ N_yL(2a*?JE008JoQMdpA literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_1.nbt b/src/main/resources/ponder/debug/scene_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2252fa1c3b42c7abd480834a3cfa141592cff4e3 GIT binary patch literal 341 zcmV-b0jmBViwFP!000000F9N;PJ}QJho{UGVZC}VQD4Ca@a);6SJK6*&GKhMYc}!0 zd_KY0g%DtWlQg9C>(@?ZlJ1Cd67Rk(6VWize(2$wQ)Zjsg0r56$SK`dZF%s!e)5Gtkcr^z)X70gnJ4 z4R~Vi4CF3A-36%omWKh403Ho^V(tRuu7SF1pzd2920Q|I^or-|Xet|m9iE{yBY82k zrJLF{w(QJ%c=AnqD*j$7imSKd>gm%3Ta;~6cD7eW;$cqoC-#5dijT^8f5z@ctm_w- nq5Bc4T)n26Q2Xj@PBC3Sn_ymT=Uv+nWk2)_+gBT|s|Nr8YB{DE literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_2.nbt b/src/main/resources/ponder/debug/scene_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..16f82250c43d9ac4905d112aca5a1f2cf563909f GIT binary patch literal 344 zcmV-e0jK^SiwFP!000000F9N;PJ}QJho`h%0grkxzJo8YXV1oyS5k45W?3M#$+|w6 z&u1~)T|!v+P0|q3Z@&JSNtzR7q@4X>Nkqfg#BW9^H{N>7j)ur+^Io^*&gJ3fDI?jn zE+(Brl6KyBK4pvtGcog8#fG37nV8jeFT`K`R67VR%qXAFc_n1kpoIL?* zngBIj@<_m=0FMSdF(gn^3Dk7SBLR;BJR0zb(-<>yX3uMkIB{#9H714v`bPo%v*eM0 zM*$uUc;Y=P;GUP5c+YE|H714z`dI`0yyTI9M*$vv#dFh{n!V@YiBT!37qe%&-`j@E z-hBG4YuZEc{|Zr@eYngXD(kr@+otR}D09kR`?lkLc)|j1zO5s1JZIirGAnbOXdi}%^P^AXl`p1Cec<81R4PH_8dym{l^*|s4{f9Vf_u-pAe2LJ%DL!(Fl literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_3.nbt b/src/main/resources/ponder/debug/scene_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..aedc65d0e9519518ca0d6a37870d52fb474ca5a8 GIT binary patch literal 845 zcmV-T1G4-diwFP!000000JWFjZ<{a>#}8~Lgtlut?O}h$e!NuOORG+k_EJ@NhdJ8F)Mqk%)K! zs?A_>6Q_&2!k0I{WK5IPj0!w@=+-7Ut2{nC2p4%tgf5m<~bcP=pRc=omk{2p^6y z6v?=Vxd=kX#+XJBc|j0)F{VQhIuxP95ISbR2x7m+7{~b9!Vn8X5R7B?%%Wps9POhq z#x#n^Q;NvbF&%=?p$Hv@&@uZ?5&J&IfUyg)@3y&Y4CwXSbZiW0AK7$ljA;x}6Bwc< zjOh@B4n^oNgpP>~hKP+Z28nNOOQO136*O`QAn3hRjc6U!SqLrU5*ggJe*Hn3tr1^-=16H#484FqmA6oEP;MfLz44I4uhXlm~^Vl0q-=?6JD8*I4z_k{hI2 zS=FaDMWNaaZ?zjr`Ipbj73cB5A=&o8^nZi^?GFLWCXFa}>+$Zvg-Qsv5o-NR`&HT- zaDt5?9cDK0`rpnce?X_r><#F&Q)qvHX}kAe;5DbsycsB0ZRT)bE@si`mf=38TVnf| zZi!Xvnr1=Fh2ZLI`^W=&8QgPtcONBukq1k0S|n*XuRh4ZJbnN4v|L4k&lhPT158R9 z;`oWU3GzJRx!f=RDo-<>s}FroXEs{~alt*fAZ*O_nbm~y1B44Y!I-bqLI_=G! zie=5!0bM_MvS+)vKHHw=b|-_Xn^&=C(?4d?Eo&M(U)w)OdtSC(lchXJl3T57#`V?t z&OjFP-?G;^X$I}6chjed=r(l literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_4.nbt b/src/main/resources/ponder/debug/scene_4.nbt new file mode 100644 index 0000000000000000000000000000000000000000..589150451a2210b54c7e83cacfc011c48fce3330 GIT binary patch literal 608 zcmV-m0-yaKiwFP!000000L_-$j+-zLh6j8IkVpF?0puH7ULx{HC(CN|j380PpBIo>FT5jdQ{5d@ATaNN4Qg&cn(XRO5t98TZ} z0!I=!Ze2d1UOu5-OB_z%2m(hEIBs2xP%lQP*Aj;lID){D1ddx5C)A4*>b1n-1dbqZ zB!T1BB?$ErgnBJ;IDsPw968B}fMpLxfcRD*?xC6Y?%qD?=Ee77Z!^6Be6@#+%-JL{@;;f3RU1l19+px7M;i(A_D(X)I$5b%Enz6Omvj&T@y{V3Nu!Rb%0NSvFz^Yq!^CLL_|d1_ytw8)i3W%#Li%rifEC2J2tD zZ2Ke;otZR#vA> z^W)JTadC)Kjg}EVDGlCJk8{U6jmu-rI#wsd^g7ntj&&R5jr-u7>>9_2w$^U$B(SR# zH|3>{+Ft0QwsO@H4wXFYH{oKOJM0 u?Ri-OhXKi&NQr+;P*y}CaPwqIfs|G-kK+s=_4gdgwnjlU9 literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_5.nbt b/src/main/resources/ponder/debug/scene_5.nbt new file mode 100644 index 0000000000000000000000000000000000000000..be49148df9337d9d76e9b4362695227fd520e827 GIT binary patch literal 333 zcmV-T0kZxdiwFP!000000F9KvZi6rkhD{PSpr=VYOna1`cb<0IwMxNlqtOHL>EXvGk+r3g9v{*3>KQ~)KYV7^fTKw5cRB0Wne(2^m80aBFkaBN-u6{?uLmLNM9 zrlL6{1mk zXFdvs&ywNu7DqBTiouyeF??1GpSL)Y!BMN63Zy+!0m3x!RC|p3`%~MS=FpiAD-eAb zHL7ugT{AOV9Gr-n$4<9Mgy|ob1*ms@MR>Uyi?!D$+7A~)c&MF??PAfSc)lrub;Du2 zC}QvG!@CZBx&|Cv=FL2~o-Vi4I)9g{0q+25Iz_%uFUAqa fWd5Z8hQz^lZ<_Qc`e0nNr1*hf*OR!Z00jU5I+K=) literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/shaft/encasing_shafts.nbt b/src/main/resources/ponder/shaft/encasing_shafts.nbt new file mode 100644 index 0000000000000000000000000000000000000000..4b7d064c0fe766d5538430ac0115ed91db953917 GIT binary patch literal 497 zcmV05y z!O;v(*CeCPl2PYl9L3;h24{N|j5;euosV%8gQFQ7vFW=RdEi<58TB7`%{VX3IIm+I z#o%ZLr*qc~cm0=p2CAAy17_SH7WWTr=4wPA!|I2RO+iVK!NmyUvi5TW$vfNF+{N$L z4=q5C=|x1Sfd+Y95dJ5?+o6HMIC>20*H8k|74S0mNU&jWi>AcM+*KG|o>8*?=5u

4DO@zR#2B%?3YY}+$Sx3GEa)k@w>NPZs(LwD-4>vmef?*4dFvuh^17l; z60%D?-|TtnZ3vUx23O6tldm?Dwkj~JmapeC$UgYGLEqj}61ZGa$d~nOh6R`#TLvV8 ny>kJ?-4^z!tIjQLheR*m+h{+b53a7Lg1_K5UTxw;7YP6W*h%hs literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/shaft/shaft.nbt b/src/main/resources/ponder/shaft/shaft.nbt new file mode 100644 index 0000000000000000000000000000000000000000..36ea03bc3d34fae6de5a4220567c973220654d6c GIT binary patch literal 541 zcmV+&0^#a+|}^82#GVMGD!uY-FkYr;D2~ zL`-NCAm~58g(h_6~25u{g?q$6`Yn9X~@Whfo6#wZB8v_ zWlP#ol6Tbfkk(cO_@OYvc5g4bfvmkmjh7HF}TXI8HMVW4S~) zTT)o1r8y&~&APZdv7x>D^yl66mGW4WM$>;JWDfZoYZ|oSxX)lPBg1+QY}I6NBCnMz zWNq}km?`T#2ya)oqxS3pUEcAU1hzKwIaZL)WbKf;0~eC(9q2&|3ORKV_tej}YN;!9 f!OU+lQ*_6#q?eayoidsp$v5}`v@Fk5?Faw>26YO$ literal 0 HcmV?d00001