- rebrand
- support for particles
- support for fluids
- support for outliner
- coloured text labels
- debug scenes
- proper UI stuff
- proper layered rendering
This commit is contained in:
simibubi 2021-02-16 19:35:26 +01:00
parent 8ab27904db
commit 18067e8d5c
96 changed files with 2829 additions and 1365 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<MetaDocInstruction> schedule, activeSchedule;
Set<MetaDocElement> 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<MetaDocInstruction> 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<MetaDocElement> getElements() {
return elements;
}
public void forEach(Consumer<? super MetaDocElement> function) {
for (MetaDocElement metaDocElement : elements)
function.accept(metaDocElement);
}
public <T extends MetaDocElement> void forEach(Class<T> type, Consumer<T> 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<String> 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<Float> 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());
}
}
}

View File

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

View File

@ -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<BlockPos, BlockState> originalBlocks;
protected Map<BlockPos, TileEntity> 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);
}
}

View File

@ -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<BlockPos> {
public static Select cuboid(BlockPos origin, Vec3i size) {
return new Cuboid(origin, size);
}
public static Select pos(int x, int y, int z) {
return new Cuboid(new BlockPos(x, y, z), BlockPos.ZERO);
}
public static Select 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<BlockPos> 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<BlockPos> all() {
return BlockPos.func_229383_a_(bb);
}
@Override
public int hashCode() {
return origin.hashCode() ^ size.hashCode();
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<String> textGetter;
String bakedText;
Vec3d vec;
public TextWindowElement(Supplier<String> 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<String> 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();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<String, String> shared = new HashMap<>();
static Map<ResourceLocation, Map<Integer, Map<String, String>>> 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();
@ -63,6 +67,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;
}

View File

@ -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<ResourceLocation, List<MetaDocStoryBoard>> all = new HashMap<>();
static Map<ResourceLocation, List<PonderStoryBoard>> 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<MetaDocScene> compile(ResourceLocation id) {
public static List<PonderScene> 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<MetaDocStoryBoard> list = all.get(id);
List<MetaDocScene> scenes = new ArrayList<>();
List<PonderStoryBoard> list = all.get(id);
List<PonderScene> 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();
}
}

View File

@ -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<PonderInstruction> schedule, activeSchedule;
Set<PonderElement> 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<PonderInstruction> 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<PonderElement> getElements() {
return elements;
}
public void forEach(Consumer<? super PonderElement> function) {
for (PonderElement elemtent : elements)
function.accept(elemtent);
}
public <T extends PonderElement> void forEach(Class<T> type, Consumer<T> function) {
for (PonderElement element : elements)
if (type.isInstance(element))
function.accept(type.cast(element));
}
public <T extends PonderElement> void forEachVisible(Class<T> type, Consumer<T> 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<String> 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<Float> 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;
}
}

View File

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

View File

@ -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);
String holdW = Lang
.createTranslationTextComponent(HOLD_TO_PONDER, new StringTextComponent(ponderKeybind().getKeyBinding()
.getLocalizedName()).applyTextStyle(TextFormatting.WHITE))
.applyTextStyle(TextFormatting.GRAY)
.getFormattedText();
FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer;
float charWidth = fontRenderer.getStringWidth("|");
float tipWidth = fontRenderer.getStringWidth(holdW);
int total = (int) (tipWidth / charWidth);
int current = (int) (progress * total);
if (progress > 0) {
String bars = "";
bars += TextFormatting.WHITE + Strings.repeat("|", current);
if (progress < 1)
bar += Strings.repeat("\u2592", 12 - filledLength);
bars += TextFormatting.GRAY + Strings.repeat("|", total - current);
return new StringTextComponent(bars);
}
TextFormatting color = TextFormatting.DARK_GRAY;
if (progress > 0)
color = TextFormatting.GRAY;
if (progress == 1f)
color = TextFormatting.WHITE;
return new StringTextComponent(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);
protected static KeyBinding ponderKeybind() {
return Minecraft.getInstance().gameSettings.keyBindForward;
}
}

View File

@ -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<MetaDocScene> scenes;
public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering";
private List<PonderScene> scenes;
private LerpedFloat fadeIn;
ItemStack stack;
private LerpedFloat lazyIndex;
private int index = 0;
public MetaDocScreen(List<MetaDocScene> scenes) {
private PonderButton left, right, icon;
public PonderUI(List<PonderScene> 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,16 +188,21 @@ 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);
@ -124,24 +210,46 @@ public class MetaDocScreen extends AbstractSimiScreen {
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();
return true;
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);
}
@ -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);

View File

@ -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<BlockPos, BlockState> originalBlocks;
protected Map<BlockPos, TileEntity> 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 <T extends IParticleData> 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<T> iparticlefactory = (IParticleFactory<T>) 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);
}
}
}
}
}

View File

@ -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<IParticleRenderType, Queue<Particle>> byType = Maps.newIdentityHashMap();
private final Queue<Particle> 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<Particle> p_187240_1_) {
if (p_187240_1_.isEmpty())
return;
Iterator<Particle> 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<Particle> 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();
}
}

View File

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

View File

@ -0,0 +1,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);
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<Outliner> outlinerCall;
public OutlinerElement(Consumer<Outliner> 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());
}
}

View File

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

View File

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

View File

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

View File

@ -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<String> textGetter;
String bakedText;
// from 0 to 200
int y;
Vec3d vec;
int color;
public TextWindowElement(Supplier<String> 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<String> 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();
}
}

View File

@ -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);
redraw = false;
}
protected void renderStructure(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float fade) {
protected void renderStructure(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, RenderType type,
float fade) {
SuperByteBufferCache bufferCache = CreateClient.bufferCache;
List<RenderType> 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<Integer, Integer> key = Pair.of(code, i);
Pair<Integer, Integer> 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, layer));
bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, type));
if (contraptionBuffer.isEmpty())
continue;
return;
int light = lightCoordsFromFade(fade);
contraptionBuffer.light(light)
.renderInto(ms, buffer.getBuffer(layer));
}
.renderInto(ms, buffer.getBuffer(type));
}
private void renderTileEntities(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer) {
@Override
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {
redraw = false;
}
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();
});

View File

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

View File

@ -1,4 +1,4 @@
package com.simibubi.create.foundation.metadoc.instructions;
package com.simibubi.create.foundation.ponder.instructions;
public class DelayInstruction extends TickingInstruction {

View File

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

View File

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

View File

@ -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<T extends AnimatedSceneElement> 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<T extends AnimatedSceneElement> 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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<String> text, int duration) {
super(false, duration + 2 * fadeTime);
}
public TextInstruction(int color, Supplier<String> 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<String> text, int duration, Vec3d position) {
this(color, text, duration);
element = new TextWindowElement(text).pointAt(position);
element.colored(color);
}
public TextInstruction(int color, Supplier<String> 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);
}
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -32,6 +32,9 @@ public class ColorHelper {
}
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);

View File

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

View File

@ -24,3 +24,6 @@ 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
# Particle Manager
public net.minecraft.client.particle.ParticleManager field_178932_g # factories

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.