Merge remote-tracking branch 'upstream/mc1.15/dev' into mc1.15/dev

# Conflicts:
#	src/main/java/com/simibubi/create/AllTileEntities.java
#	src/main/resources/META-INF/accesstransformer.cfg
This commit is contained in:
JozsefA 2021-03-08 11:04:35 -08:00
commit e943705fb7
214 changed files with 13637 additions and 471 deletions

View file

@ -3,7 +3,7 @@ buildscript {
maven { url = 'https://files.minecraftforge.net/maven' }
jcenter()
mavenCentral()
maven { url='https://dist.creeper.host/Sponge/maven' }
maven { url='https://repo.spongepowered.org/repository/maven-public/' }
}
dependencies {
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true

View file

@ -16,7 +16,7 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets/create/blockstates/andesite_bric
96b5284693da168ab8e0809d86515b5f1a7e763f assets/create/blockstates/andesite_cobblestone_stairs.json
82bd82270aff7d51e9239680ef4dd7b5c899ceb0 assets/create/blockstates/andesite_cobblestone_wall.json
9639b901ffdd2ecccab5575c5c9e6c7b5c901e02 assets/create/blockstates/andesite_encased_shaft.json
53cf4cfd94db1f44e9865b9fe5db383d01a12671 assets/create/blockstates/andesite_funnel.json
ca9a629472625abf741f02b94ce4578292fb14a7 assets/create/blockstates/andesite_funnel.json
398922758a6219544e5b85c91c9cf8a543b437e5 assets/create/blockstates/andesite_pillar.json
1d2d8081581e07d9be4b382aede4f2de4401cc6b assets/create/blockstates/andesite_tunnel.json
e555e3c2b2d3f01440e48db4ba88f7e00fd99b6f assets/create/blockstates/basin.json
@ -157,7 +157,7 @@ afff479c0e5284771afa9e7ce513595fe65860ee assets/create/blockstates/gabbro_cobble
a1f31a194129cfb65e335b3b96490f9275f9c564 assets/create/blockstates/gabbro_cobblestone_stairs.json
a64d8d0924c0b5b192f355343dd9b3a440875f6a assets/create/blockstates/gabbro_cobblestone_wall.json
a6b44e8a1c4ce0c7442b2384b41ad36dd133f19b assets/create/blockstates/gabbro_pillar.json
2d7ffcb339b0a38b98935a382ac2a164866255b1 assets/create/blockstates/gantry_pinion.json
23744450886af88ed468aecbbd7b8d7babcbbd6f assets/create/blockstates/gantry_carriage.json
9fa39a44bba30c5ae8fa245b122a837c705462b4 assets/create/blockstates/gantry_shaft.json
eca1f0e56efdadb241f42dc6ebb036f1d52213a9 assets/create/blockstates/gearbox.json
f34814b17cde3231a1dfb271f3dabf8d6de4fbf6 assets/create/blockstates/gearshift.json
@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json
6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
@ -401,20 +401,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
369f9c6fce0aa11d70efa2e73a4ba2ff12e57e37 assets/create/lang/en_ud.json
1e3157b36cce7bf30abde83323513f8f7c1a7c2c assets/create/lang/en_us.json
7ddb6aa393d89dd1d9d1e27c998783a7db18e831 assets/create/lang/unfinished/de_de.json
525232bd81bef5086d210ceee26742c06818c9e9 assets/create/lang/unfinished/es_es.json
02e31fdd37f3b933ca96531c3d98b1e352e858d9 assets/create/lang/unfinished/es_mx.json
7754dc1f5c493d81189d535841bd32401d328e19 assets/create/lang/unfinished/fr_fr.json
f5064df0df1f055ba8ac42a97831171b2cb724eb assets/create/lang/unfinished/it_it.json
429da2684276d3385e82851f6a0a176c5dd8471e assets/create/lang/unfinished/ja_jp.json
9b0ab4186a35d8484dbee5c41cd4000c98b8a0a2 assets/create/lang/unfinished/ko_kr.json
b362f846ad523840e65ffc94ccd0bc6c694acbb5 assets/create/lang/unfinished/nl_nl.json
14950620733669b606d480c6a25b1f8ddea1fbb5 assets/create/lang/unfinished/pt_br.json
832483d95d4f36c1ee247dde86758c7c768912e9 assets/create/lang/unfinished/ru_ru.json
27f5f218699fd03172ecf6d1033689b0a35f23e2 assets/create/lang/unfinished/zh_cn.json
ac53a2d2146238a6314a51c199afdac98465b01a assets/create/lang/unfinished/zh_tw.json
2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json
70c01b50697866652585552dca5c9216934b93e3 assets/create/lang/en_us.json
8723f59cbb46b42a85996195a10b4d68b748b839 assets/create/lang/unfinished/de_de.json
680047cc58a781b0a4fcec0ca36b1194082c6679 assets/create/lang/unfinished/es_es.json
c78a6aa75c3a7afdabb98cfb71d6f5f57d994d04 assets/create/lang/unfinished/es_mx.json
3ee909ec33725d9bfeb8a32e81707b5ad53bfae1 assets/create/lang/unfinished/fr_fr.json
dbd795f8b92e38de488bde470644c92de590c6c4 assets/create/lang/unfinished/it_it.json
b1d41b49c118e588aad2c8edf0e08acf9e14f20a assets/create/lang/unfinished/ja_jp.json
7546ffae02cbda0c17fe77ad6e72a6959303591a assets/create/lang/unfinished/ko_kr.json
030af4ddbc9eaef3f7aafb988e7dac960e232149 assets/create/lang/unfinished/nl_nl.json
3e2dfe4b4d915c48d9e0e130bcb823296310fad9 assets/create/lang/unfinished/pt_br.json
5f423b6846ef1344c7c517af8d7909c6fc284c2e assets/create/lang/unfinished/ru_ru.json
a766c823e582e861782698cc7dba4e52c63e085a assets/create/lang/unfinished/zh_cn.json
25f61a27cc6a48e29fb5db421ce3306b55923cd1 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
@ -466,10 +466,10 @@ a033fbac3129bba9211c6c4a0e16c905643afa39 assets/create/models/block/andesite_cob
9841d6a09a09bf4d5d6a39bdc4904d86b3a825f8 assets/create/models/block/andesite_funnel_horizontal_pull_powered.json
86d5df6e365d9b2e9682f0839f61058360828ba2 assets/create/models/block/andesite_funnel_horizontal_push.json
50af1ff6ce9af162d4e438f21952c7215608dc8e assets/create/models/block/andesite_funnel_horizontal_push_powered.json
618d6ca90addb5913c72789f6188c957afa503f3 assets/create/models/block/andesite_funnel_vertical_pull.json
45365708fa75e2cd3d0702fb0e4960861ada27ab assets/create/models/block/andesite_funnel_vertical_pull_powered.json
53bdeba42894242088e8f7e7734a101fa998d0e4 assets/create/models/block/andesite_funnel_vertical_push.json
3e88fa45e22868dae92a014e589585d37eb465ad assets/create/models/block/andesite_funnel_vertical_push_powered.json
75c914bf9448e25fd01d597de48375a9782bef36 assets/create/models/block/andesite_funnel_vertical_filterless_pull.json
4d70a221809f5bc598a0a0e98bd152e9ab7a2f7f assets/create/models/block/andesite_funnel_vertical_filterless_pull_powered.json
a41c7351513a9514dfdc0fc552b646b1d715c977 assets/create/models/block/andesite_funnel_vertical_filterless_push.json
e7931f28887baadd52ac988fc8eeeb84ee6f0d27 assets/create/models/block/andesite_funnel_vertical_filterless_push_powered.json
b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets/create/models/block/andesite_pillar.json
aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tunnel/cross.json
75f628178fa21a2bd301eea8d1cebf7e94f7d5cc assets/create/models/block/andesite_tunnel/straight.json
@ -1327,7 +1327,7 @@ b10971277417369f421324b28f0a4b47ce4c8625 assets/create/models/item/gabbro_bricks
b3d7398dbc16c450928bd76b772c273382687447 assets/create/models/item/gabbro_cobblestone_stairs.json
5680f24b43838cb6632bfcedba282a244bd24db0 assets/create/models/item/gabbro_cobblestone_wall.json
20950b692eecfccd77d96678bb3d909d51f6d787 assets/create/models/item/gabbro_pillar.json
b10f1b188f2bf380628377bd42af2b8f8ffe5611 assets/create/models/item/gantry_pinion.json
a642f570ec8223c066e542f062aff3b7f93e002b assets/create/models/item/gantry_carriage.json
b4bfd5041b62f3a0a955fa4872d178b590614f22 assets/create/models/item/gantry_shaft.json
6ab0d17f3d02678ed992e188ff09f6b2c00b5b03 assets/create/models/item/gearbox.json
2fe29893d74c176ea35aed73a169c13dd4ddb2a8 assets/create/models/item/gearshift.json
@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json
5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json
0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json
187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json
0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json
356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json
@ -1744,7 +1744,7 @@ b42213bffce4e51618e1bba481959208d247c120 data/create/advancements/recipes/create
11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json
a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json
a91b11ae44d9b1f479c6dee1f1a4580104059287 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_valve.json
e17c45fc17e1a8e1e618b6eae02fa0aba3247495 data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json
b2a73fc7e0e4e764c2af400a6e093c2d78d7d37d data/create/advancements/recipes/create.base/crafting/kinetics/gantry_carriage.json
d1d2fc2f5c4e89393808c65e015917eabb50dffe data/create/advancements/recipes/create.base/crafting/kinetics/gantry_shaft.json
dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json
8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json
@ -2455,7 +2455,7 @@ e51893e1601c470da466b35b17251238e15d0361 data/create/loot_tables/blocks/gabbro_b
54879fe6ca3b7271fbb94ec26bef1c3031942d4d data/create/loot_tables/blocks/gabbro_cobblestone_stairs.json
ae19749df10663efc51b8b27af310164f250ed38 data/create/loot_tables/blocks/gabbro_cobblestone_wall.json
e8d09c919e3b8125d7da0f38383c01bcfc61c7a8 data/create/loot_tables/blocks/gabbro_pillar.json
04e42ba63002ed8ba67780123413f6ff3fb85b02 data/create/loot_tables/blocks/gantry_pinion.json
0ea37ff1af6c6a884670cd12ff1d8fdf223519c5 data/create/loot_tables/blocks/gantry_carriage.json
f2883656e417a78e5e4093002eb1e36ffa1157e9 data/create/loot_tables/blocks/gantry_shaft.json
b0109b4a4f0f738cbbe6b5911e8c3c0310b76f99 data/create/loot_tables/blocks/gearbox.json
5f39461c5c9d3ad8d84195b06b9468fe2b0fb269 data/create/loot_tables/blocks/gearshift.json
@ -2805,7 +2805,7 @@ f4ae37f736d06ccda5fbba7831a7a174ec916a05 data/create/recipes/crafting/kinetics/f
86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json
3dad2a849796df268cd3a06ed37376f2cc529957 data/create/recipes/crafting/kinetics/fluid_valve.json
84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json
5299a12e9272089e64073c8e151b70a5bc57b53c data/create/recipes/crafting/kinetics/gantry_pinion.json
9e75756423b7f9372a2330a7140f80b1b87bd30e data/create/recipes/crafting/kinetics/gantry_carriage.json
21095a156547d4a7d215964be793f1e960b81c09 data/create/recipes/crafting/kinetics/gantry_shaft.json
5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json
b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json

View file

@ -1,21 +1,21 @@
{
"variants": {
"extracting=false,facing=down,powered=false": {
"model": "create:block/andesite_funnel_vertical_pull",
"model": "create:block/andesite_funnel_vertical_filterless_pull",
"x": 180,
"y": 180
},
"extracting=true,facing=down,powered=false": {
"model": "create:block/andesite_funnel_vertical_push",
"model": "create:block/andesite_funnel_vertical_filterless_push",
"x": 180,
"y": 180
},
"extracting=false,facing=up,powered=false": {
"model": "create:block/andesite_funnel_vertical_pull",
"model": "create:block/andesite_funnel_vertical_filterless_pull",
"y": 180
},
"extracting=true,facing=up,powered=false": {
"model": "create:block/andesite_funnel_vertical_push",
"model": "create:block/andesite_funnel_vertical_filterless_push",
"y": 180
},
"extracting=false,facing=north,powered=false": {
@ -49,21 +49,21 @@
"y": 90
},
"extracting=false,facing=down,powered=true": {
"model": "create:block/andesite_funnel_vertical_pull_powered",
"model": "create:block/andesite_funnel_vertical_filterless_pull_powered",
"x": 180,
"y": 180
},
"extracting=true,facing=down,powered=true": {
"model": "create:block/andesite_funnel_vertical_push_powered",
"model": "create:block/andesite_funnel_vertical_filterless_push_powered",
"x": 180,
"y": 180
},
"extracting=false,facing=up,powered=true": {
"model": "create:block/andesite_funnel_vertical_pull_powered",
"model": "create:block/andesite_funnel_vertical_filterless_pull_powered",
"y": 180
},
"extracting=true,facing=up,powered=true": {
"model": "create:block/andesite_funnel_vertical_push_powered",
"model": "create:block/andesite_funnel_vertical_filterless_push_powered",
"y": 180
},
"extracting=false,facing=north,powered=true": {

View file

@ -1,51 +1,51 @@
{
"variants": {
"axis_along_first=false,facing=down": {
"model": "create:block/gantry_pinion/horizontal",
"model": "create:block/gantry_carriage/horizontal",
"x": 270,
"y": 90
},
"axis_along_first=true,facing=down": {
"model": "create:block/gantry_pinion/horizontal",
"model": "create:block/gantry_carriage/horizontal",
"x": 270
},
"axis_along_first=false,facing=up": {
"model": "create:block/gantry_pinion/horizontal",
"model": "create:block/gantry_carriage/horizontal",
"x": 90,
"y": 90
},
"axis_along_first=true,facing=up": {
"model": "create:block/gantry_pinion/horizontal",
"model": "create:block/gantry_carriage/horizontal",
"x": 90
},
"axis_along_first=false,facing=north": {
"model": "create:block/gantry_pinion/vertical",
"model": "create:block/gantry_carriage/vertical",
"y": 180
},
"axis_along_first=true,facing=north": {
"model": "create:block/gantry_pinion/horizontal",
"model": "create:block/gantry_carriage/horizontal",
"y": 180
},
"axis_along_first=false,facing=south": {
"model": "create:block/gantry_pinion/vertical"
"model": "create:block/gantry_carriage/vertical"
},
"axis_along_first=true,facing=south": {
"model": "create:block/gantry_pinion/horizontal"
"model": "create:block/gantry_carriage/horizontal"
},
"axis_along_first=false,facing=west": {
"model": "create:block/gantry_pinion/horizontal",
"model": "create:block/gantry_carriage/horizontal",
"y": 90
},
"axis_along_first=true,facing=west": {
"model": "create:block/gantry_pinion/vertical",
"model": "create:block/gantry_carriage/vertical",
"y": 90
},
"axis_along_first=false,facing=east": {
"model": "create:block/gantry_pinion/horizontal",
"model": "create:block/gantry_carriage/horizontal",
"y": 270
},
"axis_along_first=true,facing=east": {
"model": "create:block/gantry_pinion/vertical",
"model": "create:block/gantry_carriage/vertical",
"y": 270
}
}

View file

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

View file

@ -158,7 +158,7 @@
"block.create.gabbro_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141",
"block.create.gabbro_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141",
"block.create.gabbro_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 o\u0279qq\u0250\u2141",
"block.create.gantry_pinion": "uo\u0131u\u0131\u0500 \u028E\u0279\u0287u\u0250\u2141",
"block.create.gantry_carriage": "\u01DDb\u0250\u0131\u0279\u0279\u0250\u0186 \u028E\u0279\u0287u\u0250\u2141",
"block.create.gantry_shaft": "\u0287\u025F\u0250\u0265S \u028E\u0279\u0287u\u0250\u2141",
"block.create.gearbox": "xoq\u0279\u0250\u01DD\u2141",
"block.create.gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141",

View file

@ -161,7 +161,7 @@
"block.create.gabbro_cobblestone_stairs": "Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "Gabbro Pillar",
"block.create.gantry_pinion": "Gantry Pinion",
"block.create.gantry_carriage": "Gantry Carriage",
"block.create.gantry_shaft": "Gantry Shaft",
"block.create.gearbox": "Gearbox",
"block.create.gearshift": "Gearshift",
@ -1808,6 +1808,221 @@
"create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?",
"create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder",
"create.ponder.subject": "Subject of this scene",
"create.ponder.pondering": "Pondering about...",
"create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "Associated Entries",
"create.ponder.shared.movement_anchors": "With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "32 RPM",
"create.ponder.shared.sneak_and": "Sneak +",
"create.ponder.shared.rpm8": "8 RPM",
"create.ponder.shared.ctrl_and": "Ctrl +",
"create.ponder.shared.rpm16_source": "Source: 16 RPM",
"create.ponder.shared.rpm16": "16 RPM",
"create.ponder.tag.kinetic_sources": "Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "Contraption Actors",
"create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "Item Transportation",
"create.ponder.tag.logistics.description": "Components which help moving items around",
"create.ponder.tag.movement_anchor": "Movement Anchors",
"create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "Aesthetics",
"create.ponder.tag.decoration.description": "Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force",
"create.ponder.tag.redstone": "Logic Components",
"create.ponder.tag.redstone.description": "Components which help with redstone engineering",
"create.ponder.tag.creative": "Creative Mode",
"create.ponder.tag.creative.description": "Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "Fluid Manipulators",
"create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "Encasing Belts",
"create.ponder.belt_casing.text_1": "Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "3. They can connect vertically",
"create.ponder.belt_directions.text_5": "4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "The Brass Funnel",
"create.ponder.brass_funnel.text_1": "Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "12 RPM",
"create.ponder.clutch.header": "Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "Funnel compatibility",
"create.ponder.funnel_compat.text_1": "Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "Vertical Saws",
"create.ponder.funnel_compat.text_3": "Depots",
"create.ponder.funnel_compat.text_4": "Item Drains",
"create.ponder.funnel_direction.header": "Direction of Transfer",
"create.ponder.funnel_direction.text_1": "Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "Using funnels",
"create.ponder.funnel_intro.text_1": "Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "Redstone control",
"create.ponder.funnel_redstone.text_1": "Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "Direct transfer",
"create.ponder.funnel_transfer.text_1": "Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "Straight connections will be reversed",
"create.ponder.gearshift.header": "Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "Encasing Shafts",
"create.ponder.shaft_casing.text_1": "Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 978",
"_": "Missing Localizations: 1155",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "Gabelsteinbruchstein",
"block.create.gabbro_cobblestone_wall": "Gabelsteinbruchstein",
"block.create.gabbro_pillar": "Gabelsteinsäule",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Getriebe",
"block.create.gearshift": "Gangschaltung",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?",
"create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 8",
"_": "Missing Localizations: 186",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "Escaleras de adoquínes de gabro",
"block.create.gabbro_cobblestone_wall": "Pared de adoquínes de gabro",
"block.create.gabbro_pillar": "Pilar de gabro",
"block.create.gantry_pinion": "Piñón de grúa",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "Eje de grúa",
"block.create.gearbox": "Caja de transmisión",
"block.create.gearshift": "Caja de cambios",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "Este quizás no es para ti. ¿Qué tal ese?",
"create.tooltip.randomWipDescription8": "Úsalo y arrepiéntete de tu decisión inmediatamente",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 908",
"_": "Missing Localizations: 1085",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "Escaleras de Piedra Labrada de Gabro",
"block.create.gabbro_cobblestone_wall": "Pared de Piedra Labrada de Gabro",
"block.create.gabbro_pillar": "Pilar de Gabro",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Transmisión",
"block.create.gearshift": "Cambio de Marcha",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?",
"create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 690",
"_": "Missing Localizations: 867",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Boîte à roue dentée",
"block.create.gearshift": "Décaleur de rotation",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "Celui-ci n'est peut-être pas pour vous. Que dire de celui-là?",
"create.tooltip.randomWipDescription8": "Utilisez-le et regrettez immédiatement votre décision.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 25",
"_": "Missing Localizations: 203",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "Scalini di pietrisco di gabbro",
"block.create.gabbro_cobblestone_wall": "Muretto di pietrisco di gabbro",
"block.create.gabbro_pillar": "Pilastro di gabbro",
"block.create.gantry_pinion": "Pignone a portale",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "Albero a portale",
"block.create.gearbox": "Riduttore",
"block.create.gearshift": "Cambio",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "Questo forse non fa per te. Che ne dici di quello?",
"create.tooltip.randomWipDescription8": "Usalo e rimpiangi immediatamente la tua decisione.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 32",
"_": "Missing Localizations: 210",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "斑れい岩の丸石の階段",
"block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の壁",
"block.create.gabbro_pillar": "斑れい岩の柱",
"block.create.gantry_pinion": "ガントリーピニオン",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "ガントリーシャフト",
"block.create.gearbox": "ギアボックス",
"block.create.gearshift": "ギアシフト",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。あれはどう??",
"create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔する。",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 79",
"_": "Missing Localizations: 256",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단",
"block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장",
"block.create.gabbro_pillar": "반려암 기둥",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "기어박스",
"block.create.gearshift": "기어쉬프트",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?",
"create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1177",
"_": "Missing Localizations: 1354",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Versnellingsbak",
"block.create.gearshift": "Versnellingspook",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "Deze is misschien niet geschikt voor jou.",
"create.tooltip.randomWipDescription8": "Gebruikt het en je zal meteen spijt hebben.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1243",
"_": "Missing Localizations: 1420",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Caixa de Transmissão",
"block.create.gearshift": "Câmbio",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?",
"create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 29",
"_": "Missing Localizations: 206",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника",
"block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника",
"block.create.gabbro_pillar": "Габбро колонна",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Коробка передач",
"block.create.gearshift": "Реверсивный механизм",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "Этот, возможно, но не для тебя. Как насчет этого?",
"create.tooltip.randomWipDescription8": "Используя его, вы немедленно пожалеете о своем решении.",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 27",
"_": "Missing Localizations: 204",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "辉长岩圆石楼梯",
"block.create.gabbro_cobblestone_wall": "辉长岩圆石墙",
"block.create.gabbro_pillar": "竖纹辉长岩",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "十字齿轮箱",
"block.create.gearshift": "反转齿轮箱",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "这玩意不是给你用的,换个吧",
"create.tooltip.randomWipDescription8": "试试就逝世。",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 32",
"_": "Missing Localizations: 209",
"_": "->------------------------] Game Elements [------------------------<-",
@ -162,7 +162,7 @@
"block.create.gabbro_cobblestone_stairs": "碎輝長岩樓梯",
"block.create.gabbro_cobblestone_wall": "碎輝長岩牆",
"block.create.gabbro_pillar": "豎紋輝長岩",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "齒輪箱",
"block.create.gearshift": "變速箱",
@ -1809,6 +1809,221 @@
"create.tooltip.randomWipDescription7": "這東西不是給你用的,再找找吧!",
"create.tooltip.randomWipDescription8": "用了就死定了。",
"_": "->------------------------] Ponder Content [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.associated": "UNLOCALIZED: Associated Entries",
"create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.",
"create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM",
"create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM",
"create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources",
"create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force",
"create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors",
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
"create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts",
"create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts",
"create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing",
"create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts",
"create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together",
"create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking",
"create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt",
"create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction",
"create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench",
"create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes",
"create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts",
"create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions",
"create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally",
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics",
"create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities",
"create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel",
"create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives",
"create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row",
"create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction",
"create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees",
"create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts",
"create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives",
"create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled",
"create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead",
"create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift",
"create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2",
"create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch",
"create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line",
"create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection",
"create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs",
"create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally",
"create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled",
"create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved",
"create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels",
"create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels",
"create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions",
"create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
"create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
"create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans",
"create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated",
"create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted",
"create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated",
"create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them",
"create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup",
"create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it",
"create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range",
"create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts",
"create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans",
"create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force",
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility",
"create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.",
"create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws",
"create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots",
"create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains",
"create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer",
"create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.",
"create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.",
"create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels",
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
"create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.",
"create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.",
"create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages",
"create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.",
"create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries",
"create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue",
"create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts",
"create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement",
"create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction",
"create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations",
"create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation",
"create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft",
"create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation",
"create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation",
"create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages",
"create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft",
"create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts",
"create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.",
"create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.",
"create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes",
"create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly",
"create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup",
"create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions",
"create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed",
"create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift",
"create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line",
"create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission",
"create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high",
"create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels",
"create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation",
"create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.",
"create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection",
"create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption",
"create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...",
"create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption",
"create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging",
"create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts",
"create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts",
"create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles",
"create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually",
"create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise",
"create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes",
"create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate",
"create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow",
"create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective",
"_": "Thank you for translating Create!"
}

View file

@ -1,5 +1,5 @@
{
"parent": "create:block/funnel/block_vertical",
"parent": "create:block/funnel/block_vertical_filterless",
"textures": {
"particle": "create:block/andesite_casing",
"7": "create:block/andesite_funnel_plating",

View file

@ -1,5 +1,5 @@
{
"parent": "create:block/funnel/block_vertical",
"parent": "create:block/funnel/block_vertical_filterless",
"textures": {
"particle": "create:block/andesite_casing",
"7": "create:block/andesite_funnel_plating",

View file

@ -1,5 +1,5 @@
{
"parent": "create:block/funnel/block_vertical",
"parent": "create:block/funnel/block_vertical_filterless",
"textures": {
"particle": "create:block/andesite_casing",
"7": "create:block/andesite_funnel_plating",

View file

@ -1,5 +1,5 @@
{
"parent": "create:block/funnel/block_vertical",
"parent": "create:block/funnel/block_vertical_filterless",
"textures": {
"particle": "create:block/andesite_casing",
"7": "create:block/andesite_funnel_plating",

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/gantry_carriage/item"
}

View file

@ -1,3 +0,0 @@
{
"parent": "create:block/gantry_pinion/item"
}

View file

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

View file

@ -2,7 +2,7 @@
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/gantry_pinion"
"create:crafting/kinetics/gantry_carriage"
]
},
"criteria": {
@ -19,7 +19,7 @@
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/gantry_pinion"
"recipe": "create:crafting/kinetics/gantry_carriage"
}
}
},

View file

@ -6,7 +6,7 @@
"entries": [
{
"type": "minecraft:item",
"name": "create:gantry_pinion"
"name": "create:gantry_carriage"
}
],
"conditions": [

View file

@ -20,6 +20,6 @@
}
},
"result": {
"item": "create:gantry_pinion"
"item": "create:gantry_carriage"
}
}

View file

@ -77,7 +77,7 @@ public class AllBlockPartials {
CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"),
CUCKOO_CREEPER = get("cuckoo_clock/creeper"),
GANTRY_COGS = get("gantry_pinion/wheels"),
GANTRY_COGS = get("gantry_carriage/wheels"),
ROPE_COIL = get("rope_pulley/rope_coil"),
ROPE_HALF = get("rope_pulley/rope_half"),

View file

@ -55,7 +55,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlockItem;
@ -693,8 +693,8 @@ public class AllBlocks {
.getName() + "/head"))))
.register();
public static final BlockEntry<GantryPinionBlock> GANTRY_PINION =
REGISTRATE.block("gantry_pinion", GantryPinionBlock::new)
public static final BlockEntry<GantryCarriageBlock> GANTRY_CARRIAGE =
REGISTRATE.block("gantry_carriage", GantryCarriageBlock::new)
.initialProperties(SharedProperties::stone)
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.directionalAxisBlockProvider())
@ -1093,7 +1093,7 @@ public class AllBlocks {
.initialProperties(SharedProperties::stone)
.tag(AllBlockTags.SAFE_NBT.tag)
.onRegister(addMovementBehaviour(FunnelMovementBehaviour.andesite()))
.blockstate(new FunnelGenerator("andesite")::generate)
.blockstate(new FunnelGenerator("andesite", false)::generate)
.item(FunnelItem::new)
.model(FunnelGenerator.itemModel("andesite"))
.build()
@ -1112,7 +1112,7 @@ public class AllBlocks {
.initialProperties(SharedProperties::softMetal)
.tag(AllBlockTags.SAFE_NBT.tag)
.onRegister(addMovementBehaviour(FunnelMovementBehaviour.brass()))
.blockstate(new FunnelGenerator("brass")::generate)
.blockstate(new FunnelGenerator("brass", true)::generate)
.item(FunnelItem::new)
.model(FunnelGenerator.itemModel("brass"))
.build()

View file

@ -187,10 +187,10 @@ public class AllShapes {
TANK_TOP_BOTTOM = shape(TANK_BOTTOM_LID).add(TANK_TOP_LID)
.add(TANK)
.build(),
FUNNEL_FLOOR = shape(2, -2, 2, 14, 8, 14).add(1, 2, 1, 15, 8, 15)
FUNNEL_FLOOR = shape(2, -2, 2, 14, 8, 14).add(1, 1, 1, 15, 8, 15)
.add(0, 4, 0, 16, 10, 16)
.build(),
FUNNEL_CEILING = shape(2, 8, 2, 14, 18, 14).add(1, 8, 1, 15, 14, 15)
FUNNEL_CEILING = shape(2, 8, 2, 14, 18, 14).add(1, 8, 1, 15, 15, 15)
.add(0, 6, 0, 16, 12, 16)
.build(),
DEPOT = shape(CASING_11PX.get(Direction.UP)).add(1, 11, 1, 15, 13, 15)

View file

@ -54,9 +54,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerInstance;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionInstance;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageInstance;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonTileEntity;
@ -248,11 +248,11 @@ public class AllTileEntities {
.onRegister(SingleRotatingInstance::register)
.register();
public static final TileEntityEntry<GantryPinionTileEntity> GANTRY_PINION = Create.registrate()
.tileEntity("gantry_pinion", GantryPinionTileEntity::new)
.validBlocks(AllBlocks.GANTRY_PINION)
.renderer(() -> GantryPinionRenderer::new)
.onRegister(GantryPinionInstance::register)
public static final TileEntityEntry<GantryCarriageTileEntity> GANTRY_PINION = Create.registrate()
.tileEntity("gantry_pinion", GantryCarriageTileEntity::new)
.validBlocks(AllBlocks.GANTRY_CARRIAGE)
.renderer(() -> GantryCarriageRenderer::new)
.onRegister(GantryCarriageInstance::register)
.register();
public static final TileEntityEntry<PumpTileEntity> MECHANICAL_PUMP = Create.registrate()

View file

@ -1,10 +1,5 @@
package com.simibubi.create;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity;
@ -14,15 +9,17 @@ import com.simibubi.create.content.schematics.client.SchematicHandler;
import com.simibubi.create.foundation.ResourceReloadHandler;
import com.simibubi.create.foundation.block.render.CustomBlockModels;
import com.simibubi.create.foundation.block.render.SpriteShifter;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.item.CustomItemModels;
import com.simibubi.create.foundation.item.CustomRenderedItems;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.render.KineticRenderer;
import com.simibubi.create.foundation.render.SuperByteBufferCache;
import com.simibubi.create.foundation.render.backend.Backend;
import com.simibubi.create.foundation.render.backend.OptifineHandler;
import com.simibubi.create.foundation.utility.ghost.GhostBlocks;
import com.simibubi.create.foundation.utility.outliner.Outliner;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BlockModelShapes;
@ -40,6 +37,11 @@ import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
public class CreateClient {
public static ClientSchematicLoader schematicSender;
@ -77,6 +79,7 @@ public class CreateClient {
bufferCache = new SuperByteBufferCache();
bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE);
bufferCache.registerCompartment(ContraptionRenderDispatcher.CONTRAPTION, 20);
bufferCache.registerCompartment(WorldSectionElement.DOC_WORLD_SECTION, 20);
ghostBlocks = new GhostBlocks();
@ -86,6 +89,10 @@ public class CreateClient {
AllEntityTypes.registerRenderers();
getColorHandler().init();
AllFluids.assignRenderLayers();
PonderIndex.register();
PonderIndex.registerTags();
UIRenderHelper.init();
IResourceManager resourceManager = Minecraft.getInstance()
.getResourceManager();

View file

@ -15,7 +15,6 @@ import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel;
import com.simibubi.create.content.contraptions.base.IRotate.StressImpact;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
@ -73,7 +72,7 @@ public abstract class KineticTileEntity extends SmartTileEntity
@Override
public void initialize() {
if (hasNetwork()) {
if (hasNetwork() && !world.isRemote) {
KineticNetwork network = getOrCreateNetwork();
if (!network.initialized)
network.initFromTE(capacity, stress, networkSize);

View file

@ -55,8 +55,9 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
public void tick() {
super.tick();
boolean wasConnected = isConnected();
int timeUnit = getTransferTimeout() / 2;
if (transferTimer > 0) {
if (transferTimer > 0 && (!isVirtual() || transferTimer != timeUnit)) {
transferTimer--;
if (transferTimer == 0 || powered)
stopTransferring();
@ -67,7 +68,6 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
markDirty();
float progress = 0;
int timeUnit = getTransferTimeout() / 2;
if (isConnected)
progress = 1;
else if (transferTimer >= timeUnit * 3)
@ -106,12 +106,13 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
powered = isBlockPowered;
sendData();
}
public boolean isPowered() {
return powered;
}
protected AxisAlignedBB cachedBoundingBox;
@Override
@OnlyIn(Dist.CLIENT)
public AxisAlignedBB getRenderBoundingBox() {

View file

@ -171,7 +171,9 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
public void tick() {
super.tick();
if (!world.isRemote && airCurrentUpdateCooldown-- <= 0) {
boolean server = !world.isRemote || isVirtual();
if (server && airCurrentUpdateCooldown-- <= 0) {
airCurrentUpdateCooldown = AllConfigs.SERVER.kinetics.fanBlockCheckRate.get();
updateAirFlow = true;
}

View file

@ -129,7 +129,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
if (inventory.remainingTime > 0)
spawnParticles(inventory.getStackInSlot(0));
if (world.isRemote)
if (world.isRemote && !isVirtual())
return;
if (inventory.remainingTime < 20 && !inventory.appliedRecipe) {
@ -317,7 +317,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
return;
if (inventory.isEmpty())
return;
if (world.isRemote)
if (world.isRemote && !isVirtual())
return;
List<? extends IRecipe<?>> recipes = getRecipes();

View file

@ -34,7 +34,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock;
@ -293,7 +293,7 @@ public abstract class Contraption {
if (AllBlocks.BELT.has(state))
moveBelt(pos, frontier, visited, state);
if (AllBlocks.GANTRY_PINION.has(state))
if (AllBlocks.GANTRY_CARRIAGE.has(state))
moveGantryPinion(world, pos, frontier, visited, state);
if (AllBlocks.GANTRY_SHAFT.has(state))
@ -435,7 +435,7 @@ public abstract class Contraption {
protected void moveGantryPinion(World world, BlockPos pos, Queue<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
BlockPos offset = pos.offset(state.get(GantryPinionBlock.FACING));
BlockPos offset = pos.offset(state.get(GantryCarriageBlock.FACING));
if (!visited.contains(offset))
frontier.add(offset);
Axis rotationAxis = ((IRotate) state.getBlock()).getRotationAxis(state);
@ -459,7 +459,7 @@ public abstract class Contraption {
if (d.getAxis() == facing.getAxis() && AllBlocks.GANTRY_SHAFT.has(offsetState)
&& offsetState.get(GantryShaftBlock.FACING) == facing)
frontier.add(offset);
else if (AllBlocks.GANTRY_PINION.has(offsetState) && offsetState.get(GantryPinionBlock.FACING) == d)
else if (AllBlocks.GANTRY_CARRIAGE.has(offsetState) && offsetState.get(GantryCarriageBlock.FACING) == d)
frontier.add(offset);
}
}

View file

@ -25,7 +25,8 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity implements IBearingTileEntity, IDisplayAssemblyExceptions {
public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity
implements IBearingTileEntity, IDisplayAssemblyExceptions {
protected ScrollOptionBehaviour<RotationMode> movementMode;
protected ControlledContraptionEntity movedContraption;
@ -35,6 +36,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
protected float clientAngleDiff;
protected AssemblyException lastException;
private float prevAngle;
public MechanicalBearingTileEntity(TileEntityType<? extends MechanicalBearingTileEntity> type) {
super(type);
setLazyTickRate(3);
@ -87,6 +90,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
@Override
public float getInterpolatedAngle(float partialTicks) {
if (isVirtual())
return MathHelper.lerp(partialTicks + .5f, prevAngle, angle);
if (movedContraption == null || movedContraption.isStalled() || !running)
partialTicks = 0;
return MathHelper.lerp(partialTicks, angle, angle + getAngularSpeed());
@ -145,7 +150,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
AllTriggers.triggerForNearbyPlayers(AllTriggers.WINDMILL, world, pos, 5);
if (contraption.getSailBlocks() >= 16 * 8)
AllTriggers.triggerForNearbyPlayers(AllTriggers.MAXED_WINDMILL, world, pos, 5);
contraption.removeBlocksFromWorld(world, BlockPos.ZERO);
movedContraption = ControlledContraptionEntity.create(world, this, contraption);
BlockPos anchor = pos.offset(direction);
@ -179,6 +184,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
public void tick() {
super.tick();
prevAngle = angle;
if (world.isRemote)
clientAngleDiff /= 2;
@ -291,7 +297,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
BlockState state = getBlockState();
if (!(state.getBlock() instanceof BearingBlock))
return false;
BlockState attachedState = world.getBlockState(pos.offset(state.get(BearingBlock.FACING)));
if (attachedState.getMaterial()
.isReplaceable())
@ -304,4 +310,9 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
public boolean shouldRenderAsTE() {
return true;
}
public void setAngle(float forcedAngle) {
angle = forcedAngle;
}
}

View file

@ -24,9 +24,9 @@ import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public class GantryPinionBlock extends DirectionalAxisKineticBlock implements ITE<GantryPinionTileEntity> {
public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements ITE<GantryCarriageTileEntity> {
public GantryPinionBlock(Properties properties) {
public GantryCarriageBlock(Properties properties) {
super(properties);
}
@ -41,7 +41,7 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT
@Override
public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) {
super.updateNeighbors(stateIn, worldIn, pos, flags);
withTileEntityDo(worldIn, pos, GantryPinionTileEntity::checkValidGantryShaft);
withTileEntityDo(worldIn, pos, GantryCarriageTileEntity::checkValidGantryShaft);
}
@Override
@ -113,7 +113,7 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT
}
public static Axis getValidGantryShaftAxis(BlockState state) {
if (!(state.getBlock() instanceof GantryPinionBlock))
if (!(state.getBlock() instanceof GantryCarriageBlock))
return Axis.Y;
IRotate block = (IRotate) state.getBlock();
Axis rotationAxis = block.getRotationAxis(state);
@ -135,8 +135,8 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT
}
@Override
public Class<GantryPinionTileEntity> getTileEntityClass() {
return GantryPinionTileEntity.class;
public Class<GantryCarriageTileEntity> getTileEntityClass() {
return GantryCarriageTileEntity.class;
}
}

View file

@ -14,7 +14,6 @@ import com.simibubi.create.foundation.render.backend.instancing.impl.TransformDa
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
@ -23,15 +22,15 @@ import net.minecraft.world.LightType;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
public class GantryPinionInstance extends ShaftInstance implements ITickableInstance {
public class GantryCarriageInstance extends ShaftInstance implements ITickableInstance {
public static void register(TileEntityType<? extends KineticTileEntity> type) {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () ->
InstancedTileRenderRegistry.instance.register(type, GantryPinionInstance::new));
InstancedTileRenderRegistry.instance.register(type, GantryCarriageInstance::new));
}
private InstanceKey<TransformData> gantryCogs;
public GantryPinionInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
public GantryCarriageInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile);
}
@ -49,13 +48,13 @@ public class GantryPinionInstance extends ShaftInstance implements ITickableInst
@Override
public void tick() {
lastState = world.getBlockState(pos);
Direction facing = lastState.get(GantryPinionBlock.FACING);
Boolean alongFirst = lastState.get(GantryPinionBlock.AXIS_ALONG_FIRST_COORDINATE);
Direction facing = lastState.get(GantryCarriageBlock.FACING);
Boolean alongFirst = lastState.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE);
Direction.Axis rotationAxis = KineticTileEntityRenderer.getRotationAxisOf(tile);
BlockPos visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos()
: tile.getPos()
.offset(facing.getOpposite());
float angleForTe = GantryPinionRenderer.getAngleForTe(tile, visualPos, rotationAxis);
float angleForTe = GantryCarriageRenderer.getAngleForTe(tile, visualPos, rotationAxis);
Direction.Axis gantryAxis = Direction.Axis.X;
for (Direction.Axis axis : Iterate.axes)

View file

@ -21,9 +21,9 @@ import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.BlockPos;
public class GantryPinionRenderer extends KineticTileEntityRenderer {
public class GantryCarriageRenderer extends KineticTileEntityRenderer {
public GantryPinionRenderer(TileEntityRendererDispatcher dispatcher) {
public GantryCarriageRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@ -35,8 +35,8 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer {
if (FastRenderDispatcher.available(te.getWorld())) return;
BlockState state = te.getBlockState();
Direction facing = state.get(GantryPinionBlock.FACING);
Boolean alongFirst = state.get(GantryPinionBlock.AXIS_ALONG_FIRST_COORDINATE);
Direction facing = state.get(GantryCarriageBlock.FACING);
Boolean alongFirst = state.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE);
Axis rotationAxis = getRotationAxisOf(te);
BlockPos visualPos = facing.getAxisDirection() == AxisDirection.POSITIVE ? te.getPos()
: te.getPos()

View file

@ -18,12 +18,12 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
public class GantryPinionTileEntity extends KineticTileEntity implements IDisplayAssemblyExceptions {
public class GantryCarriageTileEntity extends KineticTileEntity implements IDisplayAssemblyExceptions {
boolean assembleNextTick;
protected AssemblyException lastException;
public GantryPinionTileEntity(TileEntityType<?> typeIn) {
public GantryCarriageTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
}
@ -61,7 +61,7 @@ public class GantryPinionTileEntity extends KineticTileEntity implements IDispla
private void tryAssemble() {
BlockState blockState = getBlockState();
if (!(blockState.getBlock() instanceof GantryPinionBlock))
if (!(blockState.getBlock() instanceof GantryCarriageBlock))
return;
Direction direction = blockState.get(FACING);
@ -129,9 +129,9 @@ public class GantryPinionTileEntity extends KineticTileEntity implements IDispla
return defaultModifier;
Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
if (stateFrom.get(GantryPinionBlock.FACING) != direction.getOpposite())
if (stateFrom.get(GantryCarriageBlock.FACING) != direction.getOpposite())
return defaultModifier;
return getGantryPinionModifier(stateTo.get(GantryShaftBlock.FACING), stateFrom.get(GantryPinionBlock.FACING));
return getGantryPinionModifier(stateTo.get(GantryShaftBlock.FACING), stateFrom.get(GantryCarriageBlock.FACING));
}
public static float getGantryPinionModifier(Direction shaft, Direction pinionDirection) {
@ -152,9 +152,9 @@ public class GantryPinionTileEntity extends KineticTileEntity implements IDispla
private boolean shouldAssemble() {
BlockState blockState = getBlockState();
if (!(blockState.getBlock() instanceof GantryPinionBlock))
if (!(blockState.getBlock() instanceof GantryCarriageBlock))
return false;
Direction facing = blockState.get(GantryPinionBlock.FACING)
Direction facing = blockState.get(GantryCarriageBlock.FACING)
.getOpposite();
BlockState shaftState = world.getBlockState(pos.offset(facing));
if (!(shaftState.getBlock() instanceof GantryShaftBlock))

View file

@ -60,7 +60,7 @@ public class GantryContraption extends TranslatingContraption {
@Override
protected boolean shouldUpdateAfterMovement(BlockInfo info) {
return super.shouldUpdateAfterMovement(info) && !AllBlocks.GANTRY_PINION.has(info.state);
return super.shouldUpdateAfterMovement(info) && !AllBlocks.GANTRY_CARRIAGE.has(info.state);
}
@Override

View file

@ -98,10 +98,12 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
return;
}
boolean onClient = world.isRemote && !isVirtual();
if (processingTicks > 0) {
heldItem.prevBeltPosition = .5f;
boolean wasAtBeginning = processingTicks == FILLING_TIME;
if (!world.isRemote || processingTicks < FILLING_TIME)
if (!onClient || processingTicks < FILLING_TIME)
processingTicks--;
if (!continueProcessing()) {
processingTicks = 0;
@ -120,7 +122,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
if (heldItem.beltPosition > 1) {
heldItem.beltPosition = 1;
if (world.isRemote)
if (onClient)
return;
Direction side = heldItem.insertedFrom;
@ -186,7 +188,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
if (!EmptyingByBasin.canItemBeEmptied(world, heldItem.stack))
return;
heldItem.beltPosition = .5f;
if (world.isRemote)
if (onClient)
return;
processingTicks = FILLING_TIME;
sendData();
@ -195,7 +197,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
}
protected boolean continueProcessing() {
if (world.isRemote)
if (world.isRemote && !isVirtual())
return true;
if (processingTicks < 5)
return true;

View file

@ -29,7 +29,7 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle {
protected boolean isVisible;
private RotationIndicatorParticle(World world, double x, double y, double z, int color, float radius1,
float radius2, float speed, Axis axis, int lifeSpan, boolean isVisible, IAnimatedSprite sprite) {
float radius2, float speed, Axis axis, int lifeSpan, boolean isVisible, IAnimatedSprite sprite) {
super(world, x, y, z, sprite, 0);
this.motionX = 0;
this.motionY = 0;
@ -58,7 +58,7 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle {
super.tick();
radius += (radius2 - radius) * .1f;
}
@Override
public void buildGeometry(IVertexBuilder buffer, ActiveRenderInfo renderInfo, float partialTicks) {
if (!isVisible)
@ -69,7 +69,10 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle {
public void move(double x, double y, double z) {
float time = AnimationTickHolder.getTicks();
float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / maxAge));
Vec3d position = VecHelper.rotate(this.offset.scale(radius), angle, axis).add(origin);
if (speed < 0 && axis.isVertical())
angle += 180;
Vec3d position = VecHelper.rotate(this.offset.scale(radius), angle, axis)
.add(origin);
posX = position.x;
posY = position.y;
posZ = position.z;
@ -83,11 +86,12 @@ 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);
double xSpeed, double ySpeed, double zSpeed) {
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);
data.getAxis(), data.lifeSpan, visible, this.spriteSet);
}
}

View file

@ -259,6 +259,16 @@ public class GantryShaftBlock extends DirectionalKineticBlock {
return super.areStatesKineticallyEquivalent(oldState, newState)
&& oldState.get(POWERED) == newState.get(POWERED);
}
@Override
public float getParticleTargetRadius() {
return .35f;
}
@Override
public float getParticleInitialRadius() {
return .25f;
}
public static class PlacementHelper extends PoleHelper<Direction> {

View file

@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.relays.advanced;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageTileEntity;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.BlockState;
@ -31,13 +31,13 @@ public class GantryShaftTileEntity extends KineticTileEntity {
continue;
BlockPos offset = pos.offset(d);
BlockState pinionState = world.getBlockState(offset);
if (!AllBlocks.GANTRY_PINION.has(pinionState))
if (!AllBlocks.GANTRY_CARRIAGE.has(pinionState))
continue;
if (pinionState.get(GantryPinionBlock.FACING) != d)
if (pinionState.get(GantryCarriageBlock.FACING) != d)
continue;
TileEntity tileEntity = world.getTileEntity(offset);
if (tileEntity instanceof GantryPinionTileEntity)
((GantryPinionTileEntity) tileEntity).queueAssembly();
if (tileEntity instanceof GantryCarriageTileEntity)
((GantryCarriageTileEntity) tileEntity).queueAssembly();
}
}
@ -52,24 +52,24 @@ public class GantryShaftTileEntity extends KineticTileEntity {
return defaultModifier;
if (!stateFrom.get(GantryShaftBlock.POWERED))
return defaultModifier;
if (!AllBlocks.GANTRY_PINION.has(stateTo))
if (!AllBlocks.GANTRY_CARRIAGE.has(stateTo))
return defaultModifier;
Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
if (stateTo.get(GantryPinionBlock.FACING) != direction)
if (stateTo.get(GantryCarriageBlock.FACING) != direction)
return defaultModifier;
return GantryPinionTileEntity.getGantryPinionModifier(stateFrom.get(GantryShaftBlock.FACING),
stateTo.get(GantryPinionBlock.FACING));
return GantryCarriageTileEntity.getGantryPinionModifier(stateFrom.get(GantryShaftBlock.FACING),
stateTo.get(GantryCarriageBlock.FACING));
}
@Override
public boolean isCustomConnection(KineticTileEntity other, BlockState state, BlockState otherState) {
if (!AllBlocks.GANTRY_PINION.has(otherState))
if (!AllBlocks.GANTRY_CARRIAGE.has(otherState))
return false;
final BlockPos diff = other.getPos()
.subtract(pos);
Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
return otherState.get(GantryPinionBlock.FACING) == direction;
return otherState.get(GantryCarriageBlock.FACING) == direction;
}
public boolean canAssembleOn() {

View file

@ -82,7 +82,7 @@ public class BeltInventory {
.get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL;
float spacing = 1;
World world = belt.getWorld();
boolean onClient = world.isRemote;
boolean onClient = world.isRemote && !belt.isVirtual();
// resolve ending only when items will reach it this tick
Ending ending = Ending.UNRESOLVED;
@ -105,7 +105,7 @@ public class BeltInventory {
movement *= ServerSpeedProvider.get();
// Don't move if held by processing (client)
if (onClient && currentItem.locked)
if (world.isRemote && currentItem.locked)
continue;
// Don't move if other items are waiting in front
@ -436,5 +436,5 @@ public class BeltInventory {
public List<TransportedItemStack> getTransportedItems() {
return items;
}
}

View file

@ -45,12 +45,12 @@ public class ShaftBlock extends AbstractShaftBlock {
@Override
public float getParticleTargetRadius() {
return .25f;
return .35f;
}
@Override
public float getParticleInitialRadius() {
return 0f;
return .125f;
}
@Override

View file

@ -49,6 +49,8 @@ public class AdjustablePulleyTileEntity extends KineticTileEntity {
@Override
public void tick() {
super.tick();
if (world.isRemote)
return;
if (signalChanged) {
signalChanged = false;
analogSignalChanged(world.getRedstonePowerFromNeighbors(pos));

View file

@ -13,7 +13,7 @@ import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.TextFormatting;
public class SpeedGaugeTileEntity extends GaugeTileEntity{
public class SpeedGaugeTileEntity extends GaugeTileEntity {
public SpeedGaugeTileEntity(TileEntityType<? extends SpeedGaugeTileEntity> type) {
super(type);
@ -23,28 +23,37 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity{
public void onSpeedChanged(float prevSpeed) {
super.onSpeedChanged(prevSpeed);
float speed = Math.abs(getSpeed());
float medium = AllConfigs.SERVER.kinetics.mediumSpeed.get().floatValue();
float fast = AllConfigs.SERVER.kinetics.fastSpeed.get().floatValue();
float max = AllConfigs.SERVER.kinetics.maxRotationSpeed.get().floatValue();
color = ColorHelper.mixColors(SpeedLevel.of(speed).getColor(), 0xffffff, .25f);
color = speed == 0 ? 0x333333
: ColorHelper.mixColors(SpeedLevel.of(speed)
.getColor(), 0xffffff, .25f);
if (speed == 69)
AllTriggers.triggerForNearbyPlayers(AllTriggers.SPEED_READ, world, pos, 6,
GogglesItem::canSeeParticles);
if (speed == 0) {
dialTarget = 0;
color = 0x333333;
} else if (speed < medium) {
dialTarget = MathHelper.lerp(speed / medium, 0, .45f);
} else if (speed < fast) {
dialTarget = MathHelper.lerp((speed - medium) / (fast - medium), .45f, .75f);
} else {
dialTarget = MathHelper.lerp((speed - fast) / (max - fast), .75f, 1.125f);
}
AllTriggers.triggerForNearbyPlayers(AllTriggers.SPEED_READ, world, pos, 6, GogglesItem::canSeeParticles);
dialTarget = getDialTarget(speed);
markDirty();
}
public static float getDialTarget(float speed) {
speed = Math.abs(speed);
float medium = AllConfigs.SERVER.kinetics.mediumSpeed.get()
.floatValue();
float fast = AllConfigs.SERVER.kinetics.fastSpeed.get()
.floatValue();
float max = AllConfigs.SERVER.kinetics.maxRotationSpeed.get()
.floatValue();
float target = 0;
if (speed == 0)
target = 0;
else if (speed < medium)
target = MathHelper.lerp(speed / medium, 0, .45f);
else if (speed < fast)
target = MathHelper.lerp((speed - medium) / (fast - medium), .45f, .75f);
else
target = MathHelper.lerp((speed - fast) / (max - fast), .75f, 1.125f);
return target;
}
@Override
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
super.addToGoggleTooltip(tooltip, isPlayerSneaking);

View file

@ -19,9 +19,11 @@ public class FunnelGenerator extends SpecialBlockStateGen {
private String type;
private ResourceLocation particleTexture;
private boolean hasFilter;
public FunnelGenerator(String type) {
public FunnelGenerator(String type, boolean hasFilter) {
this.type = type;
this.hasFilter = hasFilter;
this.particleTexture = Create.asResource("block/" + type + "_casing");
}
@ -44,7 +46,7 @@ public class FunnelGenerator extends SpecialBlockStateGen {
Direction facing = s.get(FunnelBlock.FACING);
boolean horizontal = facing.getAxis()
.isHorizontal();
String parent = horizontal ? "horizontal" : "vertical";
String parent = horizontal ? "horizontal" : hasFilter ? "vertical" : "vertical_filterless";
BlockModelBuilder model = p.models()
.withExistingParent("block/" + type + "_funnel_" + parent + extracting + powered,

View file

@ -34,11 +34,12 @@ import net.minecraft.world.biome.Biomes;
public class SchematicWorld extends WrappedWorld {
private Map<BlockPos, BlockState> blocks;
private Map<BlockPos, TileEntity> tileEntities;
private List<TileEntity> renderedTileEntities;
private List<Entity> entities;
private MutableBoundingBox bounds;
protected Map<BlockPos, BlockState> blocks;
protected Map<BlockPos, TileEntity> tileEntities;
protected List<TileEntity> renderedTileEntities;
protected List<Entity> entities;
protected MutableBoundingBox bounds;
public BlockPos anchor;
public boolean renderMode;
@ -179,6 +180,18 @@ public class SchematicWorld extends WrappedWorld {
pos = pos.subtract(anchor);
bounds.expandTo(new MutableBoundingBox(pos, pos));
blocks.put(pos, arg1);
if (tileEntities.containsKey(pos)) {
TileEntity tileEntity = tileEntities.get(pos);
if (!tileEntity.getType().isValidBlock(arg1.getBlock())) {
tileEntities.remove(pos);
renderedTileEntities.remove(tileEntity);
}
}
TileEntity tileEntity = getTileEntity(pos);
if (tileEntity != null)
tileEntities.put(pos, tileEntity);
return true;
}

View file

@ -23,6 +23,7 @@ import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.EmptyModelData;
@ -110,8 +111,12 @@ public class SchematicRenderer {
BufferBuilder bufferBuilder = buffers.get(blockRenderLayer);
if (startedBufferBuilders.add(blockRenderLayer))
bufferBuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
TileEntity tileEntity = blockAccess.getTileEntity(localPos);
if (blockRendererDispatcher.renderModel(state, pos, blockAccess, ms, bufferBuilder, true,
minecraft.world.rand, EmptyModelData.INSTANCE)) {
minecraft.world.rand,
tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE)) {
usedBlockRenderLayers.add(blockRenderLayer);
}
blockstates.add(state);

View file

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

View file

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

View file

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

View file

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

View file

@ -1,8 +1,5 @@
package com.simibubi.create.events;
import java.util.ArrayList;
import java.util.List;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllFluids;
@ -25,10 +22,10 @@ import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperRen
import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler;
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.networking.AllPackets;
import com.simibubi.create.foundation.networking.LeftClickPacket;
import com.simibubi.create.foundation.ponder.PonderTooltipHandler;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
import com.simibubi.create.foundation.render.backend.RenderWork;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
@ -39,7 +36,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.IRenderTypeBuffer;
@ -56,6 +52,7 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
import net.minecraftforge.client.event.RenderTooltipEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.event.TickEvent.ClientTickEvent;
import net.minecraftforge.event.TickEvent.Phase;
@ -66,6 +63,9 @@ import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import java.util.ArrayList;
import java.util.List;
@EventBusSubscriber(value = Dist.CLIENT)
public class ClientEvents {
@ -92,7 +92,8 @@ public class ClientEvents {
CapabilityMinecartController.tick(world);
CouplingPhysics.tick(world);
ScreenOpener.tick();
PonderTooltipHandler.tick();
//ScreenOpener.tick();
ServerSpeedProvider.clientTick();
BeltConnectorHandler.tick();
FilteringRenderer.tick();
@ -136,6 +137,7 @@ public class ClientEvents {
@SubscribeEvent
public static void onRenderWorld(RenderWorldLastEvent event) {
Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView();
float pt = AnimationTickHolder.getPartialTicks();
MatrixStack ms = event.getMatrixStack();
ms.push();
@ -146,9 +148,8 @@ public class ClientEvents {
CreateClient.schematicHandler.render(ms, buffer);
CreateClient.ghostBlocks.renderAll(ms, buffer);
CreateClient.outliner.renderOutlines(ms, buffer);
CreateClient.outliner.renderOutlines(ms, buffer, pt);
// LightVolumeDebugger.render(ms, buffer);
// CollisionDebugger.render(ms, buffer);
buffer.draw();
RenderSystem.enableCull();
@ -172,6 +173,11 @@ public class ClientEvents {
CreateClient.schematicHandler.renderOverlay(ms, buffer, light, overlay);
}
@SubscribeEvent
public static void getItemTooltipColor(RenderTooltipEvent.Color event) {
PonderTooltipHandler.handleTooltipColor(event);
}
@SubscribeEvent
public static void addToItemTooltip(ItemTooltipEvent event) {
if (!AllConfigs.CLIENT.tooltips.get())
@ -193,7 +199,8 @@ public class ClientEvents {
.addInformation(toolTip);
itemTooltip.addAll(0, toolTip);
}
PonderTooltipHandler.addToTooltip(event.getToolTip(), stack);
}
@SubscribeEvent

View file

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

View file

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

View file

@ -1,16 +1,17 @@
package com.simibubi.create.foundation.command;
import java.util.Collections;
import java.util.function.Predicate;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.entity.player.PlayerEntity;
import java.util.Collections;
import java.util.function.Predicate;
public class AllCommands {
public static Predicate<CommandSource> sourceIsPlayer = (cs) -> cs.getEntity() instanceof PlayerEntity;
@ -29,6 +30,7 @@ public class AllCommands {
.then(HighlightCommand.register())
.then(CouplingCommand.register())
.then(CloneCommand.register())
.then(PonderCommand.register())
//utility
.then(util)

View file

@ -4,6 +4,7 @@ import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import com.simibubi.create.foundation.ponder.content.PonderIndexScreen;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
@ -65,6 +66,7 @@ public class ConfigureConfigPacket extends SimplePacketBase {
fixLighting(() -> Actions::experimentalLighting),
overlayReset(() -> Actions::overlayReset),
experimentalRendering(() -> Actions::experimentalRendering),
ponderIndex(() -> Actions::ponderIndex),
;
@ -130,6 +132,11 @@ public class ConfigureConfigPacket extends SimplePacketBase {
Minecraft.getInstance().worldRenderer.loadRenderers();
}
@OnlyIn(Dist.CLIENT)
private static void ponderIndex(String value) {
ScreenOpener.transitionTo(new PonderIndexScreen());
}
private static ITextComponent boolToText(boolean b) {
return b
? new StringTextComponent("enabled").applyTextStyle(TextFormatting.DARK_GREEN)

View file

@ -0,0 +1,25 @@
package com.simibubi.create.foundation.command;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.simibubi.create.foundation.networking.AllPackets;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraftforge.fml.network.PacketDistributor;
public class PonderCommand {
static ArgumentBuilder<CommandSource, ?> register() {
return Commands.literal("ponder")
.requires(cs -> cs.hasPermissionLevel(0))
.executes(ctx -> {
ServerPlayerEntity player = ctx.getSource().asPlayer();
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> player),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.ponderIndex.name(), ""));
return 1;
});
}
}

View file

@ -1,21 +1,49 @@
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.ponder.PonderRegistry;
import com.simibubi.create.foundation.utility.FilesHelper;
import com.simibubi.create.foundation.utility.Lang;
public enum AllLangPartials {
ADVANCEMENTS("Advancements"),
MESSAGES("UI & Messages"),
TOOLTIPS("Item Descriptions"),
PONDER("Ponder Content", PonderRegistry::provideLangEntries),
;
private String display;
private Supplier<JsonElement> provider;
private AllLangPartials(String display) {
this.display = display;
this.provider = this::fromResource;
}
private AllLangPartials(String display, Supplier<JsonElement> customProvider) {
this.display = display;
this.provider = customProvider;
}
public String getDisplay() {
return display;
}
public JsonElement provide() {
return provider.get();
}
private JsonElement fromResource() {
String fileName = Lang.asId(name());
String filepath = "assets/" + Create.ID + "/lang/default/" + fileName + ".json";
JsonElement element = FilesHelper.loadJsonResource(filepath);
if (element == null)
throw new IllegalStateException(String.format("Could not find default lang file: %s", filepath));
return element;
}
}

View file

@ -23,8 +23,8 @@ import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.utility.FilesHelper;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.DirectoryCache;
@ -45,12 +45,28 @@ public class LangMerger implements IDataProvider {
private Map<String, Map<String, String>> allLocalizedEntries;
private Map<String, MutableInt> missingTranslationTally;
private List<String> langIgnore;
public LangMerger(DataGenerator gen) {
this.gen = gen;
this.mergedLangData = new ArrayList<>();
this.langIgnore = new ArrayList<>();
this.allLocalizedEntries = new HashMap<>();
this.populatedLangData = new HashMap<>();
this.missingTranslationTally = new HashMap<>();
populateLangIgnore();
}
private void populateLangIgnore() {
// Key prefixes added here will NOT be transferred to lang templates
langIgnore.add("create.ponder.debug_"); // Ponder debug scene text
}
private boolean shouldIgnore(String key) {
for (String string : langIgnore)
if (key.startsWith(string))
return true;
return false;
}
@Override
@ -128,6 +144,8 @@ public class LangMerger implements IDataProvider {
.stream()
.forEachOrdered(entry -> {
String key = entry.getKey();
if (shouldIgnore(key))
return;
String value = entry.getValue()
.getAsString();
if (!previousKey.getValue()
@ -158,9 +176,11 @@ public class LangMerger implements IDataProvider {
}
protected boolean shouldAddLineBreak(String key, String previousKey) {
// Always put tooltips in their own paragraphs
// Always put tooltips and ponder scenes in their own paragraphs
if (key.endsWith(".tooltip"))
return true;
if (key.startsWith("create.ponder") && key.endsWith(PonderScene.TITLE_KEY))
return true;
key = key.replaceFirst("\\.", "");
previousKey = previousKey.replaceFirst("\\.", "");
@ -201,14 +221,9 @@ public class LangMerger implements IDataProvider {
}
private void collectEntries() {
for (AllLangPartials partial : AllLangPartials.values()) {
String fileName = Lang.asId(partial.name());
String filepath = "assets/" + Create.ID + "/lang/default/" + fileName + ".json";
JsonElement element = FilesHelper.loadJsonResource(filepath);
if (element == null)
throw new IllegalStateException(String.format("Could not find default lang file: %s", filepath));
addAll(partial.getDisplay(), element.getAsJsonObject());
}
for (AllLangPartials partial : AllLangPartials.values())
addAll(partial.getDisplay(), partial.provide()
.getAsJsonObject());
}
private void save(DirectoryCache cache, List<Object> dataIn, int missingKeys, Path target, String message)

View file

@ -317,8 +317,8 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("P")
.patternLine("A")
.patternLine("P")),
GANTRY_PINION = create(AllBlocks.GANTRY_PINION).unlockedBy(I::andesiteCasing)
GANTRY_PINION = create(AllBlocks.GANTRY_CARRIAGE).unlockedBy(I::andesiteCasing)
.viaShaped(b -> b.key('B', ItemTags.PLANKS)
.key('S', I.cog())
.key('C', I.andesiteCasing())

View file

@ -9,6 +9,7 @@ import javax.annotation.Nullable;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.gui.widget.Widget;
@ -41,6 +42,8 @@ public abstract class AbstractSimiContainerScreen<T extends Container> extends C
@Override
public void render(int mouseX, int mouseY, float partialTicks) {
partialTicks = Minecraft.getInstance()
.getRenderPartialTicks();
renderBackground();
renderWindow(mouseX, mouseY, partialTicks);

View file

@ -2,9 +2,18 @@ package com.simibubi.create.foundation.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.mutable.MutableBoolean;
import org.apache.commons.lang3.mutable.MutableInt;
import org.lwjgl.glfw.GLFW;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget;
import com.simibubi.create.foundation.utility.LerpedFloat;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.Widget;
import net.minecraft.util.text.StringTextComponent;
@ -16,11 +25,19 @@ public abstract class AbstractSimiScreen extends Screen {
protected int sWidth, sHeight;
protected int guiLeft, guiTop;
protected int depthPointX, depthPointY;
protected List<Widget> widgets;
public final LerpedFloat transition = LerpedFloat.linear()
.startWithValue(0)
.chase(0, .1f, LerpedFloat.Chaser.LINEAR);
protected AbstractSimiScreen() {
super(new StringTextComponent(""));
widgets = new ArrayList<>();
MainWindow window = Minecraft.getInstance()
.getWindow();
depthPointX = window.getScaledWidth() / 2;
depthPointY = window.getScaledHeight() / 2;
}
protected void setWindowSize(int width, int height) {
@ -30,33 +47,108 @@ public abstract class AbstractSimiScreen extends Screen {
guiTop = (this.height - sHeight) / 2;
}
@Override
public void tick() {
super.tick();
transition.tickChaser();
}
@Override
public void render(int mouseX, int mouseY, float partialTicks) {
renderBackground();
partialTicks = partialTicks == 10 ? 0
: Minecraft.getInstance()
.getRenderPartialTicks();
RenderSystem.pushMatrix();
renderTransition(mouseX, mouseY, partialTicks);
renderWindow(mouseX, mouseY, partialTicks);
for (Widget widget : widgets)
widget.render(mouseX, mouseY, partialTicks);
renderWindowForeground(mouseX, mouseY, partialTicks);
for (Widget widget : widgets)
widget.renderToolTip(mouseX, mouseY);
RenderSystem.popMatrix();
renderBreadcrumbs(mouseX, mouseY, partialTicks);
}
private void renderTransition(int mouseX, int mouseY, float partialTicks) {
if (transition.getChaseTarget() == 0) {
renderBackground();
return;
}
renderBackground();
Screen lastScreen = ScreenOpener.getPreviouslyRenderedScreen();
float transitionValue = transition.getValue(partialTicks);
double scale = 1 + 0.5 * transitionValue;
// draw last screen into buffer
if (lastScreen != null && lastScreen != this) {
RenderSystem.pushMatrix();// 1
UIRenderHelper.framebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
UIRenderHelper.prepFramebufferSize();
RenderSystem.pushMatrix();// 2
RenderSystem.translated(0, 0, -1000);
UIRenderHelper.framebuffer.bindFramebuffer(true);
lastScreen.render(mouseX, mouseY, 10);
RenderSystem.popMatrix();// 2
// use the buffer texture
Minecraft.getInstance()
.getFramebuffer()
.bindFramebuffer(true);
MainWindow window = Minecraft.getInstance()
.getWindow();
int dpx = window.getScaledWidth() / 2;
int dpy = window.getScaledHeight() / 2;
if (lastScreen instanceof AbstractSimiScreen) {
dpx = ((AbstractSimiScreen) lastScreen).depthPointX;
dpy = ((AbstractSimiScreen) lastScreen).depthPointY;
}
// transitionV is 1/-1 when the older screen is hidden
// transitionV is 0 when the older screen is still fully visible
RenderSystem.translated(dpx, dpy, 0);
RenderSystem.scaled(scale, scale, 1);
RenderSystem.translated(-dpx, -dpy, 0);
UIRenderHelper.drawFramebuffer(1f - Math.abs(transitionValue));
RenderSystem.popMatrix();// 1
}
// modify current screen as well
scale = transitionValue > 0 ? 1 - 0.5 * (1 - transitionValue) : 1 + .5 * (1 + transitionValue);
RenderSystem.translated(depthPointX, depthPointY, 0);
RenderSystem.scaled(scale, scale, 1);
RenderSystem.translated(-depthPointX, -depthPointY, 0);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
boolean result = false;
for (Widget widget : widgets) {
for (Widget widget : widgets)
if (widget.mouseClicked(x, y, button))
result = true;
}
return result;
}
@Override
public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) {
for (Widget widget : widgets) {
for (Widget widget : widgets)
if (widget.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_))
return true;
if (code == GLFW.GLFW_KEY_BACKSPACE) {
ScreenOpener.openPreviousScreen(this);
return true;
}
return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_);
}
@ -79,7 +171,7 @@ public abstract class AbstractSimiScreen extends Screen {
}
return super.mouseScrolled(mouseX, mouseY, delta);
}
@Override
public boolean mouseReleased(double x, double y, int button) {
boolean result = false;
@ -95,6 +187,12 @@ public abstract class AbstractSimiScreen extends Screen {
return true;
}
@Override
public void onClose() {
ScreenOpener.clearStack();
super.onClose();
}
@Override
public boolean isPauseScreen() {
return false;
@ -102,15 +200,84 @@ public abstract class AbstractSimiScreen extends Screen {
protected abstract void renderWindow(int mouseX, int mouseY, float partialTicks);
protected void renderBreadcrumbs(int mouseX, int mouseY, float partialTicks) {
List<Screen> history = ScreenOpener.getScreenHistory();
if (history.isEmpty())
return;
history.add(0, Minecraft.getInstance().currentScreen);
int spacing = 20;
List<String> names = history.stream()
.map(AbstractSimiScreen::screenTitle)
.collect(Collectors.toList());
int bWidth = names.stream()
.mapToInt(s -> font.getStringWidth(s) + spacing)
.sum();
MutableInt x = new MutableInt(width - bWidth);
MutableInt y = new MutableInt(height - 18);
MutableBoolean first = new MutableBoolean(true);
if (x.getValue() < 25)
x.setValue(25);
RenderSystem.pushMatrix();
RenderSystem.translated(0, 0, 600);
names.forEach(s -> {
int sWidth = font.getStringWidth(s);
// UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing,
// 14, spacing/2, 0xbbababab, 0x22ababab);
UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing, 14, spacing / 2, 0xdd101010,
0x44101010);
drawString(font, s, x.getValue() + 5, y.getValue() + 3, first.getValue() ? 0xffeeffee : 0xffddeeff);
first.setFalse();
x.add(sWidth + spacing);
});
RenderSystem.popMatrix();
}
private static String screenTitle(Screen screen) {
if (screen instanceof AbstractSimiScreen)
return ((AbstractSimiScreen) screen).getBreadcrumbTitle();
return screen.getClass()
.getSimpleName();
}
protected String getBreadcrumbTitle() {
return this.getClass()
.getSimpleName();
}
protected void renderWindowForeground(int mouseX, int mouseY, float partialTicks) {
for (Widget widget : widgets) {
if (!widget.isHovered())
continue;
if (widget instanceof AbstractSimiWidget && !((AbstractSimiWidget) widget).getToolTip().isEmpty()) {
if (widget instanceof AbstractSimiWidget && !((AbstractSimiWidget) widget).getToolTip()
.isEmpty()) {
renderTooltip(((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY);
}
}
}
public void centerScalingOn(int x, int y) {
depthPointX = x;
depthPointY = y;
}
public void centerScalingOnMouse() {
MainWindow w = minecraft.getWindow();
double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth();
double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight();
centerScalingOn((int) mouseX, (int) mouseY);
}
public boolean isEquivalentTo(AbstractSimiScreen other) {
return false;
}
}

View file

@ -1,15 +1,13 @@
package com.simibubi.create.foundation.gui;
import com.simibubi.create.Create;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public enum AllGuiTextures {
public enum AllGuiTextures implements IScreenRenderable {
// Inventories
PLAYER_INVENTORY("player_inventory.png", 176, 108),
@ -79,6 +77,9 @@ public enum AllGuiTextures {
INDICATOR_GREEN("widgets.png", 36, 18, 18, 6),
INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6),
INDICATOR_RED("widgets.png", 72, 18, 18, 6),
SPEECH_TOOLTIP("widgets.png", 0, 24, 8, 8),
SPEECH_TOOLTIP_HIGHLIGHT("widgets.png", 8, 24, 8, 8),
// PlacementIndicator
PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 16, 256);
@ -114,16 +115,10 @@ public enum AllGuiTextures {
.bindTexture(location);
}
@Override
@OnlyIn(Dist.CLIENT)
public void draw(AbstractGui screen, int x, int y) {
bind();
screen.blit(x, y, startX, startY, width, height);
}
@OnlyIn(Dist.CLIENT)
public void draw(int x, int y) {
draw(new Screen(null) {
}, x, y);
}
}

View file

@ -5,10 +5,8 @@ import com.mojang.blaze3d.matrix.MatrixStack.Entry;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.ResourceLocation;
@ -16,7 +14,7 @@ import net.minecraft.util.math.Vec3d;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class AllIcons {
public class AllIcons implements IScreenRenderable {
public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png");
private static int x = 0, y = -1;
@ -70,7 +68,10 @@ public class AllIcons {
I_REPLACE = next(),
I_CLEAR = next(),
I_OVERLAY = next(),
I_FLATTEN = next();
I_FLATTEN = next(),
I_LMB = next(),
I_SCROLL = next(),
I_RMB = next();
public static final AllIcons
I_TOOL_DEPLOY = newRow(),
@ -115,7 +116,13 @@ 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(),
I_MTD_SCAN = next(),
I_MTD_REPLAY = next();
public AllIcons(int x, int y) {
iconX = x * 16;
@ -137,18 +144,13 @@ public class AllIcons {
.bindTexture(ICON_ATLAS);
}
@Override
@OnlyIn(Dist.CLIENT)
public void draw(AbstractGui screen, int x, int y) {
bind();
screen.blit(x, y, iconX, iconY, 16, 16);
}
@OnlyIn(Dist.CLIENT)
public void draw(int x, int y) {
draw(new Screen(null) {
}, x, y);
}
@OnlyIn(Dist.CLIENT)
public void draw(MatrixStack ms, IRenderTypeBuffer buffer, int color) {
IVertexBuilder builder = buffer.getBuffer(RenderType.getTextSeeThrough(ICON_ATLAS));

View file

@ -0,0 +1,18 @@
package com.simibubi.create.foundation.gui;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public interface IScreenRenderable {
@OnlyIn(Dist.CLIENT)
void draw(AbstractGui screen, int x, int y);
@OnlyIn(Dist.CLIENT)
default void draw(int x, int y) {
draw(new Screen(new StringTextComponent("")) {}, x, y);
}
}

View file

@ -1,29 +1,91 @@
package com.simibubi.create.foundation.gui;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import javax.annotation.Nullable;
import com.simibubi.create.foundation.utility.LerpedFloat;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
public class ScreenOpener {
@OnlyIn(Dist.CLIENT)
private static Screen openedGuiNextTick;
private static final Deque<Screen> backStack = new ArrayDeque<>();
private static Screen backSteppedFrom = null;
public static void tick() {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
if (openedGuiNextTick != null) {
Minecraft.getInstance().displayGuiScreen(openedGuiNextTick);
openedGuiNextTick = null;
}
});
public static void open(Screen screen) {
open(Minecraft.getInstance().currentScreen, screen);
}
public static void open(Screen gui) {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
openedGuiNextTick = gui;
});
public static void open(@Nullable Screen current, Screen toOpen) {
backSteppedFrom = null;
if (current != null) {
if (backStack.size() >= 15) // don't go deeper than 15 steps
backStack.pollLast();
backStack.push(current);
} else
backStack.clear();
openScreen(toOpen);
}
public static void openPreviousScreen(Screen current) {
if (backStack.isEmpty())
return;
backSteppedFrom = current;
Screen previousScreen = backStack.pop();
if (previousScreen instanceof AbstractSimiScreen)
((AbstractSimiScreen) previousScreen).transition.startWithValue(-0.1)
.chase(-1, .4f, LerpedFloat.Chaser.EXP);
openScreen(previousScreen);
}
// transitions are only supported in simiScreens atm. they take care of all the
// rendering for it
public static void transitionTo(AbstractSimiScreen screen) {
if (tryBackTracking(screen))
return;
screen.transition.startWithValue(0.1)
.chase(1, .4f, LerpedFloat.Chaser.EXP);
open(screen);
}
private static boolean tryBackTracking(AbstractSimiScreen screen) {
List<Screen> screenHistory = getScreenHistory();
if (screenHistory.isEmpty())
return false;
Screen previouslyRenderedScreen = screenHistory.get(0);
if (!(previouslyRenderedScreen instanceof AbstractSimiScreen))
return false;
if (!screen.isEquivalentTo((AbstractSimiScreen) previouslyRenderedScreen))
return false;
openPreviousScreen(Minecraft.getInstance().currentScreen);
return true;
}
public static void clearStack() {
backStack.clear();
}
public static List<Screen> getScreenHistory() {
return new ArrayList<>(backStack);
}
@Nullable
public static Screen getPreviouslyRenderedScreen() {
return backSteppedFrom != null ? backSteppedFrom : backStack.peek();
}
private static void openScreen(Screen screen) {
Minecraft.getInstance()
.enqueue(() -> Minecraft.getInstance()
.displayGuiScreen(screen));
}
}

View file

@ -0,0 +1,179 @@
package com.simibubi.create.foundation.gui;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.shader.Framebuffer;
import net.minecraftforge.fml.client.gui.GuiUtils;
public class UIRenderHelper {
public static Framebuffer framebuffer;
public static void init() {
RenderSystem.recordRenderCall(() -> {
MainWindow mainWindow = Minecraft.getInstance().getWindow();
framebuffer = new Framebuffer(mainWindow.getFramebufferWidth(), mainWindow.getFramebufferHeight(), true, Minecraft.IS_RUNNING_ON_MAC);
framebuffer.setFramebufferColor(0, 0, 0, 0);
// framebuffer.deleteFramebuffer();
});
}
public static void prepFramebufferSize() {
MainWindow window = Minecraft.getInstance().getWindow();
if (framebuffer.framebufferWidth != window.getFramebufferWidth() || framebuffer.framebufferHeight != window.getFramebufferHeight()) {
framebuffer.func_216491_a(window.getFramebufferWidth(), window.getFramebufferHeight(), Minecraft.IS_RUNNING_ON_MAC);
}
}
public static void drawFramebuffer(float alpha) {
MainWindow window = Minecraft.getInstance()
.getWindow();
float vx = (float) window.getScaledWidth();
float vy = (float) window.getScaledHeight();
float tx = (float) framebuffer.framebufferWidth / (float) framebuffer.framebufferTextureWidth;
float ty = (float) framebuffer.framebufferHeight / (float) framebuffer.framebufferTextureHeight;
RenderSystem.enableTexture();
RenderSystem.enableBlend();
RenderSystem.disableLighting();
RenderSystem.disableAlphaTest();
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
framebuffer.bindFramebufferTexture();
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuffer();
bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEXTURE);
bufferbuilder.vertex(0, vy, 0).color(1, 1, 1, alpha).texture(0,0).endVertex();
bufferbuilder.vertex(vx, vy, 0).color(1, 1, 1, alpha).texture(tx,0).endVertex();
bufferbuilder.vertex(vx, 0, 0).color(1, 1, 1, alpha).texture(tx, ty).endVertex();
bufferbuilder.vertex(0, 0, 0).color(1, 1, 1, alpha).texture(0, ty).endVertex();
tessellator.draw();
framebuffer.unbindFramebufferTexture();
RenderSystem.disableBlend();
RenderSystem.enableAlphaTest();
}
//angle in degrees; 0° -> fading to the right
//x and y specify the middle point of the starting edge
//width is the total width of the streak
public static void streak(float angle, int x, int y, int width, int length, int color) {
int a1 = 0xa0 << 24;
int a2 = 0x80 << 24;
int a3 = 0x10 << 24;
int a4 = 0x00 << 24;
color = color & 0x00FFFFFF;
int c1 = a1 | color;
int c2 = a2 | color;
int c3 = a3 | color;
int c4 = a4 | color;
RenderSystem.pushMatrix();
RenderSystem.translated(x, y, 0);
RenderSystem.rotatef(angle - 90, 0, 0, 1);
streak(width/2, length, c1, c2, c3, c4);
RenderSystem.popMatrix();
}
private static void streak(int width, int height, int c1, int c2, int c3, int c4) {
double split1 = .5;
double split2 = .75;
GuiUtils.drawGradientRect(0, -width, 0, width, (int) (split1 * height), c1, c2);
GuiUtils.drawGradientRect(0, -width, (int) (split1 * height), width, (int) (split2 * height), c2, c3);
GuiUtils.drawGradientRect(0, -width, (int) (split2 * height), width, height, c3, c4);
}
//draws a wide chevron-style breadcrumb arrow pointing left
public static void breadcrumbArrow(int x, int y, int width, int height, int indent, int startColor, int endColor) {
RenderSystem.pushMatrix();
RenderSystem.translated(x - indent, y, 0);
breadcrumbArrow(width, height, indent, startColor, endColor);
RenderSystem.popMatrix();
}
private static void breadcrumbArrow(int width, int height, int indent, int c1, int c2) {
/*
* 0,0 x1,y1 ********************* x4,y4 ***** x7,y7
* **** ****
* **** ****
* x0,y0 x2,y2 x5,y5
* **** ****
* **** ****
* x3,y3 ********************* x6,y6 ***** x8,y8
*
* */
double x0 = 0, y0 = height / 2d;
double x1 = indent, y1 = 0;
double x2 = indent, y2 = height / 2d;
double x3 = indent, y3 = height;
double x4 = width, y4 = 0;
double x5 = width, y5 = height / 2d;
double x6 = width, y6 = height;
double x7 = indent + width, y7 = 0;
double x8 = indent + width, y8 = height;
int fc1 = ColorHelper.mixAlphaColors(c1, c2, 0);
int fc2 = ColorHelper.mixAlphaColors(c1, c2, (indent)/(width + 2f * indent));
int fc3 = ColorHelper.mixAlphaColors(c1, c2, (indent + width)/(width + 2f * indent));
int fc4 = ColorHelper.mixAlphaColors(c1, c2, 1);
RenderSystem.disableTexture();
RenderSystem.enableBlend();
RenderSystem.disableAlphaTest();
RenderSystem.defaultBlendFunc();
RenderSystem.shadeModel(GL11.GL_SMOOTH);
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuffer();
bufferbuilder.begin(GL11.GL_TRIANGLES, DefaultVertexFormats.POSITION_COLOR);
bufferbuilder.vertex(x0, y0, 0).color(fc1 >> 16 & 0xFF, fc1 >> 8 & 0xFF, fc1 & 0xFF, fc1 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x1, y1, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x2, y2, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x0, y0, 0).color(fc1 >> 16 & 0xFF, fc1 >> 8 & 0xFF, fc1 & 0xFF, fc1 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x2, y2, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x3, y3, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x3, y3, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x1, y1, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x4, y4, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x3, y3, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x4, y4, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x6, y6, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x5, y5, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x4, y4, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x7, y7, 0).color(fc4 >> 16 & 0xFF, fc4 >> 8 & 0xFF, fc4 & 0xFF, fc4 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x6, y6, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x5, y5, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex();
bufferbuilder.vertex(x8, y8, 0).color(fc4 >> 16 & 0xFF, fc4 >> 8 & 0xFF, fc4 & 0xFF, fc4 >> 24 & 0xFF).endVertex();
tessellator.draw();
RenderSystem.shadeModel(GL11.GL_FLAT);
RenderSystem.disableBlend();
RenderSystem.enableAlphaTest();
RenderSystem.enableTexture();
}
}

View file

@ -45,7 +45,7 @@ public class RenderHooksMixin {
GL20.glUseProgram(0);
}
@Inject(at = @At(value = "INVOKE", target = "updateChunks(J)V"), method = "render")
@Inject(at = @At(value = "INVOKE", target = "net.minecraft.client.renderer.WorldRenderer.updateChunks(J)V"), method = "render")
private void setupFrame(MatrixStack p_228426_1_, float p_228426_2_, long p_228426_3_, boolean p_228426_5_, ActiveRenderInfo info, GameRenderer p_228426_7_, LightTexture p_228426_8_, Matrix4f p_228426_9_, CallbackInfo ci) {
Vec3d cameraPos = info.getProjectedView();
double camX = cameraPos.getX();

View file

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

View file

@ -0,0 +1,19 @@
package com.simibubi.create.foundation.ponder;
public class PonderElement {
boolean visible = true;
public void tick(PonderScene scene) {}
public void reset(PonderScene scene) {}
public boolean isVisible() {
return visible;
}
public void setVisible(boolean visible) {
this.visible = visible;
}
}

View file

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

View file

@ -0,0 +1,117 @@
package com.simibubi.create.foundation.ponder;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.content.PonderTagScreen;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Lang;
public class PonderLocalization {
static Map<String, String> shared = new HashMap<>();
static Map<String, Couple<String>> tag = new HashMap<>();
static Map<String, Map<String, String>> specific = new HashMap<>();
//
public static void registerTag(String key, String enUS, String description) {
tag.put(key, Couple.create(enUS, description));
}
public static void registerShared(String key, String enUS) {
shared.put(key, enUS);
}
public static void registerSpecific(String sceneId, String key, String enUS) {
specific.computeIfAbsent(sceneId, $ -> new HashMap<>())
.put(key, enUS);
}
//
public static String getShared(String key) {
if (PonderIndex.EDITOR_MODE)
return shared.containsKey(key) ? shared.get(key) : ("unregistered shared entry:" + key);
return Lang.translate(langKeyForShared(key));
}
public static String getSpecific(String sceneId, String k) {
if (PonderIndex.EDITOR_MODE)
return specific.get(sceneId)
.get(k);
return Lang.translate(langKeyForSpecific(sceneId, k));
}
public static String getTag(String key) {
if (PonderIndex.EDITOR_MODE)
return tag.containsKey(key) ? tag.get(key)
.getFirst() : ("unregistered tag entry:" + key);
return Lang.translate(langKeyForTag(key));
}
public static String getTagDescription(String key) {
if (PonderIndex.EDITOR_MODE)
return tag.containsKey(key) ? tag.get(key)
.getSecond() : ("unregistered tag entry:" + key);
return Lang.translate(langKeyForTagDescription(key));
}
//
public 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, PonderTooltipHandler.SUBJECT, "Subject of this scene");
addGeneral(object, PonderUI.PONDERING, "Pondering about...");
addGeneral(object, PonderUI.IDENTIFY_MODE, "Identify mode active.\nUnpause with [%1$s]");
addGeneral(object, PonderTagScreen.ASSOCIATED, "Associated Entries");
shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v));
tag.forEach((k, v) -> {
object.addProperty(Create.ID + "." + langKeyForTag(k), v.getFirst());
object.addProperty(Create.ID + "." + langKeyForTagDescription(k), v.getSecond());
});
specific.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.forEach(entry -> {
entry.getValue()
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.forEach(subEntry -> object.addProperty(Create.ID + "." + langKeyForSpecific(entry.getKey(), subEntry.getKey()),
subEntry.getValue()));
});
return object;
}
private static void addGeneral(JsonObject json, String key, String enUS) {
json.addProperty(Create.ID + "." + key, enUS);
}
protected static String langKeyForSpecific(String sceneId, String k) {
return LANG_PREFIX + sceneId + "." + k;
}
protected static String langKeyForShared(String k) {
return LANG_PREFIX + "shared." + k;
}
protected static String langKeyForTag(String k) {
return LANG_PREFIX + "tag." + k;
}
protected static String langKeyForTagDescription(String k) {
return LANG_PREFIX + "tag." + k + ".description";
}
}

View file

@ -0,0 +1,178 @@
package com.simibubi.create.foundation.ponder;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.zip.GZIPInputStream;
import com.google.gson.JsonElement;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard;
import com.simibubi.create.foundation.ponder.content.PonderChapter;
import com.simibubi.create.foundation.ponder.content.PonderChapterRegistry;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.content.PonderTag;
import com.simibubi.create.foundation.ponder.content.PonderTagRegistry;
import com.simibubi.create.foundation.ponder.content.SharedText;
import com.tterrag.registrate.util.entry.ItemProviderEntry;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTSizeTracker;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.gen.feature.template.PlacementSettings;
import net.minecraft.world.gen.feature.template.Template;
public class PonderRegistry {
public static final PonderTagRegistry tags = new PonderTagRegistry();
public static final PonderChapterRegistry chapters = new PonderChapterRegistry();
public static Map<ResourceLocation, List<PonderStoryBoardEntry>> all = new HashMap<>();
public static PonderSceneBuilder addStoryBoard(ItemProviderEntry<?> component, String schematic, PonderStoryBoard storyBoard) {
ResourceLocation id = component.getId();
PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, schematic, id);
PonderSceneBuilder builder = new PonderSceneBuilder(entry);
all.computeIfAbsent(id, _$ -> new ArrayList<>()).add(entry);
return builder;
}
public static PonderSceneBuilder addStoryBoard(PonderChapter chapter, ResourceLocation component, String schematic, PonderStoryBoard storyBoard) {
if (component == null)
component = new ResourceLocation("minecraft", "stick");
PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, schematic, component);
PonderSceneBuilder builder = new PonderSceneBuilder(entry);
chapters.addStoriesToChapter(chapter, entry);
return builder;
}
public static MultiSceneBuilder forComponents(ItemProviderEntry<?>... components) {
return new MultiSceneBuilder(Arrays.asList(components));
}
public static List<PonderScene> compile(ResourceLocation id) {
return compile(all.get(id));
}
public static List<PonderScene> compile(PonderChapter chapter) {
return compile(chapters.getStories(chapter));
}
public static List<PonderScene> compile(List<PonderStoryBoardEntry> entries) {
if (PonderIndex.EDITOR_MODE) {
PonderLocalization.shared.clear();
SharedText.gatherText();
}
List<PonderScene> scenes = new ArrayList<>();
for (int i = 0; i < entries.size(); i++) {
PonderStoryBoardEntry sb = entries.get(i);
Template activeTemplate = loadSchematic(sb.getSchematicName());
PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world);
activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings());
world.createBackup();
PonderScene scene = compileScene(i, sb, world);
scene.begin();
scenes.add(scene);
}
return scenes;
}
public static PonderScene compileScene(int i, PonderStoryBoardEntry sb, PonderWorld world) {
PonderScene scene = new PonderScene(world, sb.getComponent(), sb.getTags());
SceneBuilder builder = scene.builder();
sb.getBoard().program(builder, scene.getSceneBuildingUtil());
return scene;
}
public static Template loadSchematic(String path) {
Template t = new Template();
String filepath = "ponder/" + path + ".nbt";
InputStream resourceAsStream = Create.class.getClassLoader()
.getResourceAsStream(filepath);
if (resourceAsStream == null)
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 ponder schematic", e);
}
return t;
}
public static JsonElement provideLangEntries() {
PonderIndex.register();
PonderTag.register();
SharedText.gatherText();
all.forEach((id, list) -> {
for (int i = 0; i < list.size(); i++)
compileScene(i, list.get(i), null);
});
return PonderLocalization.record();
}
public static class MultiSceneBuilder {
private final Collection<ItemProviderEntry<?>> components;
MultiSceneBuilder(Collection<ItemProviderEntry<?>> components) {
this.components = components;
}
public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) {
return addStoryBoard(schematicPath, storyBoard, PonderSceneBuilder::highlightAllTags);
}
public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard, Consumer<PonderSceneBuilder> extras) {
components.forEach(c -> extras.accept(PonderRegistry.addStoryBoard(c, schematicPath, storyBoard)));
return this;
}
}
public static class PonderSceneBuilder {
private final PonderStoryBoardEntry entry;
PonderSceneBuilder(PonderStoryBoardEntry entry) {
this.entry = entry;
}
public PonderSceneBuilder highlightAllTags() {
entry.getTags().add(PonderTag.Highlight.ALL);
return this;
}
public PonderSceneBuilder highlightTags(PonderTag... tags) {
entry.getTags().addAll(Arrays.asList(tags));
return this;
}
public PonderSceneBuilder chapter(PonderChapter chapter) {
PonderRegistry.chapters.addStoriesToChapter(chapter, entry);
return this;
}
public PonderSceneBuilder chapters(PonderChapter... chapters) {
for (PonderChapter c : chapters)
chapter(c);
return this;
}
}
}

View file

@ -0,0 +1,462 @@
package com.simibubi.create.foundation.ponder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import org.apache.commons.lang3.mutable.MutableDouble;
import org.apache.commons.lang3.mutable.MutableObject;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.content.PonderTag;
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.HideAllInstruction;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.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.entity.Entity;
import net.minecraft.entity.item.ArmorStandEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec2f;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
public class PonderScene {
public static final String TITLE_KEY = "header";
boolean finished;
int sceneIndex;
int textIndex;
String sceneId;
List<PonderInstruction> schedule, activeSchedule;
Map<UUID, PonderElement> linkedElements;
Set<PonderElement> elements;
List<PonderTag> tags;
PonderWorld world;
ResourceLocation component;
SceneTransform transform;
SceneRenderInfo info;
Outliner outliner;
String defaultTitle;
Vec3d pointOfInterest;
Vec3d chasingPointOfInterest;
WorldSectionElement baseWorldSection;
Entity renderViewEntity;
int offsetX;
int offsetZ;
int size;
int totalTime;
int currentTime;
public PonderScene(PonderWorld world, ResourceLocation component, Collection<PonderTag> tags) {
pointOfInterest = Vec3d.ZERO;
textIndex = 1;
this.world = world;
this.component = component;
outliner = new Outliner();
elements = new HashSet<>();
linkedElements = new HashMap<>();
this.tags = new ArrayList<>(tags);
schedule = new ArrayList<>();
activeSchedule = new ArrayList<>();
transform = new SceneTransform();
size = getBounds().getXSize();
info = new SceneRenderInfo();
baseWorldSection = new WorldSectionElement();
renderViewEntity = new ArmorStandEntity(world, 0, 0, 0);
setPointOfInterest(new Vec3d(0, 4, 0));
}
public void deselect() {
forEach(WorldSectionElement.class, WorldSectionElement::resetSelectedBlock);
}
public Pair<ItemStack, BlockPos> rayTraceScene(Vec3d from, Vec3d to) {
MutableObject<Pair<WorldSectionElement, BlockPos>> nearestHit = new MutableObject<>();
MutableDouble bestDistance = new MutableDouble(0);
forEach(WorldSectionElement.class, wse -> {
wse.resetSelectedBlock();
if (!wse.isVisible())
return;
Pair<Vec3d, BlockPos> rayTrace = wse.rayTrace(world, from, to);
if (rayTrace == null)
return;
double distanceTo = rayTrace.getFirst()
.distanceTo(from);
if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue())
return;
nearestHit.setValue(Pair.of(wse, rayTrace.getSecond()));
bestDistance.setValue(distanceTo);
});
if (nearestHit.getValue() == null)
return Pair.of(ItemStack.EMPTY, null);
BlockPos selectedPos = nearestHit.getValue()
.getSecond();
BlockPos origin = new BlockPos(offsetX, 0, offsetZ);
if (!world.getBounds()
.isVecInside(selectedPos))
return Pair.of(ItemStack.EMPTY, null);
if (new MutableBoundingBox(origin, origin.add(new Vec3i(size - 1, 0, size - 1))).isVecInside(selectedPos)) {
if (PonderIndex.EDITOR_MODE)
nearestHit.getValue()
.getFirst()
.selectBlock(selectedPos);
return Pair.of(ItemStack.EMPTY, selectedPos);
}
nearestHit.getValue()
.getFirst()
.selectBlock(selectedPos);
BlockState blockState = world.getBlockState(selectedPos);
ItemStack pickBlock = blockState.getPickBlock(
new BlockRayTraceResult(VecHelper.getCenterOf(selectedPos), Direction.UP, selectedPos, true), world,
selectedPos, Minecraft.getInstance().player);
return Pair.of(pickBlock, selectedPos);
}
public String getTitle() {
return getString(TITLE_KEY);
}
public String getString(String key) {
return PonderLocalization.getSpecific(sceneId, key);
}
public void reset() {
currentTime = 0;
activeSchedule.clear();
schedule.forEach(mdi -> mdi.reset(this));
}
public void begin() {
reset();
forEach(pe -> pe.reset(this));
world.restore();
elements.clear();
linkedElements.clear();
transform = new SceneTransform();
finished = false;
setPointOfInterest(new Vec3d(0, 4, 0));
baseWorldSection.setEmpty();
baseWorldSection.forceApplyFade(1);
elements.add(baseWorldSection);
totalTime = 0;
activeSchedule.addAll(schedule);
activeSchedule.forEach(i -> i.onScheduled(this));
}
public WorldSectionElement getBaseWorldSection() {
return baseWorldSection;
}
public float getSceneProgress() {
return totalTime == 0 ? 0 : currentTime / (float) totalTime;
}
public void fadeOut() {
reset();
activeSchedule.add(new HideAllInstruction(10, null));
}
public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms, float pt) {
ms.push();
Minecraft mc = Minecraft.getInstance();
Entity prevRVE = mc.renderViewEntity;
mc.renderViewEntity = this.renderViewEntity;
forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms, pt));
mc.renderViewEntity = prevRVE;
for (RenderType type : RenderType.getBlockLayers())
forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms, pt));
forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms, pt));
info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt));
world.renderEntities(ms, buffer, info, pt);
world.renderParticles(ms, buffer, info, pt);
outliner.renderOutlines(ms, buffer, pt);
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.tick();
transform.tick();
forEach(e -> e.tick(this));
if (currentTime < totalTime)
currentTime++;
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 addToSceneTime(int time) {
totalTime += time;
}
public void addElement(PonderElement e) {
elements.add(e);
}
public <E extends PonderElement> void linkElement(E e, ElementLink<E> link) {
linkedElements.put(link.getId(), e);
}
public <E extends PonderElement> E resolve(ElementLink<E> link) {
return link.cast(linkedElements.get(link.getId()));
}
public <E extends PonderElement> void runWith(ElementLink<E> link, Consumer<E> callback) {
callback.accept(resolve(link));
}
public <E extends PonderElement, F> F applyTo(ElementLink<E> link, Function<E, F> function) {
return function.apply(resolve(link));
}
public PonderWorld getWorld() {
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 Entity> void forEachWorldEntity(Class<T> type, Consumer<T> function) {
for (Entity element : world.getEntities())
if (type.isInstance(element))
function.accept(type.cast(element));
}
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 Supplier<String> registerText(String defaultText) {
final String key = "text_" + textIndex;
PonderLocalization.registerSpecific(sceneId, key, defaultText);
Supplier<String> supplier = () -> PonderLocalization.getSpecific(sceneId, key);
textIndex++;
return supplier;
}
public SceneBuilder builder() {
return new SceneBuilder(this);
}
public SceneBuildingUtil getSceneBuildingUtil() {
return new SceneBuildingUtil(getBounds());
}
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) {
return apply(ms, AnimationTickHolder.getPartialTicks());
}
public MatrixStack apply(MatrixStack ms, float pt) {
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, -1f, (size + offsetZ) / -2f);
return ms;
}
public void updateSceneRVE() {
Vec3d v = screenToScene(width / 2, height / 2, 500);
renderViewEntity.setPosition(v.x, v.y, v.z);
}
public Vec3d screenToScene(double x, double y, int depth) {
refreshMatrix();
float pt = AnimationTickHolder.getPartialTicks();
Vec3d vec = new Vec3d(x, y, depth);
vec = vec.subtract(width / 2, height / 2, 200);
vec = VecHelper.rotate(vec, 35, Axis.X);
vec = VecHelper.rotate(vec, -55, Axis.Y);
vec = vec.subtract(offset, 0, 0);
vec = VecHelper.rotate(vec, 55, Axis.Y);
vec = VecHelper.rotate(vec, -35, Axis.X);
vec = VecHelper.rotate(vec, -xRotation.getValue(pt), Axis.X);
vec = VecHelper.rotate(vec, -yRotation.getValue(pt), Axis.Y);
vec = vec.mul(1f / 30, 1f / -30, 1f / 30);
vec = vec.subtract((size + offsetX) / -2f, -1f, (size + offsetZ) / -2f);
return vec;
}
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 Outliner getOutliner() {
return outliner;
}
public boolean isFinished() {
return finished;
}
public void setFinished(boolean finished) {
this.finished = finished;
}
}

View file

@ -0,0 +1,43 @@
package com.simibubi.create.foundation.ponder;
import com.simibubi.create.foundation.ponder.content.PonderTag;
import net.minecraft.util.ResourceLocation;
import java.util.ArrayList;
import java.util.List;
public class PonderStoryBoardEntry {
private final String schematicName;
private final PonderStoryBoard board;
private final List<PonderTag> tags;
private final ResourceLocation component;
public PonderStoryBoardEntry(PonderStoryBoard board, String schematicName, ResourceLocation component) {
this.board = board;
this.schematicName = schematicName;
this.tags = new ArrayList<>();
this.component = component;
}
public interface PonderStoryBoard {
void program(SceneBuilder scene, SceneBuildingUtil util);
}
public String getSchematicName() {
return schematicName;
}
public PonderStoryBoard getBoard() {
return board;
}
public List<PonderTag> getTags() {
return tags;
}
public ResourceLocation getComponent() {
return component;
}
}

View file

@ -0,0 +1,162 @@
package com.simibubi.create.foundation.ponder;
import java.util.List;
import com.google.common.base.Strings;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.ponder.content.PonderIndexScreen;
import com.simibubi.create.foundation.ponder.content.PonderTagScreen;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
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;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.client.event.RenderTooltipEvent;
public class PonderTooltipHandler {
static LerpedFloat holdWProgress = LerpedFloat.linear()
.startWithValue(0);
static ItemStack lastHoveredStack = ItemStack.EMPTY;
static boolean subject = false;
public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder";
public static final String SUBJECT = PonderLocalization.LANG_PREFIX + "subject";
public static void tick() {
Minecraft instance = Minecraft.getInstance();
Screen currentScreen = instance.currentScreen;
ItemStack stack = ItemStack.EMPTY;
ItemStack prevStack = lastHoveredStack;
lastHoveredStack = ItemStack.EMPTY;
subject = false;
if (currentScreen instanceof ContainerScreen) {
ContainerScreen<?> cs = (ContainerScreen<?>) currentScreen;
Slot slotUnderMouse = cs.getSlotUnderMouse();
if (slotUnderMouse == null || !slotUnderMouse.getHasStack())
return;
stack = slotUnderMouse.getStack();
} else if (currentScreen instanceof PonderUI) {
PonderUI ponderUI = (PonderUI) currentScreen;
stack = ponderUI.getHoveredTooltipItem();
if (stack.isItemEqual(ponderUI.getSubject()))
subject = true;
} else if (currentScreen instanceof PonderTagScreen) {
PonderTagScreen tagScreen = (PonderTagScreen) currentScreen;
stack = tagScreen.getHoveredTooltipItem();
} else if (currentScreen instanceof PonderIndexScreen) {
PonderIndexScreen indexScreen = (PonderIndexScreen) currentScreen;
stack = indexScreen.getHoveredTooltipItem();
} else
return;
if (stack.isEmpty())
return;
if (!PonderRegistry.all.containsKey(stack.getItem()
.getRegistryName()))
return;
if (prevStack.isEmpty() || !prevStack.isItemEqual(stack))
holdWProgress.startWithValue(0);
float value = holdWProgress.getValue();
int keyCode = ponderKeybind().getKey()
.getKeyCode();
long window = instance.getWindow()
.getHandle();
if (!subject && InputMappings.isKeyDown(window, keyCode)) {
if (value >= 1) {
if (currentScreen instanceof AbstractSimiScreen)
((AbstractSimiScreen) currentScreen).centerScalingOnMouse();
ScreenOpener.transitionTo(PonderUI.of(stack));
holdWProgress.startWithValue(0);
return;
}
holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f));
} else
holdWProgress.setValue(Math.max(0, value - .05f));
lastHoveredStack = stack;
}
public static void addToTooltip(List<ITextComponent> toolTip, ItemStack stack) {
float renderPartialTicks = AnimationTickHolder.getPartialTicks();
if (lastHoveredStack != stack)
return;
if (subject) {
toolTip.set(1, Lang.createTranslationTextComponent(SUBJECT)
.applyTextStyle(TextFormatting.GREEN));
return;
}
toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f)));
}
public static void handleTooltipColor(RenderTooltipEvent.Color event) {
if (lastHoveredStack != event.getStack())
return;
if (holdWProgress.getValue() == 0)
return;
float renderPartialTicks = Minecraft.getInstance()
.getRenderPartialTicks();
int start = event.getOriginalBorderStart();
int end = event.getOriginalBorderEnd();
float progress = Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f);
start = getSmoothColorForProgress(progress);
end = getSmoothColorForProgress((progress));
event.setBorderStart(start | 0xa0000000);
event.setBorderEnd(end | 0xa0000000);
}
private static int getSmoothColorForProgress(float progress) {
if (progress < .5f)
return ColorHelper.mixColors(0x5000FF, 5592575, progress * 2);
return ColorHelper.mixColors(5592575, 0xffffff, (progress - .5f) * 2);
}
private static ITextComponent makeProgressBar(float progress) {
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)
bars += TextFormatting.GRAY + Strings.repeat("|", total - current);
return new StringTextComponent(bars);
}
return new StringTextComponent(holdW);
}
protected static KeyBinding ponderKeybind() {
return Minecraft.getInstance().gameSettings.keyBindForward;
}
}

View file

@ -0,0 +1,746 @@
package com.simibubi.create.foundation.ponder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.IntStream;
import org.apache.commons.lang3.mutable.MutableBoolean;
import org.lwjgl.opengl.GL11;
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.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform;
import com.simibubi.create.foundation.ponder.content.DebugScenes;
import com.simibubi.create.foundation.ponder.content.PonderChapter;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.content.PonderTag;
import com.simibubi.create.foundation.ponder.content.PonderTagScreen;
import com.simibubi.create.foundation.ponder.ui.PonderButton;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.LerpedFloat.Chaser;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.client.ClipboardHelper;
import net.minecraft.client.GameSettings;
import net.minecraft.client.MainWindow;
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.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.gen.feature.template.PlacementSettings;
import net.minecraft.world.gen.feature.template.Template;
import net.minecraftforge.fml.client.gui.GuiUtils;
import net.minecraftforge.registries.ForgeRegistries;
public class PonderUI extends AbstractSimiScreen {
public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering";
public static final String IDENTIFY_MODE = PonderLocalization.LANG_PREFIX + "identify_mode";
public static final String IN_CHAPTER = PonderLocalization.LANG_PREFIX + "in_chapter";
private List<PonderScene> scenes;
private List<PonderTag> tags;
private List<PonderButton> tagButtons;
private List<LerpedFloat> tagFades;
private LerpedFloat fadeIn;
private LerpedFloat sceneProgress;
ItemStack stack;
PonderChapter chapter = null;
private boolean identifyMode;
private ItemStack hoveredTooltipItem;
private BlockPos hoveredBlockPos;
private ClipboardHelper clipboardHelper;
private BlockPos copiedBlockPos;
private LerpedFloat lazyIndex;
private int index = 0;
private PonderButton left, right, scan, chap;
public static PonderUI of(ItemStack item) {
return new PonderUI(PonderRegistry.compile(item.getItem()
.getRegistryName()));
}
public static PonderUI of(PonderChapter chapter) {
PonderUI ui = new PonderUI(PonderRegistry.compile(chapter));
ui.chapter = chapter;
return ui;
}
public PonderUI(List<PonderScene> scenes) {
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));
tags = new ArrayList<>(PonderRegistry.tags.getTags(component));
this.scenes = scenes;
if (scenes.isEmpty()) {
List<PonderStoryBoardEntry> l = Collections.singletonList(new PonderStoryBoardEntry(DebugScenes::empty,
"debug/scene_1", new ResourceLocation("minecraft", "stick")));
scenes.addAll(PonderRegistry.compile(l));
}
lazyIndex = LerpedFloat.linear()
.startWithValue(index);
sceneProgress = LerpedFloat.linear()
.startWithValue(0);
fadeIn = LerpedFloat.linear()
.startWithValue(0)
.chase(1, .1f, Chaser.EXP);
clipboardHelper = new ClipboardHelper();
}
@Override
protected void init() {
super.init();
widgets.clear();
tagButtons = new ArrayList<>();
tagFades = new ArrayList<>();
tags.forEach(t -> {
int i = tagButtons.size();
int x = 31;
int y = 71 + i * 30;
PonderButton b = new PonderButton(x, y, (mouseX, mouseY) -> {
centerScalingOn(mouseX, mouseY);
ScreenOpener.transitionTo(new PonderTagScreen(t));
}).showing(t);
widgets.add(b);
tagButtons.add(b);
LerpedFloat chase = LerpedFloat.linear()
.startWithValue(0)
.chase(0, .05f, Chaser.exp(.1));
tagFades.add(chase);
});
if (chapter != null) {
widgets.add(chap = new PonderButton(width - 31 - 24, 31, () -> {
}).showing(chapter));
}
GameSettings bindings = minecraft.gameSettings;
int spacing = 8;
int bX = (width - 20) / 2 - (70 + 2 * spacing);
int bY = height - 20 - 31;
widgets.add(scan = new PonderButton(bX, bY, () -> {
identifyMode = !identifyMode;
if (!identifyMode)
scenes.get(index)
.deselect();
}).showing(AllIcons.I_MTD_SCAN)
.shortcut(bindings.keyBindDrop)
.fade(0, -1));
bX += 50 + spacing;
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));
bX += 50 + spacing;
widgets.add(new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY)
.shortcut(bindings.keyBindBack)
.fade(0, -1));
}
@Override
public void tick() {
super.tick();
PonderScene activeScene = scenes.get(index);
if (!identifyMode)
activeScene.tick();
sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP);
lazyIndex.tickChaser();
fadeIn.tickChaser();
sceneProgress.tickChaser();
if (!identifyMode) {
float lazyIndexValue = lazyIndex.getValue();
if (Math.abs(lazyIndexValue - index) > 1 / 512f)
scenes.get(lazyIndexValue < index ? index - 1 : index + 1)
.tick();
}
updateIdentifiedItem(activeScene);
}
public void updateIdentifiedItem(PonderScene activeScene) {
hoveredTooltipItem = ItemStack.EMPTY;
hoveredBlockPos = null;
if (!identifyMode)
return;
MainWindow w = minecraft.getWindow();
double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth();
double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight();
SceneTransform t = activeScene.getTransform();
Vec3d vec1 = t.screenToScene(mouseX, mouseY, 1000);
Vec3d vec2 = t.screenToScene(mouseX, mouseY, -100);
Pair<ItemStack, BlockPos> pair = activeScene.rayTraceScene(vec1, vec2);
hoveredTooltipItem = pair.getFirst();
hoveredBlockPos = pair.getSecond();
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double delta) {
if (scroll(delta > 0))
return true;
return super.mouseScrolled(mouseX, mouseY, delta);
}
protected void replay() {
identifyMode = false;
PonderScene scene = scenes.get(index);
if (hasShiftDown()) {
List<PonderStoryBoardEntry> list = PonderRegistry.all.get(scene.component);
PonderStoryBoardEntry sb = list.get(index);
Template activeTemplate = PonderRegistry.loadSchematic(sb.getSchematicName());
PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world);
activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings());
world.createBackup();
scene = PonderRegistry.compileScene(index, sb, world);
scene.begin();
scenes.set(index, scene);
}
scene.begin();
}
protected boolean scroll(boolean forward) {
int prevIndex = index;
index = forward ? index + 1 : index - 1;
index = MathHelper.clamp(index, 0, scenes.size() - 1);
if (prevIndex != index) {// && Math.abs(index - lazyIndex.getValue()) < 1.5f) {
scenes.get(prevIndex)
.fadeOut();
scenes.get(index)
.begin();
lazyIndex.chase(index, 1 / 4f, Chaser.EXP);
identifyMode = false;
return true;
} else
index = prevIndex;
return false;
}
@Override
protected void renderWindow(int mouseX, int mouseY, float partialTicks) {
RenderSystem.enableBlend();
renderVisibleScenes(mouseX, mouseY, identifyMode ? 0 : partialTicks);
renderWidgets(mouseX, mouseY, identifyMode ? 0 : partialTicks);
}
protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) {
renderScene(mouseX, mouseY, index, partialTicks);
float lazyIndexValue = lazyIndex.getValue(partialTicks);
if (Math.abs(lazyIndexValue - index) > 1 / 512f)
renderScene(mouseX, mouseY, lazyIndexValue < index ? index - 1 : index + 1, partialTicks);
}
protected void renderScene(int mouseX, int mouseY, int i, float partialTicks) {
SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance();
PonderScene story = scenes.get(i);
MatrixStack ms = new MatrixStack();
double value = lazyIndex.getValue(AnimationTickHolder.getPartialTicks());
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, partialTicks);
story.transform.updateSceneRVE();
story.renderScene(buffer, ms, partialTicks);
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);
// X AXIS
RenderSystem.pushMatrix();
RenderSystem.translated(4, -3, 0);
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();
// Z AXIS
RenderSystem.pushMatrix();
RenderSystem.scaled(-1, 1, 1);
RenderSystem.translated(0, -3, -4);
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();
// DIRECTIONS
RenderSystem.pushMatrix();
RenderSystem.translated(bounds.getXSize() * -8, 0, bounds.getZSize() * 8);
RenderSystem.rotatef(-90, 0, 1, 0);
for (Direction d : Iterate.horizontalDirections) {
RenderSystem.rotatef(90, 0, 1, 0);
RenderSystem.pushMatrix();
RenderSystem.translated(0, 0, bounds.getZSize() * 16);
RenderSystem.rotatef(-90, 1, 0, 0);
font.drawString(d.name()
.substring(0, 1), 0, 0, 0x66FFFFFF);
font.drawString("|", 2, 10, 0x44FFFFFF);
font.drawString(".", 2, 14, 0x22FFFFFF);
RenderSystem.popMatrix();
}
RenderSystem.popMatrix();
buffer.draw();
RenderSystem.popMatrix();
}
ms.pop();
}
protected void renderWidgets(int mouseX, int mouseY, float partialTicks) {
float fade = fadeIn.getValue(partialTicks);
float lazyIndexValue = lazyIndex.getValue(partialTicks);
float indexDiff = Math.abs(lazyIndexValue - index);
PonderScene activeScene = scenes.get(index);
int textColor = 0xeeeeee;
{
// Chapter title
RenderSystem.pushMatrix();
RenderSystem.translated(0, 0, 800);
int x = 31 + 20 + 8;
int y = 31;
String title = activeScene.getTitle();
int wordWrappedHeight = font.getWordWrappedHeight(title, left.x);
int streakHeight = 35 - 9 + wordWrappedHeight;
UIRenderHelper.streak(0, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (150 * fade), 0x101010);
UIRenderHelper.streak(180, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (30 * fade), 0x101010);
renderBox(21, 21, 30, 30, false);
GuiGameElement.of(stack)
.at(x - 39, y - 11)
.scale(2)
.render();
drawString(font, Lang.translate(PONDERING), x, y - 6, 0xffa3a3a3);
y += 8;
x += 0;
// RenderSystem.translated(0, 3 * (indexDiff), 0);
RenderSystem.translated(x, y, 0);
RenderSystem.rotatef(indexDiff * -75, 1, 0, 0);
RenderSystem.translated(0, 0, 5);
font.drawSplitString(title, 0, 0, left.x, ColorHelper.applyAlpha(textColor, 1 - indexDiff));
RenderSystem.popMatrix();
if (chapter != null) {
RenderSystem.pushMatrix();
RenderSystem.translated(chap.x - 4 - 4, chap.y, 0);
UIRenderHelper.streak(180, 4, 10, 26, (int) (150 * fade), 0x101010);
drawRightAlignedString(font, Lang.translate(IN_CHAPTER), 0, 0, 0xffa3a3a3);
drawRightAlignedString(font,
Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId()), 0, 12, 0xffeeeeee);
RenderSystem.popMatrix();
}
}
if (identifyMode) {
RenderSystem.pushMatrix();
RenderSystem.translated(mouseX, mouseY, 100);
if (hoveredTooltipItem.isEmpty()) {
String tooltip = Lang
.createTranslationTextComponent(IDENTIFY_MODE,
new StringTextComponent(minecraft.gameSettings.keyBindDrop.getKeyBinding()
.getLocalizedName()).applyTextStyle(TextFormatting.WHITE))
.applyTextStyle(TextFormatting.GRAY)
.getFormattedText();
renderTooltip(font.listFormattedStringToWidth(tooltip, width / 3), 0, 0);
} else
renderTooltip(hoveredTooltipItem, 0, 0);
if (hoveredBlockPos != null && PonderIndex.EDITOR_MODE) {
RenderSystem.translated(0, -15, 0);
boolean copied = copiedBlockPos != null && hoveredBlockPos.equals(copiedBlockPos);
String coords = new StringTextComponent(
hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ())
.applyTextStyles(copied ? TextFormatting.GREEN : TextFormatting.GOLD)
.getFormattedText();
renderTooltip(coords, 0, 0);
}
RenderSystem.popMatrix();
scan.flash();
} else {
scan.dim();
}
{
// Scene overlay
RenderSystem.pushMatrix();
RenderSystem.translated(0, 0, 100);
renderOverlay(index, partialTicks);
if (indexDiff > 1 / 512f)
renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, partialTicks);
RenderSystem.popMatrix();
}
// Widgets
widgets.forEach(w -> {
if (w instanceof PonderButton) {
PonderButton mtdButton = (PonderButton) w;
mtdButton.fade(fade);
}
});
if (index == 0 || index == 1 && lazyIndexValue < index)
left.fade(lazyIndexValue);
if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index)
right.fade(scenes.size() - lazyIndexValue - 1);
boolean finished = activeScene.isFinished();
if (finished)
right.flash();
else
right.dim();
{
int x = (width / 2) - 110;
int y = right.y + right.getHeight() + 4;
int w = width - 2 * x;
renderBox(x, y, w, 1, false);
RenderSystem.pushMatrix();
RenderSystem.translated(x - 2, y - 2, 0);
RenderSystem.scaled((w + 4) * sceneProgress.getValue(partialTicks), 1, 1);
GuiUtils.drawGradientRect(200, 0, 3, 1, 4, 0x60ffeedd, 0x60ffeedd);
RenderSystem.popMatrix();
}
// Tags
List<PonderTag> sceneTags = activeScene.tags;
boolean highlightAll = sceneTags.contains(PonderTag.Highlight.ALL);
double s = Minecraft.getInstance()
.getWindow()
.getGuiScaleFactor();
IntStream.range(0, tagButtons.size())
.forEach(i -> {
RenderSystem.pushMatrix();
LerpedFloat chase = tagFades.get(i);
PonderButton button = tagButtons.get(i);
if (button.isMouseOver(mouseX, mouseY)) {
chase.updateChaseTarget(1);
} else
chase.updateChaseTarget(0);
chase.tickChaser();
if (highlightAll || sceneTags.contains(this.tags.get(i)))
button.flash();
else
button.dim();
int x = button.x + button.getWidth() + 4;
int y = button.y - 2;
RenderSystem.translated(x, y + 5 * (1 - fade), 800);
float fadedWidth = 200 * chase.getValue(partialTicks);
UIRenderHelper.streak(0, 0, 12, 26, (int) fadedWidth, 0x101010);
GL11.glScissor((int) (x * s), 0, (int) (fadedWidth * s), (int) (height * s));
GL11.glEnable(GL11.GL_SCISSOR_TEST);
String tagName = this.tags.get(i)
.getTitle();
drawString(tagName, 3, 8, 0xffeedd);
GL11.glDisable(GL11.GL_SCISSOR_TEST);
RenderSystem.popMatrix();
});
}
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;
RenderSystem.pushMatrix();
if (fade < fadeIn.getChaseTarget())
RenderSystem.translated(0, (1 - fade) * 5, 0);
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) {
if (identifyMode)
return;
RenderSystem.pushMatrix();
PonderScene story = scenes.get(i);
MatrixStack ms = new MatrixStack();
story.renderOverlay(this, ms, partialTicks);
RenderSystem.popMatrix();
}
@Override
public boolean mouseClicked(double x, double y, int button) {
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(x, y);
handled.setTrue();
return;
}
});
if (handled.booleanValue())
return true;
if (identifyMode && hoveredBlockPos != null && PonderIndex.EDITOR_MODE) {
long handle = minecraft.getWindow()
.getHandle();
if (copiedBlockPos != null && button == 1) {
clipboardHelper.setClipboardString(handle,
"util.select.fromTo(" + copiedBlockPos.getX() + ", " + copiedBlockPos.getY() + ", "
+ copiedBlockPos.getZ() + ", " + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", "
+ hoveredBlockPos.getZ() + ")");
copiedBlockPos = hoveredBlockPos;
return true;
}
clipboardHelper.setClipboardString(handle, "util.grid.at(" + hoveredBlockPos.getX() + ", "
+ hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")");
copiedBlockPos = hoveredBlockPos;
return true;
}
return super.mouseClicked(x, y, button);
}
@Override
public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) {
GameSettings settings = Minecraft.getInstance().gameSettings;
int sCode = settings.keyBindBack.getKey()
.getKeyCode();
int aCode = settings.keyBindLeft.getKey()
.getKeyCode();
int dCode = settings.keyBindRight.getKey()
.getKeyCode();
int qCode = settings.keyBindDrop.getKey()
.getKeyCode();
if (code == sCode) {
replay();
return true;
}
if (code == aCode) {
scroll(false);
return true;
}
if (code == dCode) {
scroll(true);
return true;
}
if (code == qCode) {
identifyMode = !identifyMode;
if (!identifyMode)
scenes.get(index)
.deselect();
return true;
}
return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_);
}
@Override
protected String getBreadcrumbTitle() {
if (chapter != null)
return Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId());
return stack.getItem()
.getName()
.getFormattedText();
}
public FontRenderer getFontRenderer() {
return font;
}
protected boolean isMouseOver(double mouseX, double mouseY, int x, int y, int w, int h) {
boolean hovered = !(mouseX < x || mouseX > x + w);
hovered &= !(mouseY < y || mouseY > y + h);
return hovered;
}
public void drawString(String s, int x, int y, int color) {
drawString(font, s, x, y, color);
}
public static void renderBox(int x, int y, int w, int h, boolean highlighted) {
renderBox(x, y, w, h, 0xff000000, highlighted ? 0xf0ffeedd : 0x40ffeedd, highlighted ? 0x60ffeedd : 0x20ffeedd);
}
public static void renderSpeechBox(int x, int y, int w, int h, boolean highlighted, Pointing pointing,
boolean returnWithLocalTransform) {
if (!returnWithLocalTransform)
RenderSystem.pushMatrix();
int boxX = x;
int boxY = y;
int divotX = x;
int divotY = y;
int divotRotation = 0;
int divotSize = 8;
int distance = 1;
int divotRadius = divotSize / 2;
switch (pointing) {
default:
case DOWN:
divotRotation = 0;
boxX -= w / 2;
boxY -= h + divotSize + 1 + distance;
divotX -= divotRadius;
divotY -= divotSize + distance;
break;
case LEFT:
divotRotation = 90;
boxX += divotSize + 1 + distance;
boxY -= h / 2;
divotX += distance;
divotY -= divotRadius;
break;
case RIGHT:
divotRotation = 270;
boxX -= w + divotSize + 1 + distance;
boxY -= h / 2;
divotX -= divotSize + distance;
divotY -= divotRadius;
break;
case UP:
divotRotation = 180;
boxX -= w / 2;
boxY += divotSize + 1 + distance;
divotX -= divotRadius;
divotY += distance;
break;
}
renderBox(boxX, boxY, w, h, highlighted);
RenderSystem.pushMatrix();
AllGuiTextures toRender = highlighted ? AllGuiTextures.SPEECH_TOOLTIP_HIGHLIGHT : AllGuiTextures.SPEECH_TOOLTIP;
RenderSystem.translated(divotX + divotRadius, divotY + divotRadius, 10);
RenderSystem.rotatef(divotRotation, 0, 0, 1);
RenderSystem.translated(-divotRadius, -divotRadius, 0);
toRender.draw(0, 0);
RenderSystem.popMatrix();
if (returnWithLocalTransform) {
RenderSystem.translated(boxX, boxY, 0);
return;
}
RenderSystem.popMatrix();
}
public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart,
int borderColorEnd) {
int z = 100;
GuiUtils.drawGradientRect(z, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd);
GuiUtils.drawGradientRect(z, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart, borderColorEnd);
GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart);
GuiUtils.drawGradientRect(z, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd);
}
public ItemStack getHoveredTooltipItem() {
return hoveredTooltipItem;
}
public ItemStack getSubject() {
return stack;
}
@Override
public boolean isEquivalentTo(AbstractSimiScreen other) {
if (other instanceof PonderUI)
return stack.isItemEqual(((PonderUI) other).stack);
return super.isEquivalentTo(other);
}
}

View file

@ -0,0 +1,252 @@
package com.simibubi.create.foundation.ponder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.schematics.SchematicWorld;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
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.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.inventory.container.PlayerContainer;
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.Vec3d;
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 List<Entity> originalEntities;
protected PonderWorldParticles particles;
int overrideLight;
Selection mask;
public PonderWorld(BlockPos anchor, World original) {
super(anchor, original);
originalBlocks = new HashMap<>();
originalTileEntities = new HashMap<>();
originalEntities = new ArrayList<>();
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()))));
entities.forEach(e -> EntityType.loadEntityUnchecked(e.serializeNBT(), this)
.ifPresent(originalEntities::add));
}
public void restore() {
entities.clear();
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);
});
originalEntities.forEach(e -> EntityType.loadEntityUnchecked(e.serializeNBT(), this)
.ifPresent(entities::add));
particles.clearEffects();
fixVirtualTileEntities();
}
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(Selection 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 renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) {
Vec3d vec3d = ari.getProjectedView();
double d0 = vec3d.getX();
double d1 = vec3d.getY();
double d2 = vec3d.getZ();
for (Entity entity : entities) {
if (entity.ticksExisted == 0) {
entity.lastTickPosX = entity.getX();
entity.lastTickPosY = entity.getY();
entity.lastTickPosZ = entity.getZ();
}
renderEntity(entity, d0, d1, d2, pt, ms, buffer);
}
buffer.draw(RenderType.getEntitySolid(PlayerContainer.BLOCK_ATLAS_TEXTURE));
buffer.draw(RenderType.getEntityCutout(PlayerContainer.BLOCK_ATLAS_TEXTURE));
buffer.draw(RenderType.getEntityCutoutNoCull(PlayerContainer.BLOCK_ATLAS_TEXTURE));
buffer.draw(RenderType.getEntitySmoothCutout(PlayerContainer.BLOCK_ATLAS_TEXTURE));
}
private void renderEntity(Entity entity, double x, double y, double z, float pt, MatrixStack ms,
IRenderTypeBuffer buffer) {
double d0 = MathHelper.lerp((double) pt, entity.lastTickPosX, entity.getX());
double d1 = MathHelper.lerp((double) pt, entity.lastTickPosY, entity.getY());
double d2 = MathHelper.lerp((double) pt, entity.lastTickPosZ, entity.getZ());
float f = MathHelper.lerp(pt, entity.prevRotationYaw, entity.rotationYaw);
EntityRendererManager renderManager = Minecraft.getInstance()
.getRenderManager();
int light = renderManager.getRenderer(entity)
.getLight(entity, pt);
renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light);
}
public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) {
particles.renderParticles(ms, buffer, ari, pt);
}
public void tick() {
particles.tick();
for (Iterator<Entity> iterator = entities.iterator(); iterator.hasNext();) {
Entity entity = iterator.next();
entity.ticksExisted++;
entity.lastTickPosX = entity.getX();
entity.lastTickPosY = entity.getY();
entity.lastTickPosZ = entity.getZ();
entity.tick();
if (!entity.isAlive())
iterator.remove();
}
}
@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 fixVirtualTileEntities() {
for (TileEntity tileEntity : tileEntities.values()) {
if (!(tileEntity instanceof SmartTileEntity))
continue;
SmartTileEntity smartTileEntity = (SmartTileEntity) tileEntity;
smartTileEntity.markVirtual();
if (!(smartTileEntity instanceof BeltTileEntity))
continue;
BeltTileEntity beltTileEntity = (BeltTileEntity) smartTileEntity;
if (!beltTileEntity.isController())
continue;
BlockPos controllerPos = tileEntity.getPos();
for (BlockPos blockPos : BeltBlock.getBeltChain(this, controllerPos)) {
TileEntity tileEntity2 = getTileEntity(blockPos);
if (!(tileEntity2 instanceof BeltTileEntity))
continue;
BeltTileEntity belt2 = (BeltTileEntity) tileEntity2;
belt2.setController(controllerPos);
}
}
}
public void addBlockDestroyEffects(BlockPos pos, BlockState state) {
VoxelShape voxelshape = state.getShape(this, pos);
if (voxelshape.isEmpty())
return;
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,108 @@
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_, float p_228345_5_) {
Minecraft mc = Minecraft.getInstance();
LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager();
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,657 @@
package com.simibubi.create.foundation.ponder;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel;
import com.simibubi.create.content.contraptions.base.KineticBlock;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem;
import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
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.BeltItemElement;
import com.simibubi.create.foundation.ponder.elements.EntityElement;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.ParrotElement;
import com.simibubi.create.foundation.ponder.elements.TextWindowElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.ponder.instructions.AnimateParrotInstruction;
import com.simibubi.create.foundation.ponder.instructions.AnimateTileEntityInstruction;
import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction;
import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction;
import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction;
import com.simibubi.create.foundation.ponder.instructions.DelayInstruction;
import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter;
import com.simibubi.create.foundation.ponder.instructions.FadeOutOfSceneInstruction;
import com.simibubi.create.foundation.ponder.instructions.LineInstruction;
import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction;
import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction;
import com.simibubi.create.foundation.ponder.instructions.OutlineSelectionInstruction;
import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction;
import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction;
import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction;
import com.simibubi.create.foundation.ponder.instructions.TextInstruction;
import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.RedstoneParticleData;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.minecraft.world.World;
/**
* Enqueue instructions to the schedule via this object's methods.
*/
public class SceneBuilder {
/**
* Ponder's toolkit for showing information on top of the scene world, such as
* highlighted bounding boxes, texts, icons and keybindings.
*/
public final OverlayInstructions overlay;
/**
* Instructions for manipulating the schematic and its currently visible areas.
* Allows to show, hide and modify blocks as the scene plays out.
*/
public final WorldInstructions world;
/**
* Additional tools for debugging ponder and bypassing the facade
*/
public final DebugInstructions debug;
/**
* Special effects to embellish and communicate with
*/
public final EffectInstructions effects;
/**
* Random other instructions that might come in handy
*/
public final SpecialInstructions special;
private final PonderScene scene;
public SceneBuilder(PonderScene ponderScene) {
scene = ponderScene;
overlay = new OverlayInstructions();
special = new SpecialInstructions();
world = new WorldInstructions();
debug = new DebugInstructions();
effects = new EffectInstructions();
}
// General
/**
* Assign a unique translation key, as well as the standard english translation
* for this scene's title using this method, anywhere inside the program
* function.
*
* @param sceneId
* @param title
*/
public void title(String sceneId, String title) {
scene.sceneId = sceneId;
PonderLocalization.registerSpecific(sceneId, PonderScene.TITLE_KEY, title);
}
/**
* Communicates to the ponder UI which parts of the schematic make up the base
* horizontally. Use of this is encouraged whenever there are components outside
* the the base plate. <br>
* As a result, showBasePlate() will only show the configured size, and the
* scene's scaling inside the UI will be consistent with its base size.
*
* @param xOffset Block spaces between the base plate and the schematic
* boundary on the Western side.
* @param zOffset Block spaces between the base plate and the schematic
* boundary on the Northern side.
* @param basePlateSize Length in blocks of the base plate itself. Ponder
* assumes it to be square
*/
public void configureBasePlate(int xOffset, int zOffset, int basePlateSize) {
scene.offsetX = xOffset;
scene.offsetZ = zOffset;
scene.size = basePlateSize;
}
/**
* Fade the layer of blocks into the scene ponder assumes to be the base plate
* of the schematic's structure. Makes for a nice opener
*/
public void showBasePlate() {
world.showSection(scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.offsetX, 0, scene.offsetZ),
new Vec3i(scene.size, 0, scene.size)), Direction.UP);
}
/**
* Before running the upcoming instructions, wait for a duration to let previous
* actions play out. <br>
* Idle does not stall any animations, only schedules a time gap between
* instructions.
*
* @param ticks Duration to wait for
*/
public void idle(int ticks) {
addInstruction(new DelayInstruction(ticks));
}
/**
* Before running the upcoming instructions, wait for a duration to let previous
* actions play out. <br>
* Idle does not stall any animations, only schedules a time gap between
* instructions.
*
* @param seconds Duration to wait for
*/
public void idleSeconds(int seconds) {
idle(seconds * 20);
}
/**
* Once the scene reaches this instruction in the timeline, mark it as
* "finished". This happens automatically when the end of a storyboard is
* reached, but can be desirable to do earlier, in order to bypass the wait for
* any residual text windows to time out. <br>
* So far this event only affects the "next scene" button in the UI to flash.
*/
public void markAsFinished() {
addInstruction(new MarkAsFinishedInstruction());
}
/**
* Pans the scene's camera view around the vertical axis by the given amount
*
* @param degrees
*/
public void rotateCameraY(float degrees) {
addInstruction(new RotateSceneInstruction(0, degrees, true));
}
public class EffectInstructions {
public void emitParticles(Vec3d location, Emitter emitter, float amountPerCycle, int cycles) {
addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles));
}
public void superGlue(BlockPos pos, Direction side, boolean fullBlock) {
addInstruction(scene -> SuperGlueItem.spawnParticles(scene.world, pos, side, fullBlock));
}
private void rotationIndicator(BlockPos pos, boolean direction) {
addInstruction(scene -> {
BlockState blockState = scene.world.getBlockState(pos);
TileEntity tileEntity = scene.world.getTileEntity(pos);
if (!(blockState.getBlock() instanceof KineticBlock))
return;
if (!(tileEntity instanceof KineticTileEntity))
return;
KineticTileEntity kte = (KineticTileEntity) tileEntity;
KineticBlock kb = (KineticBlock) blockState.getBlock();
Axis rotationAxis = kb.getRotationAxis(blockState);
float speed = kte.getTheoreticalSpeed();
SpeedLevel speedLevel = SpeedLevel.of(speed);
int color = direction ? speed > 0 ? 0xeb5e0b : 0x1687a7 : speedLevel.getColor();
int particleSpeed = speedLevel.getParticleSpeed();
particleSpeed *= Math.signum(speed);
Vec3d location = VecHelper.getCenterOf(pos);
RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, particleSpeed,
kb.getParticleInitialRadius(), kb.getParticleTargetRadius(), 20, rotationAxis.name()
.charAt(0));
for (int i = 0; i < 20; i++)
scene.world.addParticle(particleData, location.x, location.y, location.z, 0, 0, 0);
});
}
public void rotationSpeedIndicator(BlockPos pos) {
rotationIndicator(pos, false);
}
public void rotationDirectionIndicator(BlockPos pos) {
rotationIndicator(pos, true);
}
public void indicateRedstone(BlockPos pos) {
createRedstoneParticles(pos, 0xFF0000, 10);
}
public void indicateSuccess(BlockPos pos) {
createRedstoneParticles(pos, 0x80FFaa, 10);
}
public void createRedstoneParticles(BlockPos pos, int color, int amount) {
Vec3d rgb = ColorHelper.getRGB(color);
addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), Emitter.withinBlockSpace(
new RedstoneParticleData((float) rgb.x, (float) rgb.y, (float) rgb.z, 1), Vec3d.ZERO), amount, 2));
}
}
public class OverlayInstructions {
public TextWindowElement.Builder showText(int duration) {
TextWindowElement textWindowElement = new TextWindowElement();
addInstruction(new TextInstruction(textWindowElement, duration));
return textWindowElement.new Builder(scene);
}
public TextWindowElement.Builder showSelectionWithText(Selection selection, int duration) {
TextWindowElement textWindowElement = new TextWindowElement();
addInstruction(new TextInstruction(textWindowElement, duration, selection));
return textWindowElement.new Builder(scene).pointAt(selection.getCenter());
}
public void showControls(InputWindowElement element, int duration) {
addInstruction(new ShowInputInstruction(element.clone(), duration));
}
public void chaseBoundingBoxOutline(PonderPalette color, Object slot, AxisAlignedBB boundingBox, int duration) {
addInstruction(new ChaseAABBInstruction(color, slot, boundingBox, duration));
}
public void showLine(PonderPalette color, Vec3d start, Vec3d end, int duration) {
addInstruction(new LineInstruction(color, start, end, duration));
}
public void showOutline(PonderPalette color, Object slot, Selection selection, int duration) {
addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration));
}
}
public class SpecialInstructions {
public ElementLink<ParrotElement> birbOnTurntable(BlockPos pos) {
ElementLink<ParrotElement> link = new ElementLink<>(ParrotElement.class);
ParrotElement parrot = ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos);
addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot));
addInstruction(scene -> scene.linkElement(parrot, link));
return link;
}
public ElementLink<ParrotElement> birbOnSpinnyShaft(BlockPos pos) {
ElementLink<ParrotElement> link = new ElementLink<>(ParrotElement.class);
ParrotElement parrot = ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos)
.add(0, 0.5, 0), pos);
addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot));
addInstruction(scene -> scene.linkElement(parrot, link));
return link;
}
public ElementLink<ParrotElement> birbLookingAtPOI(Vec3d location) {
ElementLink<ParrotElement> link = new ElementLink<>(ParrotElement.class);
ParrotElement parrot = ParrotElement.lookAtPOI(location);
addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot));
addInstruction(scene -> scene.linkElement(parrot, link));
return link;
}
public ElementLink<ParrotElement> flappyBirb(Vec3d location) {
ElementLink<ParrotElement> link = new ElementLink<>(ParrotElement.class);
ParrotElement parrot = ParrotElement.flappy(location);
addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot));
addInstruction(scene -> scene.linkElement(parrot, link));
return link;
}
public ElementLink<ParrotElement> birbPartying(Vec3d location) {
ElementLink<ParrotElement> link = new ElementLink<>(ParrotElement.class);
ParrotElement parrot = ParrotElement.dance(location);
addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot));
addInstruction(scene -> scene.linkElement(parrot, link));
return link;
}
public void movePointOfInterest(Vec3d location) {
addInstruction(new MovePoiInstruction(location));
}
public void movePointOfInterest(BlockPos location) {
movePointOfInterest(VecHelper.getCenterOf(location));
}
public void rotateParrot(ElementLink<ParrotElement> link, double xRotation, double yRotation, double zRotation,
int duration) {
addInstruction(AnimateParrotInstruction.rotate(link, new Vec3d(xRotation, yRotation, zRotation), duration));
}
public void moveParrot(ElementLink<ParrotElement> link, Vec3d offset, int duration) {
addInstruction(AnimateParrotInstruction.move(link, offset, duration));
}
}
public class WorldInstructions {
public void showSection(Selection selection, Direction fadeInDirection) {
addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection,
Optional.of(scene::getBaseWorldSection)));
}
public void showSectionAndMerge(Selection selection, Direction fadeInDirection,
ElementLink<WorldSectionElement> link) {
addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection,
Optional.of(() -> scene.resolve(link))));
}
public ElementLink<WorldSectionElement> showIndependentSection(Selection selection, Direction fadeInDirection) {
DisplayWorldSectionInstruction instruction =
new DisplayWorldSectionInstruction(15, fadeInDirection, selection, Optional.empty());
addInstruction(instruction);
return instruction.createLink(scene);
}
public void hideSection(Selection selection, Direction fadeOutDirection) {
WorldSectionElement worldSectionElement = new WorldSectionElement(selection);
ElementLink<WorldSectionElement> elementLink = new ElementLink<>(WorldSectionElement.class);
addInstruction(scene -> {
scene.getBaseWorldSection()
.erase(selection);
scene.linkElement(worldSectionElement, elementLink);
scene.addElement(worldSectionElement);
worldSectionElement.queueRedraw();
});
hideIndependentSection(elementLink, fadeOutDirection);
}
public void hideIndependentSection(ElementLink<WorldSectionElement> link, Direction fadeOutDirection) {
addInstruction(new FadeOutOfSceneInstruction<>(15, fadeOutDirection, link));
}
public ElementLink<WorldSectionElement> makeSectionIndependent(Selection selection) {
WorldSectionElement worldSectionElement = new WorldSectionElement(selection);
ElementLink<WorldSectionElement> elementLink = new ElementLink<>(WorldSectionElement.class);
addInstruction(scene -> {
scene.getBaseWorldSection()
.erase(selection);
scene.linkElement(worldSectionElement, elementLink);
scene.addElement(worldSectionElement);
worldSectionElement.queueRedraw();
worldSectionElement.resetAnimatedTransform();
worldSectionElement.setVisible(true);
worldSectionElement.forceApplyFade(1);
});
return elementLink;
}
public void rotateSection(ElementLink<WorldSectionElement> link, double xRotation, double yRotation,
double zRotation, int duration) {
addInstruction(
AnimateWorldSectionInstruction.rotate(link, new Vec3d(xRotation, yRotation, zRotation), duration));
}
public void configureCenterOfRotation(ElementLink<WorldSectionElement> link, Vec3d anchor) {
addInstruction(scene -> scene.resolve(link)
.setCenterOfRotation(anchor));
}
public void moveSection(ElementLink<WorldSectionElement> link, Vec3d offset, int duration) {
addInstruction(AnimateWorldSectionInstruction.move(link, offset, duration));
}
public void rotateBearing(BlockPos pos, float angle, int duration) {
addInstruction(AnimateTileEntityInstruction.bearing(pos, angle, duration));
}
public void movePulley(BlockPos pos, float distance, int duration) {
addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration));
}
public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) {
addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles));
}
public void destroyBlock(BlockPos pos) {
setBlock(pos, Blocks.AIR.getDefaultState(), true);
}
public void setBlock(BlockPos pos, BlockState state, boolean spawnParticles) {
setBlocks(scene.getSceneBuildingUtil().select.position(pos), state, spawnParticles);
}
public void replaceBlocks(Selection selection, BlockState state, boolean spawnParticles) {
modifyBlocks(selection, $ -> state, spawnParticles);
}
public void modifyBlock(BlockPos pos, UnaryOperator<BlockState> stateFunc, boolean spawnParticles) {
modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), stateFunc, spawnParticles);
}
public void modifyBlocks(Selection selection, UnaryOperator<BlockState> stateFunc, boolean spawnParticles) {
addInstruction(new ReplaceBlocksInstruction(selection, stateFunc, false, spawnParticles));
}
public void toggleRedstonePower(Selection selection) {
modifyBlocks(selection, s -> {
if (s.has(BlockStateProperties.POWER_0_15))
s = s.with(BlockStateProperties.POWER_0_15, s.get(BlockStateProperties.POWER_0_15) == 0 ? 15 : 0);
if (s.has(BlockStateProperties.POWERED))
s = s.cycle(BlockStateProperties.POWERED);
return s;
}, false);
}
public <T extends Entity> void modifyEntities(Class<T> entityClass, Consumer<T> entityCallBack) {
addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack));
}
public <T extends Entity> void modifyEntitiesInside(Class<T> entityClass, Selection area,
Consumer<T> entityCallBack) {
addInstruction(scene -> scene.forEachWorldEntity(entityClass, e -> {
if (area.test(e.getPosition()))
entityCallBack.accept(e);
}));
}
public void modifyEntity(ElementLink<EntityElement> link, Consumer<Entity> entityCallBack) {
addInstruction(scene -> {
EntityElement resolve = scene.resolve(link);
if (resolve != null)
resolve.ifPresent(entityCallBack::accept);
});
}
public ElementLink<EntityElement> createEntity(Function<World, Entity> factory) {
ElementLink<EntityElement> link = new ElementLink<>(EntityElement.class, UUID.randomUUID());
addInstruction(scene -> {
PonderWorld world = scene.getWorld();
Entity entity = factory.apply(world);
EntityElement handle = new EntityElement(entity);
scene.addElement(handle);
scene.linkElement(handle, link);
world.addEntity(entity);
});
return link;
}
public ElementLink<EntityElement> createItemEntity(Vec3d location, Vec3d motion, ItemStack stack) {
return createEntity(world -> {
ItemEntity itemEntity = new ItemEntity(world, location.x, location.y, location.z, stack);
itemEntity.setMotion(motion);
return itemEntity;
});
}
public void createItemOnBeltLike(BlockPos location, Direction insertionSide, ItemStack stack) {
addInstruction(scene -> {
PonderWorld world = scene.getWorld();
TileEntity tileEntity = world.getTileEntity(location);
if (!(tileEntity instanceof SmartTileEntity))
return;
SmartTileEntity beltTileEntity = (SmartTileEntity) tileEntity;
DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE);
if (behaviour == null)
return;
behaviour.handleInsertion(stack, insertionSide.getOpposite(), false);
});
flapFunnels(scene.getSceneBuildingUtil().select.position(location.up()), true);
}
public ElementLink<BeltItemElement> createItemOnBelt(BlockPos beltLocation, Direction insertionSide,
ItemStack stack) {
ElementLink<BeltItemElement> link = new ElementLink<>(BeltItemElement.class);
addInstruction(scene -> {
PonderWorld world = scene.getWorld();
TileEntity tileEntity = world.getTileEntity(beltLocation);
if (!(tileEntity instanceof BeltTileEntity))
return;
BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity;
DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE);
behaviour.handleInsertion(stack, insertionSide.getOpposite(), false);
BeltTileEntity controllerTE = beltTileEntity.getControllerTE();
if (controllerTE != null)
controllerTE.tick();
TransportedItemStackHandlerBehaviour transporter =
beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE);
transporter.handleProcessingOnAllItems(tis -> {
BeltItemElement tracker = new BeltItemElement(tis);
scene.addElement(tracker);
scene.linkElement(tracker, link);
return TransportedResult.doNothing();
});
});
flapFunnels(scene.getSceneBuildingUtil().select.position(beltLocation.up()), true);
return link;
}
public void removeItemsFromBelt(BlockPos beltLocation) {
addInstruction(scene -> {
PonderWorld world = scene.getWorld();
TileEntity tileEntity = world.getTileEntity(beltLocation);
if (!(tileEntity instanceof BeltTileEntity))
return;
BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity;
TransportedItemStackHandlerBehaviour transporter =
beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE);
transporter.handleProcessingOnAllItems(tis -> TransportedResult.removeItem());
});
}
public void stallBeltItem(ElementLink<BeltItemElement> link, boolean stalled) {
addInstruction(scene -> {
BeltItemElement resolve = scene.resolve(link);
if (resolve != null)
resolve.ifPresent(tis -> tis.locked = stalled);
});
}
public void changeBeltItemTo(ElementLink<BeltItemElement> link, ItemStack newStack) {
addInstruction(scene -> {
BeltItemElement resolve = scene.resolve(link);
if (resolve != null)
resolve.ifPresent(tis -> tis.stack = newStack);
});
}
public void setKineticSpeed(Selection selection, float speed) {
modifyKineticSpeed(selection, f -> speed);
}
public void multiplyKineticSpeed(Selection selection, float modifier) {
modifyKineticSpeed(selection, f -> f * modifier);
}
public void modifyKineticSpeed(Selection selection, UnaryOperator<Float> speedFunc) {
modifyTileNBT(selection, SpeedGaugeTileEntity.class, nbt -> {
float newSpeed = speedFunc.apply(nbt.getFloat("Speed"));
nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed));
});
modifyTileNBT(selection, KineticTileEntity.class, nbt -> {
nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed")));
});
}
public void setFilterData(Selection selection, Class<? extends TileEntity> teType, ItemStack filter) {
modifyTileNBT(selection, teType, nbt -> {
nbt.put("Filter", filter.serializeNBT());
});
}
public void modifyTileNBT(Selection selection, Class<? extends TileEntity> teType,
Consumer<CompoundNBT> consumer) {
modifyTileNBT(selection, teType, consumer, false);
}
public void modifyTileNBT(Selection selection, Class<? extends TileEntity> teType,
Consumer<CompoundNBT> consumer, boolean reDrawBlocks) {
addInstruction(new TileEntityDataInstruction(selection, teType, nbt -> {
consumer.accept(nbt);
return nbt;
}, reDrawBlocks));
}
public void flapFunnels(Selection selection, boolean outward) {
addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> {
nbt.putInt("Flap", outward ? -1 : 1);
return nbt;
}, false));
}
}
public class DebugInstructions {
public void debugSchematic() {
addInstruction(
scene -> scene.addElement(new WorldSectionElement(scene.getSceneBuildingUtil().select.everywhere())));
}
public void addInstructionInstance(PonderInstruction instruction) {
addInstruction(instruction);
}
public void enqueueCallback(Consumer<PonderScene> callback) {
addInstruction(callback);
}
}
private void addInstruction(PonderInstruction instruction) {
scene.schedule.add(instruction);
}
private void addInstruction(Consumer<PonderScene> callback) {
scene.schedule.add(PonderInstruction.simple(callback));
}
}

View file

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

View file

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

View file

@ -0,0 +1,459 @@
package com.simibubi.create.foundation.ponder.content;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltPart;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.EntityElement;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.ParrotElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.DyeColor;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
public class BeltScenes {
public static void beltConnector(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("belt_connector", "Using Mechanical Belts");
scene.configureBasePlate(0, 0, 5);
scene.showBasePlate();
scene.idle(5);
scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 1, 5), Direction.DOWN);
ElementLink<WorldSectionElement> shafts =
scene.world.showIndependentSection(util.select.fromTo(0, 1, 3, 4, 1, 3), Direction.DOWN);
scene.world.moveSection(shafts, util.vector.of(0, 0, -1), 0);
scene.world.setKineticSpeed(util.select.position(0, 1, 3), 0);
scene.idle(20);
BlockPos backEnd = util.grid.at(4, 1, 2);
BlockPos frontEnd = util.grid.at(0, 1, 2);
ItemStack beltItem = AllItems.BELT_CONNECTOR.asStack();
Vec3d backEndCenter = util.vector.centerOf(backEnd);
AxisAlignedBB connectBB = new AxisAlignedBB(backEndCenter, backEndCenter);
AxisAlignedBB shaftBB = AllBlocks.SHAFT.getDefaultState()
.with(ShaftBlock.AXIS, Axis.Z)
.getShape(null, null)
.getBoundingBox();
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(backEnd), Pointing.DOWN).rightClick()
.withItem(beltItem), 57);
scene.idle(7);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, backEnd, shaftBB.offset(backEnd), 42);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB, 50);
scene.idle(20);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(frontEnd), Pointing.DOWN).rightClick()
.withItem(beltItem), 37);
scene.idle(7);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, frontEnd, shaftBB.offset(frontEnd), 17);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB.expand(-4, 0, 0), 20);
scene.idle(20);
scene.world.moveSection(shafts, util.vector.of(0, -2, 0), 0);
scene.world.showSection(util.select.fromTo(0, 1, 2, 4, 1, 2), Direction.SOUTH);
scene.idle(20);
scene.overlay.showText(80)
.text("Right-Clicking two shafts with a belt item will connect them together")
.placeNearTarget()
.pointAt(util.vector.topOf(2, 1, 2));
scene.idle(90);
Vec3d falseSelection = util.vector.topOf(backEnd.south(1));
scene.overlay.showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick()
.withItem(beltItem), 37);
scene.idle(7);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, backEnd, shaftBB.offset(backEnd.south(1)), 50);
scene.overlay.showText(80)
.colored(PonderPalette.RED)
.text("Accidental selections can be canceled with Right-Click while Sneaking")
.placeNearTarget()
.pointAt(util.vector.centerOf(backEnd.south(1)));
scene.idle(43);
scene.overlay.showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick()
.withItem(beltItem)
.whileSneaking(), 20);
scene.idle(60);
BlockPos shaftLocation = frontEnd.east();
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick()
.withItem(AllBlocks.SHAFT.asStack()), 50);
scene.idle(7);
scene.world.modifyBlock(shaftLocation, s -> s.with(BeltBlock.PART, BeltPart.PULLEY), true);
scene.idle(10);
scene.overlay.showText(43)
.text("Additional Shafts can be added throughout the Belt")
.placeNearTarget()
.pointAt(util.vector.blockSurface(shaftLocation, Direction.NORTH));
scene.idle(50);
Selection attachedShafts = util.select.fromTo(0, 1, 1, 1, 1, 1);
scene.world.showSection(attachedShafts, Direction.SOUTH);
scene.world.setKineticSpeed(attachedShafts, 32);
scene.idle(10);
scene.effects.rotationDirectionIndicator(util.grid.at(0, 1, 1));
scene.effects.rotationDirectionIndicator(util.grid.at(1, 1, 1));
scene.idle(20);
scene.overlay.showText(50)
.text("Shafts connected via Belts will rotate with Identical Speed and Direction")
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(0, 1, 1), Direction.NORTH));
scene.idle(60);
scene.world.hideSection(attachedShafts, Direction.NORTH);
scene.idle(20);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick()
.withWrench(), 50);
scene.idle(7);
scene.world.modifyBlock(shaftLocation, s -> s.with(BeltBlock.PART, BeltPart.MIDDLE), true);
scene.idle(10);
scene.overlay.showText(50)
.text("Added shafts can be removed using the wrench")
.placeNearTarget()
.pointAt(util.vector.blockSurface(shaftLocation, Direction.NORTH));
scene.idle(70);
scene.overlay
.showControls(new InputWindowElement(util.vector.topOf(shaftLocation.east()), Pointing.DOWN).rightClick()
.withItem(new ItemStack(Items.BLUE_DYE)), 50);
scene.idle(7);
scene.world.modifyTileNBT(util.select.fromTo(0, 1, 2, 4, 1, 2), BeltTileEntity.class,
nbt -> NBTHelper.writeEnum(nbt, "Dye", DyeColor.BLUE));
scene.idle(20);
scene.overlay.showText(80)
.colored(PonderPalette.BLUE)
.text("Mechanical Belts can be dyed for aesthetic purposes")
.placeNearTarget()
.pointAt(util.vector.topOf(shaftLocation.east()));
}
public static void directions(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("belt_directions", "Valid Orientations for Mechanical Belts");
scene.configureBasePlate(0, 0, 5);
scene.showBasePlate();
scene.idle(5);
ElementLink<WorldSectionElement> leftShaft =
scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.DOWN);
ElementLink<WorldSectionElement> rightShaft =
scene.world.showIndependentSection(util.select.position(0, 1, 0), Direction.DOWN);
scene.world.moveSection(leftShaft, util.vector.of(0, 0, 2), 0);
scene.world.moveSection(rightShaft, util.vector.of(0, 0, 2), 0);
scene.idle(1);
scene.world.moveSection(leftShaft, util.vector.of(-1, 0, 0), 10);
scene.world.moveSection(rightShaft, util.vector.of(1, 1, 0), 10);
scene.idle(20);
Vec3d from = util.vector.centerOf(3, 1, 2);
Vec3d to = util.vector.centerOf(1, 2, 2);
scene.overlay.showLine(PonderPalette.RED, from, to, 70);
scene.idle(10);
scene.overlay.showLine(PonderPalette.GREEN, to.add(-1, -1, 0), from, 60);
scene.overlay.showLine(PonderPalette.GREEN, from.add(0, 3, 0), from, 60);
scene.idle(20);
scene.overlay.showText(60)
.colored(PonderPalette.RED)
.placeNearTarget()
.pointAt(to)
.text("Belts cannot connect in arbitrary directions");
scene.idle(70);
from = util.vector.centerOf(4, 1, 2);
to = util.vector.centerOf(0, 1, 2);
scene.world.moveSection(leftShaft, util.vector.of(1, 0, 0), 10);
scene.world.moveSection(rightShaft, util.vector.of(-1, -1, 0), 10);
scene.idle(10);
scene.overlay.showLine(PonderPalette.GREEN, from, to, 40);
scene.idle(10);
scene.overlay.showText(40)
.colored(PonderPalette.GREEN)
.placeNearTarget()
.pointAt(to)
.text("1. They can connect horizontally");
scene.idle(20);
Selection firstBelt = util.select.fromTo(4, 1, 1, 0, 1, 1);
ElementLink<WorldSectionElement> belt = scene.world.showIndependentSection(firstBelt, Direction.SOUTH);
scene.world.moveSection(belt, util.vector.of(0, 0, 1), 0);
scene.idle(20);
scene.world.hideIndependentSection(belt, Direction.SOUTH);
scene.idle(15);
from = util.vector.centerOf(3, 3, 2);
to = util.vector.centerOf(1, 1, 2);
scene.world.moveSection(leftShaft, util.vector.of(-1, 2, 0), 10);
scene.world.moveSection(rightShaft, util.vector.of(1, 0, 0), 10);
scene.idle(10);
scene.world.rotateSection(leftShaft, 0, 0, 25, 5);
scene.world.rotateSection(rightShaft, 0, 0, 25, 5);
scene.overlay.showLine(PonderPalette.GREEN, from, to, 40);
scene.idle(10);
scene.overlay.showText(40)
.colored(PonderPalette.GREEN)
.placeNearTarget()
.pointAt(to)
.text("2. They can connect diagonally");
scene.idle(20);
Selection secondBelt = util.select.fromTo(3, 3, 2, 1, 1, 2);
belt = scene.world.showIndependentSection(secondBelt, Direction.SOUTH);
scene.idle(20);
scene.world.hideIndependentSection(belt, Direction.SOUTH);
scene.idle(15);
from = util.vector.centerOf(2, 4, 2);
to = util.vector.centerOf(2, 1, 2);
scene.world.moveSection(leftShaft, util.vector.of(-1, 1, 0), 10);
scene.world.moveSection(rightShaft, util.vector.of(1, 0, 0), 10);
scene.idle(10);
scene.world.rotateSection(rightShaft, 0, 0, -25, 5);
scene.overlay.showLine(PonderPalette.GREEN, from, to, 40);
scene.idle(10);
scene.overlay.showText(40)
.colored(PonderPalette.GREEN)
.placeNearTarget()
.pointAt(to)
.text("3. They can connect vertically");
scene.idle(20);
Selection thirdBelt = util.select.fromTo(2, 1, 3, 2, 4, 3);
belt = scene.world.showIndependentSection(thirdBelt, Direction.SOUTH);
scene.world.moveSection(belt, util.vector.of(0, 0, -1), 0);
scene.idle(20);
scene.world.hideIndependentSection(belt, Direction.SOUTH);
scene.idle(15);
from = util.vector.centerOf(4, 1, 2);
to = util.vector.centerOf(0, 1, 2);
scene.world.moveSection(leftShaft, util.vector.of(2, -3, 0), 10);
scene.world.moveSection(rightShaft, util.vector.of(-2, 0, 0), 10);
scene.idle(10);
scene.world.rotateSection(rightShaft, 90, 0, -25, 5);
scene.world.rotateSection(leftShaft, 90, 0, -50, 5);
scene.overlay.showLine(PonderPalette.GREEN, from, to, 60);
scene.idle(10);
scene.overlay.showText(60)
.colored(PonderPalette.GREEN)
.placeNearTarget()
.pointAt(to)
.text("4. And they can connect vertical shafts horizontally");
scene.idle(20);
Selection fourthBelt = util.select.fromTo(4, 1, 4, 0, 1, 4);
belt = scene.world.showIndependentSection(fourthBelt, Direction.DOWN);
scene.world.moveSection(belt, util.vector.of(0, 1 / 512f, -2), 0);
scene.idle(40);
scene.world.hideIndependentSection(belt, Direction.UP);
scene.idle(15);
scene.world.hideIndependentSection(leftShaft, Direction.UP);
scene.world.hideIndependentSection(rightShaft, Direction.UP);
scene.idle(15);
scene.world.showSection(firstBelt, Direction.DOWN);
scene.idle(5);
scene.world.showSection(secondBelt, Direction.DOWN);
scene.idle(5);
scene.world.showSection(thirdBelt, Direction.DOWN);
scene.idle(5);
scene.world.showSection(fourthBelt, Direction.DOWN);
scene.idle(10);
scene.overlay.showText(160)
.text("These are all possible directions.\nBelts can span any Length between 2 and 20 blocks");
scene.markAsFinished();
}
public static void transport(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("belt_transport", "Using Mechanical Belts for Logistics");
scene.configureBasePlate(0, 0, 5);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -.6f * f);
scene.showBasePlate();
scene.idle(5);
scene.world.showSection(util.select.fromTo(1, 1, 3, 2, 1, 5), Direction.DOWN);
scene.idle(20);
scene.world.showSection(util.select.fromTo(2, 1, 2, 4, 3, 2), Direction.SOUTH);
scene.idle(5);
scene.world.showSection(util.select.fromTo(1, 1, 2, 0, 1, 2), Direction.SOUTH);
scene.idle(10);
scene.special.movePointOfInterest(util.grid.at(2, 2, 0));
ItemStack stack = AllBlocks.COPPER_BLOCK.asStack();
ElementLink<EntityElement> item =
scene.world.createItemEntity(util.vector.centerOf(0, 4, 2), util.vector.of(0, 0, 0), stack);
scene.idle(13);
scene.world.modifyEntity(item, Entity::remove);
BlockPos beltEnd = util.grid.at(0, 1, 2);
scene.world.createItemOnBelt(beltEnd, Direction.DOWN, stack);
scene.idle(20);
ElementLink<ParrotElement> parrot = scene.special.birbLookingAtPOI(util.vector.topOf(0, 1, 2)
.add(0, -3 / 16f, 0));
scene.special.moveParrot(parrot, util.vector.of(1.78, 0, 0), 40);
scene.special.movePointOfInterest(util.grid.at(1, 1, 3));
scene.overlay.showText(60)
.placeNearTarget()
.pointAt(util.vector.topOf(beltEnd))
.text("Moving belts will transport Items and other Entities");
scene.idle(20);
item = scene.world.createItemEntity(util.vector.centerOf(0, 4, 2), util.vector.of(0, 0, 0), stack);
scene.special.movePointOfInterest(util.grid.at(0, 3, 2));
scene.idle(10);
scene.special.movePointOfInterest(beltEnd);
scene.idle(3);
scene.world.modifyEntity(item, Entity::remove);
scene.world.createItemOnBelt(beltEnd, Direction.DOWN, stack);
scene.idle(8);
scene.special.movePointOfInterest(util.grid.at(3, 2, 1));
scene.special.moveParrot(parrot, util.vector.of(2.1, 2.1, 0), 60);
scene.idle(20);
scene.special.movePointOfInterest(util.grid.at(5, 5, 2));
scene.idle(30);
scene.special.movePointOfInterest(util.grid.at(2, 1, 5));
scene.idle(10);
scene.special.moveParrot(parrot, util.vector.of(.23, 0, 0), 5);
scene.idle(5);
scene.world.setKineticSpeed(util.select.everywhere(), 0f);
scene.idle(10);
scene.world.modifyEntities(ItemEntity.class, Entity::remove);
scene.special.movePointOfInterest(util.grid.at(2, 5, 4));
Vec3d topOf = util.vector.topOf(util.grid.at(3, 2, 2))
.add(-0.1, 0.3, 0);
scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 60);
scene.idle(10);
scene.overlay.showText(60)
.placeNearTarget()
.pointAt(topOf.subtract(0, 0.1, 0))
.text("Right-Click with an empty hand to take items off a belt");
scene.idle(20);
scene.world.removeItemsFromBelt(util.grid.at(3, 2, 2));
scene.effects.indicateSuccess(util.grid.at(3, 2, 2));
scene.idle(20);
scene.special.movePointOfInterest(util.grid.at(2, 1, 5));
}
public static void beltsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("belt_casing", "Encasing Belts");
scene.configureBasePlate(0, 0, 5);
scene.showBasePlate();
scene.idle(5);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.idle(20);
ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack();
ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack();
BlockPos beltPos = util.grid.at(3, 1, 0);
BlockPos beltPos2 = util.grid.at(0, 2, 3);
BlockPos beltPos3 = util.grid.at(1, 4, 4);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos), Pointing.DOWN).rightClick()
.withItem(brassCasingItem), 20);
scene.idle(7);
scene.world.modifyBlock(beltPos, s -> s.with(BeltBlock.CASING, true), true);
scene.idle(20);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos2), Pointing.DOWN).rightClick()
.withItem(andesiteCasingItem), 20);
scene.idle(7);
scene.world.modifyBlock(beltPos2, s -> s.with(BeltBlock.CASING, true), true);
scene.world.modifyTileNBT(util.select.position(beltPos2), BeltTileEntity.class, nbt -> {
NBTHelper.writeEnum(nbt, "Casing", BeltTileEntity.CasingType.ANDESITE);
});
scene.idle(20);
scene.overlay.showControls(
new InputWindowElement(util.vector.blockSurface(beltPos3, Direction.EAST), Pointing.RIGHT).rightClick()
.withItem(brassCasingItem),
20);
scene.idle(7);
scene.world.modifyBlock(beltPos3, s -> s.with(BeltBlock.CASING, true), true);
scene.idle(20);
scene.overlay.showText(80)
.text("Brass or Andesite Casing can be used to decorate Mechanical Belts")
.pointAt(util.vector.centerOf(beltPos2));
scene.idle(40);
List<BlockPos> brassBelts = new ArrayList<>();
List<BlockPos> andesiteBelts = new ArrayList<>();
for (int z = 1; z <= 3; z++)
brassBelts.add(beltPos.south(z));
for (int x = 1; x <= 3; x++)
brassBelts.add(beltPos3.east(x)
.down(x));
for (int x = 1; x <= 3; x++)
andesiteBelts.add(beltPos2.east(x));
Collections.shuffle(andesiteBelts);
Collections.shuffle(brassBelts);
for (BlockPos pos : andesiteBelts) {
scene.idle(4);
scene.world.modifyBlock(pos, s -> s.with(BeltBlock.CASING, true), true);
scene.world.modifyTileNBT(util.select.position(pos), BeltTileEntity.class, nbt -> {
NBTHelper.writeEnum(nbt, "Casing", BeltTileEntity.CasingType.ANDESITE);
});
}
for (BlockPos pos : brassBelts) {
scene.idle(4);
scene.world.modifyBlock(pos, s -> s.with(BeltBlock.CASING, true), true);
}
scene.idle(30);
scene.overlay
.showControls(new InputWindowElement(util.vector.topOf(beltPos.south()), Pointing.DOWN).rightClick()
.withWrench(), 40);
scene.idle(7);
scene.world.modifyBlock(beltPos.south(), s -> s.with(BeltBlock.CASING, false), true);
scene.overlay.showText(80)
.text("A wrench can be used to remove the casing")
.placeNearTarget()
.pointAt(util.vector.blockSurface(beltPos.south(), Direction.WEST));
}
}

View file

@ -0,0 +1,259 @@
package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.TextWindowElement.Builder;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.block.RedstoneWireBlock;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
public class ChainDriveScenes {
public static void chainDriveAsRelay(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("chain_drive", "Relaying rotational force with Chain Drives");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
BlockPos gaugePos = util.grid.at(0, 1, 3);
Selection gauge = util.select.position(gaugePos);
scene.world.showSection(gauge, Direction.UP);
scene.world.setKineticSpeed(gauge, 0);
scene.idle(5);
scene.world.showSection(util.select.fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN);
scene.idle(10);
for (int i = 0; i < 3; i++) {
scene.idle(5);
scene.world.showSection(util.select.position(3, 1, 2 - i), Direction.DOWN);
if (i != 0)
scene.world.showSection(util.select.position(3, 1, 2 + i), Direction.DOWN);
}
scene.idle(10);
scene.world.showSection(util.select.position(gaugePos.east(2)), Direction.DOWN);
scene.idle(5);
scene.world.showSection(util.select.position(gaugePos.east()), Direction.DOWN);
scene.idle(5);
scene.world.setKineticSpeed(gauge, 64);
scene.effects.indicateSuccess(gaugePos);
scene.idle(20);
scene.overlay.showText(60)
.text("Chain Drives relay rotation to each other in a row")
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(3, 1, 4), Direction.WEST));
scene.idle(60);
Selection shafts = util.select.fromTo(2, 1, 0, 2, 1, 1);
BlockPos rotatedECD = util.grid.at(3, 1, 0);
Selection verticalShaft = util.select.fromTo(rotatedECD.up(), rotatedECD.up(2));
scene.world.showSection(shafts, Direction.EAST);
scene.idle(10);
scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 0));
scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 1));
scene.idle(20);
scene.overlay.showText(60)
.text("All shafts connected like this will rotate in the same direction")
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(2, 1, 1), Direction.WEST));
scene.idle(50);
scene.world.hideSection(shafts, Direction.WEST);
scene.idle(25);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(rotatedECD), Pointing.DOWN).rightClick()
.withWrench(), 30);
scene.idle(7);
scene.world.modifyBlock(rotatedECD, s -> s.with(EncasedBeltBlock.AXIS, Axis.Y), true);
scene.idle(40);
scene.world.showSection(verticalShaft, Direction.DOWN);
scene.idle(10);
scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 0));
scene.idle(10);
scene.overlay.showText(60)
.text("Any part of the row can be rotated by 90 degrees")
.placeNearTarget()
.pointAt(util.vector.centerOf(3, 2, 0));
scene.markAsFinished();
}
public static void adjustableChainGearshift(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("chain_gearshift", "Controlling rotational speed with Chain Gearshifts");
scene.configureBasePlate(0, 0, 7);
scene.world.showSection(util.select.layer(0), Direction.UP);
BlockPos leverPos = util.grid.at(3, 1, 0);
BlockPos eastDrive = util.grid.at(3, 1, 2);
BlockPos eastGauge = eastDrive.up(3);
BlockPos middleGauge = eastGauge.west()
.down();
BlockPos westGauge = eastGauge.west(2)
.down(2);
ElementLink<WorldSectionElement> lever =
scene.world.showIndependentSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 2, 3), Direction.DOWN);
scene.idle(10);
scene.world.showSection(util.select.fromTo(eastDrive, eastDrive.west(2))
.add(util.select.position(eastDrive.up())), Direction.DOWN);
scene.idle(10);
scene.overlay.showText(60)
.text("Unpowered Chain Gearshifts behave exacly like Chain Drives")
.placeNearTarget()
.pointAt(util.vector.blockSurface(eastDrive, Direction.NORTH));
scene.idle(60);
scene.world.showSection(util.select.fromTo(eastGauge, eastGauge.down()), Direction.DOWN);
scene.idle(5);
scene.world.showSection(util.select.fromTo(middleGauge, middleGauge.down()), Direction.DOWN);
scene.idle(5);
scene.world.showSection(util.select.position(westGauge), Direction.DOWN);
scene.idle(5);
for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) {
scene.idle(5);
scene.overlay.showText(50)
.sharedText(gauge == eastGauge ? "rpm16_source" : "rpm16")
.colored(PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.blockSurface(gauge, Direction.NORTH));
}
scene.idle(60);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2)));
scene.effects.indicateRedstone(leverPos);
scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.down(), middleGauge), f -> 2 * f);
scene.idle(10);
AxisAlignedBB bb = new AxisAlignedBB(eastDrive);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb, 160);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.FAST, eastDrive.west(), bb.offset(-2, 0, 0)
.expand(15 / 16f, 0, 0), 160);
scene.idle(20);
scene.overlay.showText(80)
.text("When Powered, the speed transmitted to other Chain Drives in the row is doubled")
.placeNearTarget()
.colored(PonderPalette.FAST)
.pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST));
scene.idle(80);
for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) {
scene.idle(5);
scene.overlay.showText(70)
.sharedText(gauge == eastGauge ? "rpm16_source" : "rpm32")
.colored(gauge == eastGauge ? PonderPalette.MEDIUM : PonderPalette.FAST)
.placeNearTarget()
.pointAt(util.vector.blockSurface(gauge, Direction.NORTH));
}
scene.idle(80);
scene.world.hideSection(util.select.fromTo(eastDrive, eastDrive.west(2)), Direction.SOUTH);
scene.idle(15);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2)));
Selection newDriveSelect = util.select.fromTo(eastDrive.south(2), eastDrive.south(2)
.west(2));
ElementLink<WorldSectionElement> drives = scene.world.showIndependentSection(newDriveSelect, Direction.NORTH);
scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.down(), middleGauge), f -> .5f * f);
scene.world.setKineticSpeed(newDriveSelect, -32);
scene.world.moveSection(drives, util.vector.of(0, 0, -2), 0);
scene.world.moveSection(lever, util.vector.of(-2, 0, 0), 10);
scene.idle(40);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(1)));
scene.world.toggleRedstonePower(util.select.position(1, 1, 4));
BlockPos analogPos = leverPos.west(2);
scene.effects.indicateRedstone(analogPos);
scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> .5f * f);
scene.idle(10);
bb = new AxisAlignedBB(eastDrive);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb.expand(-15 / 16f, 0, 0), 160);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.SLOW, eastDrive.west(), bb.offset(-2, 0, 0), 160);
scene.idle(20);
scene.overlay.showText(80)
.text("Whenever the Powered Gearshift is not at the source, its speed will be halved instead")
.placeNearTarget()
.colored(PonderPalette.SLOW)
.pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST));
scene.idle(80);
for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) {
scene.idle(5);
scene.overlay.showText(180)
.sharedText(gauge == westGauge ? "rpm8" : gauge == eastGauge ? "rpm16_source" : "rpm16")
.colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.blockSurface(gauge, Direction.NORTH));
}
scene.idle(80);
scene.overlay.showText(100)
.text("In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift")
.placeNearTarget()
.pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST));
scene.idle(100);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2)));
scene.world.toggleRedstonePower(util.select.position(1, 1, 4));
scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> 2f * f);
scene.world.hideIndependentSection(lever, Direction.UP);
scene.idle(15);
scene.world.showSection(util.select.fromTo(analogPos, analogPos.south()), Direction.DOWN);
scene.idle(15);
scene.world.modifyTileNBT(util.select.position(analogPos), AnalogLeverTileEntity.class, nbt -> {
nbt.putInt("State", 8);
});
scene.world.modifyBlock(analogPos.south(), s -> s.with(RedstoneWireBlock.POWER, 8), false);
scene.world.toggleRedstonePower(util.select.position(1, 1, 4));
scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> .75f * f);
scene.effects.indicateRedstone(analogPos);
scene.idle(20);
scene.overlay.showText(100)
.text("Using analog signals, the ratio can be adjusted more precisely between 1 and 2")
.placeNearTarget()
.pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST));
scene.idle(40);
for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) {
scene.idle(5);
Builder builder = scene.overlay.showText(180)
.colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.blockSurface(gauge, Direction.NORTH));
if (gauge == westGauge)
builder.text("12 RPM");
else
builder.sharedText(gauge == eastGauge ? "rpm16_source" : "rpm16");
}
}
}

View file

@ -0,0 +1,436 @@
package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel;
import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderRegistry;
import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.BeltItemElement;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter;
import com.simibubi.create.foundation.utility.Pointing;
import com.tterrag.registrate.util.entry.ItemEntry;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
public class DebugScenes {
private static int index;
public static void registerAll() {
index = 1;
add(DebugScenes::coordinateScene);
add(DebugScenes::blocksScene);
add(DebugScenes::fluidsScene);
add(DebugScenes::offScreenScene);
add(DebugScenes::particleScene);
add(DebugScenes::controlsScene);
add(DebugScenes::birbScene);
add(DebugScenes::sectionsScene);
add(DebugScenes::itemScene);
}
private static void add(PonderStoryBoard sb) {
ItemEntry<Item> item = AllItems.BRASS_HAND;
String schematicPath = "debug/scene_" + index;
PonderRegistry.addStoryBoard(item, schematicPath, sb)
.highlightAllTags()
.chapter(PonderChapter.of("debug"));
index++;
}
public static void empty(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_empty", "Missing Content");
scene.showBasePlate();
scene.idle(5);
}
public static void coordinateScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_coords", "Coordinate Space");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
Selection xAxis = util.select.fromTo(2, 1, 1, 4, 1, 1);
Selection yAxis = util.select.fromTo(1, 2, 1, 1, 4, 1);
Selection zAxis = util.select.fromTo(1, 1, 2, 1, 1, 4);
scene.idle(10);
scene.overlay.showSelectionWithText(xAxis, 20)
.colored(PonderPalette.RED)
.text("Das X axis");
scene.idle(20);
scene.overlay.showSelectionWithText(yAxis, 20)
.colored(PonderPalette.GREEN)
.text("Das Y axis");
scene.idle(20);
scene.overlay.showSelectionWithText(zAxis, 20)
.colored(PonderPalette.BLUE)
.text("Das Z axis");
scene.idle(10);
}
public static void blocksScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_blocks", "Changing Blocks");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.idle(10);
scene.overlay.showText(1000)
.independent(10)
.text("Blocks can be modified");
scene.idle(20);
scene.world.replaceBlocks(util.select.fromTo(1, 1, 3, 2, 2, 4),
AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), true);
scene.idle(10);
scene.world.replaceBlocks(util.select.position(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState(), true);
scene.rotateCameraY(180);
scene.markAsFinished();
}
public static void fluidsScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_fluids", "Showing Fluids");
scene.showBasePlate();
scene.idle(10);
Vec3d parrotPos = util.vector.topOf(1, 0, 1);
scene.special.birbLookingAtPOI(parrotPos);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.overlay.showText(1000)
.text("Fluid rendering test.")
.pointAt(new Vec3d(1, 2.5, 4.5));
scene.markAsFinished();
Object outlineSlot = new Object();
Vec3d vec1 = util.vector.topOf(1, 0, 0);
Vec3d vec2 = util.vector.topOf(0, 0, 1);
AxisAlignedBB boundingBox1 = new AxisAlignedBB(vec1, vec1).expand(0, 2.5, 0)
.grow(.15, 0, .15);
AxisAlignedBB boundingBox2 = new AxisAlignedBB(vec2, vec2).expand(0, .125, 0)
.grow(.45, 0, .45);
Vec3d poi1 = boundingBox1.getCenter();
Vec3d poi2 = boundingBox2.getCenter();
for (int i = 0; i < 10; i++) {
scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, outlineSlot,
i % 2 == 0 ? boundingBox1 : boundingBox2, 15);
scene.idle(3);
scene.special.movePointOfInterest(i % 2 == 0 ? poi1 : poi2);
scene.idle(12);
}
scene.idle(12);
scene.special.movePointOfInterest(util.grid.at(-4, 5, 4));
scene.overlay.showText(40)
.colored(PonderPalette.RED)
.text("wut?")
.pointAt(parrotPos.add(-.25f, 0.25f, .25f));
}
public static void offScreenScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_baseplate", "Out of bounds / configureBasePlate");
scene.configureBasePlate(1, 0, 6);
scene.showBasePlate();
Selection out1 = util.select.fromTo(7, 0, 0, 8, 0, 5);
Selection out2 = util.select.fromTo(0, 0, 0, 0, 0, 5);
Selection blocksExceptBasePlate = util.select.layersFrom(1)
.add(out1)
.add(out2);
scene.idle(10);
scene.world.showSection(blocksExceptBasePlate, Direction.DOWN);
scene.idle(10);
scene.overlay.showSelectionWithText(out1, 100)
.colored(PonderPalette.BLACK)
.text("Blocks outside of the base plate do not affect scaling");
scene.overlay.showSelectionWithText(out2, 100)
.colored(PonderPalette.BLACK)
.text("configureBasePlate() makes sure of that.");
scene.markAsFinished();
}
public static void particleScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_particles", "Emitting particles");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.idle(10);
Vec3d emitterPos = util.vector.of(2.5, 2.25, 2.5);
Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.of(0, .1, 0));
Emitter rotation =
Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'),
util.vector.of(0, .1, 0));
scene.overlay.showText(20)
.text("Incoming...")
.pointAt(emitterPos);
scene.idle(30);
scene.effects.emitParticles(emitterPos, emitter, 1, 60);
scene.effects.emitParticles(emitterPos, rotation, 20, 1);
scene.idle(30);
scene.rotateCameraY(180);
}
public static void controlsScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_controls", "Basic player interaction");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layer(1), Direction.DOWN);
scene.idle(4);
scene.world.showSection(util.select.layer(2), Direction.DOWN);
scene.idle(4);
scene.world.showSection(util.select.layer(3), Direction.DOWN);
scene.idle(10);
BlockPos shaftPos = util.grid.at(3, 1, 1);
Selection shaftSelection = util.select.position(shaftPos);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftPos), Pointing.DOWN).rightClick()
.whileSneaking()
.withWrench(), 40);
scene.idle(20);
scene.world.replaceBlocks(shaftSelection, AllBlocks.SHAFT.getDefaultState(), true);
scene.idle(20);
scene.world.hideSection(shaftSelection, Direction.UP);
scene.idle(20);
scene.overlay.showControls(new InputWindowElement(util.vector.of(1, 4.5, 3.5), Pointing.LEFT).rightClick()
.withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20);
scene.world.showSection(util.select.layer(4), Direction.DOWN);
scene.idle(40);
BlockPos chassis = util.grid.at(1, 1, 3);
Vec3d chassisSurface = util.vector.blockSurface(chassis, Direction.NORTH);
Object chassisValueBoxHighlight = new Object();
Object chassisEffectHighlight = new Object();
AxisAlignedBB point = new AxisAlignedBB(chassisSurface, chassisSurface);
AxisAlignedBB expanded = point.grow(1 / 4f, 1 / 4f, 1 / 16f);
Selection singleBlock = util.select.position(1, 2, 3);
Selection twoBlocks = util.select.fromTo(1, 2, 3, 1, 3, 3);
Selection threeBlocks = util.select.fromTo(1, 2, 3, 1, 4, 3);
Selection singleRow = util.select.fromTo(1, 2, 3, 3, 2, 3);
Selection twoRows = util.select.fromTo(1, 2, 3, 3, 3, 3);
Selection threeRows = twoRows.copy()
.add(threeBlocks);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, expanded, 120);
scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).scroll()
.withWrench(), 40);
PonderPalette white = PonderPalette.WHITE;
scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, threeBlocks, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10);
scene.idle(10);
scene.idle(30);
scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).whileCTRL()
.scroll()
.withWrench(), 40);
scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, threeRows, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10);
scene.idle(10);
scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10);
scene.idle(10);
scene.markAsFinished();
}
public static void birbScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_birbs", "Birbs");
scene.showBasePlate();
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.idle(10);
BlockPos pos = new BlockPos(1, 2, 3);
scene.special.birbOnSpinnyShaft(pos);
scene.overlay.showText(100)
.colored(PonderPalette.GREEN)
.text("More birbs = More interesting")
.pointAt(util.vector.topOf(pos));
scene.idle(10);
scene.special.birbPartying(util.vector.topOf(0, 1, 2));
scene.idle(10);
scene.special.birbLookingAtPOI(util.vector.centerOf(3, 1, 3)
.add(0, 0.25f, 0));
scene.idle(20);
BlockPos poi1 = util.grid.at(4, 1, 0);
BlockPos poi2 = util.grid.at(0, 1, 4);
scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.getDefaultState(), true);
scene.special.movePointOfInterest(poi1);
scene.idle(20);
scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.getDefaultState(), true);
scene.special.movePointOfInterest(poi2);
scene.overlay.showText(20)
.text("Point of Interest")
.pointAt(util.vector.centerOf(poi2));
scene.idle(20);
scene.world.destroyBlock(poi1);
scene.special.movePointOfInterest(poi1);
scene.idle(20);
scene.world.destroyBlock(poi2);
scene.special.movePointOfInterest(poi2);
}
public static void sectionsScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_sections", "Sections");
scene.showBasePlate();
scene.idle(10);
scene.rotateCameraY(95);
BlockPos mergePos = util.grid.at(1, 1, 1);
BlockPos independentPos = util.grid.at(3, 1, 1);
Selection toMerge = util.select.position(mergePos);
Selection independent = util.select.position(independentPos);
Selection start = util.select.layersFrom(1)
.substract(toMerge)
.substract(independent);
scene.world.showSection(start, Direction.DOWN);
scene.idle(20);
scene.world.showSection(toMerge, Direction.DOWN);
ElementLink<WorldSectionElement> link = scene.world.showIndependentSection(independent, Direction.DOWN);
scene.idle(20);
scene.overlay.showText(40)
.colored(PonderPalette.GREEN)
.text("This Section got merged to base.")
.pointAt(util.vector.topOf(mergePos));
scene.idle(10);
scene.overlay.showText(40)
.colored(PonderPalette.RED)
.text("This Section renders independently.")
.pointAt(util.vector.topOf(independentPos));
scene.idle(40);
scene.world.hideIndependentSection(link, Direction.DOWN);
scene.world.hideSection(util.select.fromTo(mergePos, util.grid.at(1, 1, 4)), Direction.DOWN);
scene.idle(20);
Selection hiddenReplaceArea = util.select.fromTo(2, 1, 2, 4, 1, 4)
.substract(util.select.position(4, 1, 3))
.substract(util.select.position(2, 1, 3));
scene.world.hideSection(hiddenReplaceArea, Direction.UP);
scene.idle(20);
scene.world.setBlocks(hiddenReplaceArea, AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), false);
scene.world.showSection(hiddenReplaceArea, Direction.DOWN);
scene.idle(20);
scene.overlay.showSelectionWithText(hiddenReplaceArea, 30)
.colored(PonderPalette.BLUE)
.text("Seamless substitution of blocks");
scene.idle(40);
ElementLink<WorldSectionElement> helicopter = scene.world.makeSectionIndependent(hiddenReplaceArea);
scene.world.rotateSection(helicopter, 50, 5 * 360, 0, 60);
scene.world.moveSection(helicopter, util.vector.of(0, 4, 5), 50);
scene.overlay.showText(30)
.colored(PonderPalette.BLUE)
.text("Up, up and away.")
.independent(30);
scene.idle(40);
scene.world.hideIndependentSection(helicopter, Direction.UP);
}
public static void itemScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_items", "Manipulating Items");
scene.configureBasePlate(0, 0, 6);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
ItemStack brassItem = AllItems.BRASS_INGOT.asStack();
ItemStack copperItem = AllItems.COPPER_INGOT.asStack();
for (int z = 4; z >= 2; z--) {
scene.world.createItemEntity(util.vector.centerOf(0, 4, z), Vec3d.ZERO, brassItem.copy());
scene.idle(10);
}
BlockPos beltPos = util.grid.at(2, 1, 3);
ElementLink<BeltItemElement> itemOnBelt =
scene.world.createItemOnBelt(beltPos, Direction.EAST, copperItem.copy());
scene.idle(10);
scene.world.stallBeltItem(itemOnBelt, true);
scene.idle(5);
scene.overlay.showText(40)
.colored(PonderPalette.FAST)
.text("Belt Items can only be force-stalled on the belt they were created on.")
.pointAt(util.vector.topOf(2, 1, 2));
scene.idle(45);
scene.world.stallBeltItem(itemOnBelt, false);
scene.idle(20);
scene.world.modifyEntities(ItemEntity.class, entity -> {
if (copperItem.isItemEqual(entity.getItem()))
entity.setNoGravity(true);
});
scene.idle(20);
scene.world.modifyEntities(ItemEntity.class, entity -> {
if (brassItem.isItemEqual(entity.getItem()))
entity.setMotion(util.vector.of(-.15f, .5f, 0));
});
scene.idle(27);
scene.world.modifyEntities(ItemEntity.class, Entity::remove);
}
}

View file

@ -0,0 +1,297 @@
package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.logistics.block.depot.DepotTileEntity;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.BeltItemElement;
import com.simibubi.create.foundation.ponder.elements.EntityElement;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.ParrotElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
public class FanScenes {
public static void direction(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("fan_direction", "Air flow of Encased Fans");
scene.configureBasePlate(0, 1, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
// scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f);
scene.idle(5);
scene.world.showSection(util.select.fromTo(3, 1, 0, 3, 1, 5)
.add(util.select.position(3, 2, 4)), Direction.DOWN);
scene.world.showSection(util.select.fromTo(2, 1, 5, 1, 1, 5), Direction.DOWN);
scene.idle(10);
BlockPos fanPos = util.grid.at(1, 1, 4);
scene.world.showSection(util.select.position(fanPos), Direction.SOUTH);
scene.idle(40);
scene.effects.rotationDirectionIndicator(fanPos.south());
ElementLink<ParrotElement> flappyBirb = scene.special.flappyBirb(util.vector.topOf(1, 0, 3));
scene.idle(2);
scene.special.rotateParrot(flappyBirb, 0, 235, 0, 30);
scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, -2.5), 30);
scene.idle(20);
scene.overlay.showText(80)
.text("Encased Fans use Rotational Force to create an Air Current")
.placeNearTarget()
.pointAt(util.vector.topOf(fanPos));
scene.idle(90);
BlockPos leverPos = util.grid.at(3, 2, 4);
Selection reverse = util.select.fromTo(3, 1, 5, 1, 1, 4);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down()));
scene.effects.indicateRedstone(leverPos);
scene.world.modifyKineticSpeed(reverse, f -> -f);
scene.effects.rotationDirectionIndicator(fanPos.south());
scene.special.rotateParrot(flappyBirb, 0, 215 * 2, 0, 30);
scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, 2.5), 30);
scene.idle(31);
scene.overlay.showText(60)
.text("Strength and Direction of Flow depends on the Rotational Input")
.placeNearTarget()
.pointAt(util.vector.topOf(fanPos));
scene.markAsFinished();
scene.idle(70);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down()));
scene.effects.indicateRedstone(leverPos);
scene.world.modifyKineticSpeed(reverse, f -> -f);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f);
scene.effects.rotationSpeedIndicator(fanPos.south());
scene.special.rotateParrot(flappyBirb, 0, 245 * 4, 0, 30);
scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, -20), 30);
}
public static void processing(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("fan_processing", "Processing Items using Encased Fans");
scene.configureBasePlate(1, 0, 5);
scene.world.showSection(util.select.layer(0)
.substract(util.select.position(0, 0, 4)), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.fromTo(6, 1, 2, 5, 1, 2)
.add(util.select.position(1, 1, 2)), Direction.DOWN);
scene.idle(25);
BlockPos blockPos = util.grid.at(4, 1, 2);
// blasting start
ElementLink<WorldSectionElement> blockInFront =
scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.SOUTH);
scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0);
scene.world.setBlock(blockPos, Blocks.LAVA.getDefaultState(), false);
scene.idle(10);
scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 80)
.colored(PonderPalette.RED)
.text("When passing through lava, the Air Flow becomes Heated");
scene.idle(80);
ItemStack stack = new ItemStack(Items.GOLD_ORE);
ItemStack smelted = new ItemStack(Items.GOLD_INGOT);
ElementLink<EntityElement> entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2)
.up(2)), util.vector.of(0, 0.1, 0), stack);
scene.idle(15);
scene.world.modifyEntity(entityLink, e -> e.setMotion(-0.2f, 0, 0));
Vec3d itemVec = util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.EAST)
.add(0.1, 0, 0);
scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20);
scene.idle(20);
scene.effects.emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.LARGE_SMOKE, Vec3d.ZERO), 1,
60);
scene.overlay.showText(80)
.colored(PonderPalette.WHITE)
.pointAt(itemVec)
.placeNearTarget()
.text("Items caught in the area will be smelted");
scene.idle(60);
scene.world.modifyEntities(ItemEntity.class, ie -> ie.setItem(smelted));
scene.idle(40);
scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(smelted), 20);
scene.idle(20);
scene.world.modifyEntities(ItemEntity.class, Entity::remove);
scene.idle(20);
scene.overlay.showText(80)
.colored(PonderPalette.RED)
.pointAt(itemVec)
.placeNearTarget()
.text("Food items thrown here would be incinerated");
scene.idle(40);
// smoking start
BlockState campfire = Blocks.FIRE.getDefaultState();
scene.world.hideIndependentSection(blockInFront, Direction.NORTH);
scene.idle(15);
scene.world.setBlock(util.grid.at(3, 1, 0), campfire, false);
scene.world.setBlock(blockPos, campfire, true);
blockInFront = scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.NORTH);
scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0);
scene.idle(50);
scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 60)
.colored(PonderPalette.BLACK)
.text("Instead, a setup for Smoking using Fire should be used for them");
scene.idle(80);
// washing start
BlockState water = Blocks.WATER.getDefaultState();
scene.world.hideIndependentSection(blockInFront, Direction.NORTH);
scene.idle(15);
scene.world.setBlock(util.grid.at(3, 1, 0), water, false);
scene.world.setBlock(blockPos, water, true);
blockInFront = scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.NORTH);
scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0);
scene.idle(20);
scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 60)
.colored(PonderPalette.MEDIUM)
.text("Air Flows passing through water create a Washing Setup");
scene.idle(70);
stack = AllItems.CRUSHED_GOLD.asStack();
ItemStack washed = new ItemStack(Items.GOLD_NUGGET, 16);
entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2)
.up(2)), util.vector.of(0, 0.1, 0), stack);
scene.idle(15);
scene.world.modifyEntity(entityLink, e -> e.setMotion(-0.2f, 0, 0));
scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20);
scene.idle(20);
scene.effects.emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), 1, 60);
scene.overlay.showText(50)
.colored(PonderPalette.WHITE)
.pointAt(itemVec)
.placeNearTarget()
.text("Some interesting new processing can be done with it");
scene.idle(60);
scene.world.modifyEntities(ItemEntity.class, ie -> ie.setItem(washed));
scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(washed), 20);
scene.idle(20);
scene.world.modifyEntities(ItemEntity.class, Entity::remove);
scene.idle(20);
scene.overlay.showText(100)
.colored(PonderPalette.RED)
.pointAt(util.vector.topOf(blockPos.east()))
.placeNearTarget()
.text("The Speed of the Fan does NOT affect the processing speed, only its range");
scene.world.destroyBlock(util.grid.at(1, 1, 2));
scene.idle(110);
ElementLink<WorldSectionElement> cogs = scene.world.makeSectionIndependent(util.select.fromTo(6, 1, 2, 6, 0, 3)
.add(util.select.fromTo(4, 0, 2, 5, 0, 2)));
scene.world.modifyKineticSpeed(util.select.position(5, 2, 2), f -> f / 3f);
scene.world.moveSection(cogs, util.vector.of(0, 1, 0), 15);
scene.world.moveSection(blockInFront, util.vector.of(0, 1, 0), 15);
scene.world.destroyBlock(blockPos.east());
scene.world.showSection(util.select.position(blockPos.east()
.up()), Direction.DOWN);
scene.world.setBlock(blockPos.up(), Blocks.WATER.getDefaultState(), false);
ItemStack sand = new ItemStack(Items.SAND);
ItemStack clay = new ItemStack(Items.CLAY_BALL);
scene.idle(20);
BlockPos depos = util.grid.at(3, 4, 2);
ElementLink<WorldSectionElement> depot =
scene.world.showIndependentSection(util.select.position(depos), Direction.DOWN);
scene.world.moveSection(depot, util.vector.of(-1, -3, 0), 0);
scene.world.createItemOnBeltLike(depos, Direction.NORTH, sand);
scene.idle(10);
Vec3d depotTop = util.vector.topOf(2, 1, 2)
.add(0, 0.25, 0);
scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 30);
scene.idle(30);
scene.world.modifyTileNBT(util.select.position(depos), DepotTileEntity.class,
nbt -> nbt.put("HeldItem", new TransportedItemStack(clay).serializeNBT()));
scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 30);
scene.overlay.showText(90)
.pointAt(depotTop)
.text("Fan Processing can also be applied to Items on Depots and Belts");
scene.idle(100);
scene.world.moveSection(depot, util.vector.of(-1, 0, 0), 15);
scene.idle(15);
ElementLink<WorldSectionElement> largeCog =
scene.world.showIndependentSection(util.select.position(1, 2, 4), Direction.UP);
ElementLink<WorldSectionElement> belt =
scene.world.showIndependentSection(util.select.fromTo(3, 3, 1, 1, 3, 3), Direction.DOWN);
scene.world.moveSection(largeCog, util.vector.of(-1, -2, 0), 0);
scene.world.moveSection(belt, util.vector.of(-1, -2, 0), 0);
ElementLink<BeltItemElement> transported =
scene.world.createItemOnBelt(util.grid.at(3, 3, 3), Direction.SOUTH, sand);
scene.idle(60);
scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 25);
scene.idle(25);
scene.world.changeBeltItemTo(transported, new ItemStack(Items.CLAY_BALL));
scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 25);
scene.idle(60);
scene.world.setKineticSpeed(util.select.position(1, 2, 4)
.add(util.select.fromTo(3, 3, 1, 1, 3, 3)), 0);
}
public static void source(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("fan_source", "Generating Rotational Force using Encased Fans");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.layer(1), Direction.DOWN);
scene.idle(10);
scene.world.showSection(util.select.layersFrom(2), Direction.DOWN);
scene.idle(10);
BlockPos rightFan = util.grid.at(1, 2, 2);
scene.overlay.showText(80)
.text("Fans facing down into a source of heat can provide Rotational Force")
.placeNearTarget()
.pointAt(util.vector.blockSurface(rightFan, Direction.WEST));
scene.idle(80);
for (BlockPos pos : new BlockPos[] { rightFan, util.grid.at(3, 2, 2) }) {
scene.idle(10);
scene.world.toggleRedstonePower(util.select.position(pos.north()));
scene.effects.indicateRedstone(pos.north());
scene.world.setKineticSpeed(util.select.fromTo(pos, pos.up()), 4);
scene.effects.rotationSpeedIndicator(pos.up());
}
scene.overlay.showText(90)
.text("When given a Redstone Signal, the Fans will start providing power")
.colored(PonderPalette.RED)
.placeNearTarget()
.pointAt(util.vector.blockSurface(rightFan, Direction.WEST));
scene.markAsFinished();
}
}

View file

@ -0,0 +1,509 @@
package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.EntityElement;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.block.Blocks;
import net.minecraft.block.LeverBlock;
import net.minecraft.block.RedstoneWireBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.items.ItemHandlerHelper;
public class FunnelScenes {
public static void intro(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("funnel_intro", "Using funnels");
scene.configureBasePlate(0, 1, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f);
scene.idle(10);
Selection verticalFunnel = util.select.fromTo(2, -1, 4, 2, 4, 4)
.add(util.select.fromTo(1, 1, 4, 1, 4, 4));
Selection beltFunnels = util.select.fromTo(1, 2, 2, 3, 2, 2);
Selection beltFunnelEnv = util.select.fromTo(0, 1, 0, 5, 2, 2)
.substract(beltFunnels);
scene.world.showSection(beltFunnelEnv, Direction.DOWN);
scene.idle(20);
scene.world.showSection(beltFunnels, Direction.DOWN);
BlockPos entryBeltPos = util.grid.at(3, 1, 2);
BlockPos exitBeltPos = util.grid.at(1, 1, 2);
ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack();
Selection exitFunnel = util.select.position(exitBeltPos.up());
for (int i = 0; i < 8; i++) {
scene.idle(8);
scene.world.removeItemsFromBelt(exitBeltPos);
scene.world.flapFunnels(exitFunnel, false);
if (i == 2)
scene.rotateCameraY(70);
if (i < 6)
scene.world.createItemOnBelt(entryBeltPos, Direction.EAST, itemStack);
}
scene.rotateCameraY(-70);
scene.idle(10);
Selection outputFunnel = util.select.position(1, 2, 4);
scene.world.setBlocks(outputFunnel, Blocks.AIR.getDefaultState(), false);
scene.world.setBlocks(util.select.fromTo(2, -1, 4, 2, 0, 4), AllBlocks.ANDESITE_CASING.getDefaultState(), true);
ElementLink<WorldSectionElement> independentSection =
scene.world.showIndependentSection(verticalFunnel, Direction.UP);
Vec3d topItemSpawn = util.vector.centerOf(2, 6, 4);
Vec3d sideItemSpawn = util.vector.centerOf(1, 3, 4)
.add(0.15f, -0.45f, 0);
ElementLink<EntityElement> lastItemEntity = null;
for (int i = 0; i < 4; i++) {
if (lastItemEntity != null)
scene.world.modifyEntity(lastItemEntity, Entity::remove);
if (i < 3)
lastItemEntity = scene.world.createItemEntity(topItemSpawn, util.vector.of(0, -0.4, 0), itemStack);
scene.idle(8);
}
scene.world.moveSection(independentSection, util.vector.of(0, 1, 0), 15);
scene.idle(10);
scene.world.setBlocks(outputFunnel, AllBlocks.ANDESITE_FUNNEL.getDefaultState()
.with(FunnelBlock.FACING, Direction.WEST)
.with(FunnelBlock.EXTRACTING, true), false);
for (int i = 0; i < 3; i++) {
scene.idle(8);
scene.world.flapFunnels(outputFunnel, false);
scene.world.createItemEntity(sideItemSpawn, util.vector.of(-.05, 0, 0), itemStack);
}
scene.idle(8);
scene.overlay.showText(360)
.text("Funnels are ideal for transferring items from and to inventories.")
.independent();
scene.markAsFinished();
}
public static void directionality(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("funnel_direction", "Direction of Transfer");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f);
scene.world.setBlocks(util.select.position(3, 1, 1), AllBlocks.ANDESITE_CASING.getDefaultState(), false);
BlockPos topFunnel = util.grid.at(3, 3, 2);
Selection topFunnelSelection = util.select.position(topFunnel);
Selection firstShow = util.select.fromTo(3, 1, 2, 3, 2, 2);
scene.idle(5);
scene.world.showSection(firstShow, Direction.DOWN);
scene.idle(15);
ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack();
Vec3d topCenter = util.vector.centerOf(topFunnel);
Vec3d topSide = util.vector.blockSurface(topFunnel, Direction.EAST);
InputWindowElement controlsSneak = new InputWindowElement(topCenter, Pointing.DOWN).rightClick()
.whileSneaking();
// Placing funnels without sneak
scene.world.showSection(topFunnelSelection, Direction.DOWN);
scene.overlay.showText(80)
.text("Placed normally, it pulls items from the inventory.")
.pointAt(topCenter)
.placeNearTarget();
scene.idle(45);
ElementLink<EntityElement> itemLink =
scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack);
scene.idle(40);
scene.world.modifyEntity(itemLink, Entity::remove);
scene.world.hideSection(topFunnelSelection, Direction.UP);
scene.idle(20);
// Placing funnels with sneak
scene.world.modifyBlock(topFunnel, s -> s.with(FunnelBlock.EXTRACTING, false), false);
scene.idle(5);
scene.world.showSection(topFunnelSelection, Direction.DOWN);
scene.overlay.showControls(controlsSneak, 35);
scene.overlay.showText(80)
.text("Placed while sneaking, it puts items into the inventory.")
.pointAt(topCenter)
.placeNearTarget();
scene.idle(45);
itemLink = scene.world.createItemEntity(topCenter.add(0, 3, 0), util.vector.of(0, -0.2, 0), itemStack);
scene.idle(10);
scene.world.modifyEntity(itemLink, Entity::remove);
scene.idle(45);
// Wrench interaction
InputWindowElement wrenchControls = new InputWindowElement(topSide, Pointing.RIGHT).rightClick()
.withWrench();
scene.overlay.showControls(wrenchControls, 40);
scene.idle(10);
scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true);
scene.idle(10);
scene.overlay.showText(80)
.text("Using a wrench, the funnel can be flipped after placement.")
.pointAt(topCenter)
.placeNearTarget();
itemLink = scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack);
scene.idle(30);
scene.overlay.showControls(wrenchControls, 40);
scene.idle(10);
scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true);
scene.idle(10);
scene.world.modifyEntity(itemLink, Entity::remove);
scene.idle(20);
// Side funnel
BlockPos sideFunnel = util.grid.at(3, 2, 1);
Selection sideFunnelSelection = util.select.fromTo(sideFunnel.down(), sideFunnel);
Vec3d sideCenter = util.vector.centerOf(sideFunnel);
scene.world.modifyBlock(sideFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), false);
scene.world.showSection(sideFunnelSelection, Direction.DOWN);
scene.overlay.showText(70)
.text("Same rules will apply for most orientations.")
.pointAt(sideCenter)
.placeNearTarget();
scene.idle(20);
scene.world.flapFunnels(sideFunnelSelection, true);
itemLink = scene.world.createItemEntity(sideCenter.subtract(0, .45, 0), util.vector.of(0, 0, -0.1), itemStack);
scene.idle(60);
scene.world.hideSection(sideFunnelSelection, Direction.UP);
scene.world.hideSection(topFunnelSelection, Direction.UP);
scene.world.modifyEntity(itemLink, Entity::remove);
scene.idle(20);
// Belt funnel
Selection beltFunnelSetup = util.select.fromTo(0, 1, 0, 2, 2, 5);
Selection gearshiftAndLever = util.select.fromTo(1, 1, 4, 1, 2, 4);
Selection gearshiftedKinetics = util.select.fromTo(1, 1, 2, 2, 1, 4);
Vec3d topOfBeltFunnel = util.vector.topOf(2, 2, 2);
BlockPos beltPos = util.grid.at(2, 1, 2);
BlockPos cogPos = util.grid.at(1, 1, 3);
scene.world.showSection(beltFunnelSetup, Direction.DOWN);
scene.overlay.showText(140)
.text("Funnels on belts will extract/insert depending on its movement direction.")
.pointAt(topOfBeltFunnel);
scene.idle(15);
for (int i = 0; i < 2; i++) {
scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack);
scene.effects.rotationDirectionIndicator(cogPos);
scene.idle(50);
scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false);
scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f);
scene.effects.indicateRedstone(util.grid.at(1, 2, 4));
scene.effects.rotationDirectionIndicator(cogPos);
scene.idle(35);
scene.world.removeItemsFromBelt(beltPos);
scene.world.flapFunnels(beltFunnelSetup, false);
if (i == 0) {
scene.idle(50);
scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false);
scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f);
scene.effects.indicateRedstone(util.grid.at(1, 2, 4));
}
}
}
public static void compat(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("funnel_compat", "Funnel compatibility");
scene.configureBasePlate(0, 0, 5);
BlockPos sawFunnel = util.grid.at(4, 2, 1);
BlockPos depotFunnel = util.grid.at(2, 2, 2);
BlockPos drainFunnel = util.grid.at(0, 2, 3);
scene.world.showSection(util.select.layer(0), Direction.UP);
Selection firstShow = util.select.layer(1)
.add(util.select.position(sawFunnel.south()))
.add(util.select.position(depotFunnel.south()))
.add(util.select.position(drainFunnel.south()));
scene.idle(5);
scene.world.showSection(firstShow, Direction.DOWN);
scene.idle(8);
scene.overlay.showText(360)
.text("Funnels should also interact nicely with a handful of other components.")
.independent(0);
scene.idle(40);
scene.world.showSection(util.select.position(sawFunnel), Direction.DOWN);
scene.overlay.showText(40)
.text("Vertical Saws")
.colored(PonderPalette.BLUE)
.placeNearTarget()
.pointAt(util.vector.centerOf(sawFunnel.down()));
scene.idle(8);
scene.world.createItemOnBeltLike(sawFunnel.down(), Direction.SOUTH, new ItemStack(Blocks.OAK_LOG));
scene.idle(40);
scene.world.showSection(util.select.position(depotFunnel), Direction.DOWN);
scene.overlay.showText(40)
.text("Depots")
.colored(PonderPalette.BLUE)
.placeNearTarget()
.pointAt(util.vector.centerOf(depotFunnel.down()));
scene.idle(8);
scene.world.createItemOnBeltLike(depotFunnel.down(), Direction.SOUTH, new ItemStack(Items.GOLDEN_PICKAXE));
scene.idle(40);
scene.world.showSection(util.select.position(drainFunnel), Direction.DOWN);
scene.overlay.showText(40)
.text("Item Drains")
.colored(PonderPalette.BLUE)
.placeNearTarget()
.pointAt(util.vector.centerOf(drainFunnel.down()));
scene.idle(8);
scene.world.createItemOnBeltLike(drainFunnel.down(), Direction.SOUTH, new ItemStack(Items.WATER_BUCKET));
scene.idle(40);
scene.markAsFinished();
}
public static void redstone(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("funnel_redstone", "Redstone control");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack();
Vec3d topItemSpawn = util.vector.centerOf(3, 6, 2);
ElementLink<EntityElement> lastItemEntity = null;
BlockPos lever = util.grid.at(1, 2, 2);
BlockPos redstone = util.grid.at(2, 2, 2);
BlockPos funnel = util.grid.at(3, 2, 2);
AxisAlignedBB redstoneBB = new AxisAlignedBB(funnel).grow(-1 / 16f, -6 / 16f, -1 / 16f)
.offset(0, -5 / 16f, 0);
for (int i = 0; i < 4; i++) {
if (lastItemEntity != null)
scene.world.modifyEntity(lastItemEntity, Entity::remove);
lastItemEntity = scene.world.createItemEntity(topItemSpawn, util.vector.of(0, -0.2, 0), itemStack);
scene.idle(8);
if (i == 3) {
scene.world.modifyBlock(lever, s -> s.cycle(LeverBlock.POWERED), false);
scene.world.modifyBlock(redstone, s -> s.with(RedstoneWireBlock.POWER, 15), false);
scene.world.modifyBlock(funnel, s -> s.cycle(FunnelBlock.POWERED), false);
scene.effects.indicateRedstone(lever);
scene.idle(4);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, funnel, redstoneBB, 80);
scene.overlay.showText(80)
.colored(PonderPalette.RED)
.text("Redstone power will prevent any funnel from acting.")
.pointAt(util.vector.blockSurface(funnel, Direction.DOWN));
} else {
scene.idle(4);
}
}
}
public static void brass(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("brass_funnel", "The Brass Funnel");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
BlockPos firstDepot = util.grid.at(3, 1, 1);
BlockPos secondDepot = util.grid.at(1, 1, 1);
Selection depots = util.select.fromTo(firstDepot, secondDepot);
Selection beltAndStuff = util.select.fromTo(0, 1, 2, 4, 1, 2)
.add(util.select.fromTo(0, 1, 3, 0, 2, 5));
Selection withoutBelt = util.select.layersFrom(1)
.substract(beltAndStuff)
.substract(depots);
scene.world.showSection(withoutBelt, Direction.DOWN);
ElementLink<WorldSectionElement> independentSection =
scene.world.showIndependentSection(depots, Direction.DOWN);
scene.world.moveSection(independentSection, util.vector.of(0, 0, 1), 0);
BlockPos andesiteFunnel = util.grid.at(3, 2, 2);
BlockPos brassFunnel = util.grid.at(1, 2, 2);
ItemStack itemStack = AllItems.BRASS_INGOT.asStack();
scene.idle(10);
scene.overlay.showText(60)
.text("Andesite Funnels can only ever extract single items.")
.pointAt(util.vector.topOf(andesiteFunnel))
.placeNearTarget();
scene.idle(10);
scene.world.createItemOnBeltLike(andesiteFunnel.down()
.north(), Direction.SOUTH, itemStack);
scene.world.flapFunnels(util.select.position(andesiteFunnel), true);
scene.idle(60);
scene.overlay.showText(60)
.text("Brass Funnels can extract up to a full stack.")
.pointAt(util.vector.topOf(brassFunnel))
.placeNearTarget();
scene.idle(10);
scene.world.createItemOnBeltLike(brassFunnel.down()
.north(), Direction.SOUTH, ItemHandlerHelper.copyStackWithSize(itemStack, 64));
scene.world.flapFunnels(util.select.position(brassFunnel), true);
scene.idle(60);
AxisAlignedBB filterSlot = new AxisAlignedBB(brassFunnel).grow(-.35, -.35, -.35)
.offset(0, 0.2, 0);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).scroll(), 60);
scene.idle(10);
scene.overlay.showText(80)
.text("Scrolling on the filter slot allows for precise control over the extracted stack size.")
.pointAt(filterSlot.getCenter())
.placeNearTarget();
scene.idle(90);
// belt
scene.world.hideIndependentSection(independentSection, Direction.NORTH);
scene.world.hideSection(util.select.position(brassFunnel), Direction.UP);
scene.idle(20);
scene.world.modifyBlock(brassFunnel, s -> s.cycle(BeltFunnelBlock.SHAPE), false);
scene.world.showSection(util.select.position(brassFunnel), Direction.DOWN);
scene.world.showSection(beltAndStuff, Direction.SOUTH);
scene.idle(10);
ItemStack dirt = new ItemStack(Items.DIRT);
ItemStack gravel = new ItemStack(Items.GRAVEL);
ItemStack emerald = new ItemStack(Items.EMERALD);
for (int i = 0; i < 14; i++) {
if (i < 12)
scene.world.createItemOnBelt(andesiteFunnel.down(), Direction.SOUTH,
i % 3 == 0 ? dirt : i % 3 == 1 ? gravel : emerald);
scene.idle(10);
if (i > 0 && (i < 3 || i % 3 == 0)) {
scene.world.removeItemsFromBelt(brassFunnel.down());
scene.world.flapFunnels(util.select.position(brassFunnel), false);
}
scene.world.modifyEntities(ItemEntity.class, e -> {
if (e.getY() < 1)
e.remove();
});
if (i == 2) {
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80);
scene.overlay
.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).rightClick()
.withItem(emerald), 60);
scene.idle(10);
scene.overlay.showText(80)
.text("Using items on the filter slot will restrict the funnel to only transfer matching stacks.")
.pointAt(filterSlot.getCenter())
.placeNearTarget();
scene.world.setFilterData(util.select.position(brassFunnel), FunnelTileEntity.class, emerald);
} else
scene.idle(10);
if (i == 8)
scene.markAsFinished();
}
}
public static void transposer(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("funnel_transfer", "Direct transfer");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
BlockPos funnelPos = util.grid.at(2, 2, 2);
Selection funnelSelect = util.select.position(funnelPos);
ElementLink<WorldSectionElement> rightChest =
scene.world.showIndependentSection(util.select.position(0, 2, 2), Direction.DOWN);
ElementLink<WorldSectionElement> leftChest =
scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN);
scene.world.moveSection(rightChest, util.vector.of(2, 1, 0), 0);
scene.world.moveSection(leftChest, util.vector.of(-2, -1, 0), 0);
scene.idle(5);
scene.world.showSection(funnelSelect, Direction.DOWN);
scene.idle(20);
scene.overlay.showSelectionWithText(funnelSelect, 40)
.colored(PonderPalette.RED)
.text("Funnels cannot ever transfer between closed inventories directly.")
.placeNearTarget();
scene.idle(50);
scene.world.hideSection(funnelSelect, Direction.SOUTH);
scene.idle(20);
scene.world.setBlocks(funnelSelect, AllBlocks.CHUTE.getDefaultState(), false);
scene.world.showSection(funnelSelect, Direction.NORTH);
scene.idle(10);
scene.overlay.showText(40)
.colored(PonderPalette.GREEN)
.text("Chutes or Smart chutes might be more suitable for such purposes.")
.pointAt(util.vector.centerOf(funnelPos))
.placeNearTarget();
scene.idle(50);
scene.world.hideSection(funnelSelect, Direction.UP);
scene.world.hideIndependentSection(leftChest, Direction.UP);
scene.world.hideIndependentSection(rightChest, Direction.UP);
scene.idle(20);
Selection belt = util.select.layer(1);
scene.world.setBlocks(funnelSelect, Blocks.AIR.getDefaultState(), false);
scene.world.showSection(belt, Direction.DOWN);
scene.world.showSection(util.select.fromTo(0, 2, 2, 4, 2, 2), Direction.DOWN);
scene.overlay.showText(120)
.colored(PonderPalette.GREEN)
.text("Same applies for horizontal movement.\nA mechanical belt should help here.")
.pointAt(util.vector.topOf(1, 2, 2))
.placeNearTarget();
scene.markAsFinished();
}
}

View file

@ -0,0 +1,295 @@
package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.RedstoneWireBlock;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
public class GantryScenes {
public static void introForPinion(SceneBuilder scene, SceneBuildingUtil util) {
intro(scene, util, true);
}
public static void introForShaft(SceneBuilder scene, SceneBuildingUtil util) {
intro(scene, util, false);
}
private static void intro(SceneBuilder scene, SceneBuildingUtil util, boolean pinion) {
String id = "gantry_" + (pinion ? "carriage" : "shaft");
String title = "Using Gantry " + (pinion ? "Carriages" : "Shafts");
scene.title(id, title);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f);
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(10);
scene.world.showSection(util.select.layer(1), Direction.DOWN);
scene.idle(10);
ElementLink<WorldSectionElement> gantry =
scene.world.showIndependentSection(util.select.layer(2), Direction.DOWN);
scene.idle(10);
BlockPos centralShaft = util.grid.at(2, 1, 2);
scene.world.moveSection(gantry, util.vector.of(-4, 0, 0), 60);
String text = pinion ? "Gantry Carriages can mount to and slide along a Gantry Shaft."
: "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.";
scene.overlay.showText(80)
.text(text)
.pointAt(util.vector.centerOf(centralShaft));
scene.idle(80);
scene.world.hideIndependentSection(gantry, Direction.UP);
scene.idle(10);
gantry = scene.world.showIndependentSection(util.select.layer(2), Direction.DOWN);
Vec3d gantryTop = util.vector.topOf(4, 2, 2);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 0f);
scene.overlay.showText(40)
.text("Gantry setups can move attached Blocks.")
.pointAt(gantryTop)
.placeNearTarget();
scene.idle(30);
Selection planks = util.select.position(5, 3, 1);
scene.world.showSectionAndMerge(util.select.layersFrom(3)
.substract(planks), Direction.DOWN, gantry);
scene.idle(10);
scene.world.showSectionAndMerge(planks, Direction.SOUTH, gantry);
scene.idle(10);
scene.effects.superGlue(util.grid.at(5, 3, 1), Direction.SOUTH, true);
scene.idle(20);
scene.overlay.showText(80)
.sharedText("movement_anchors")
.pointAt(gantryTop)
.placeNearTarget();
scene.idle(80);
scene.world.modifyKineticSpeed(util.select.layer(0), f -> 32f);
scene.world.modifyKineticSpeed(util.select.layer(1), f -> -64f);
scene.world.moveSection(gantry, util.vector.of(-4, 0, 0), 60);
scene.idle(20);
scene.markAsFinished();
}
public static void redstone(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("gantry_redstone", "Gantry Power Propagation");
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f);
Selection leverRedstone = util.select.fromTo(3, 1, 0, 3, 1, 1);
Selection shaft = util.select.fromTo(0, 1, 2, 4, 1, 2);
Selection shaftAndCog = util.select.fromTo(0, 1, 2, 5, 1, 2);
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0)
.add(leverRedstone), Direction.UP);
scene.idle(10);
scene.world.showSection(shaftAndCog, Direction.DOWN);
scene.idle(10);
BlockPos gantryPos = util.grid.at(4, 2, 2);
ElementLink<WorldSectionElement> gantry =
scene.world.showIndependentSection(util.select.position(gantryPos), Direction.DOWN);
scene.idle(15);
scene.world.moveSection(gantry, util.vector.of(-3, 0, 0), 40);
scene.idle(40);
scene.world.toggleRedstonePower(shaft);
scene.world.toggleRedstonePower(util.select.position(3, 1, 0));
scene.world.toggleRedstonePower(util.select.position(3, 1, 1));
scene.effects.indicateRedstone(util.grid.at(3, 1, 0));
scene.world.modifyKineticSpeed(util.select.position(gantryPos), f -> 32f);
scene.idle(40);
BlockPos cogPos = util.grid.at(1, 2, 1);
scene.overlay.showText(60)
.colored(PonderPalette.RED)
.pointAt(util.vector.centerOf(cogPos.down()
.south()))
.text("Redstone-powered gantry shafts stop moving their carriages")
.placeNearTarget();
scene.idle(70);
Selection cogSelection = util.select.position(cogPos);
scene.world.showSection(cogSelection, Direction.SOUTH);
scene.world.modifyKineticSpeed(cogSelection, f -> 32f);
scene.overlay.showText(180)
.colored(PonderPalette.GREEN)
.pointAt(util.vector.blockSurface(cogPos, Direction.NORTH))
.text("Instead, its rotational force is relayed to the carriages' output shaft")
.placeNearTarget();
scene.idle(10);
scene.effects.rotationSpeedIndicator(cogPos);
scene.markAsFinished();
}
public static void direction(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("gantry_direction", "Gantry Movement Direction");
scene.configureBasePlate(0, 0, 5);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(10);
Selection shaftAndGearshiftAndLever = util.select.fromTo(0, 1, 2, 5, 2, 2);
Selection shafts = util.select.fromTo(0, 1, 2, 3, 1, 2);
scene.world.showSection(shaftAndGearshiftAndLever, Direction.DOWN);
scene.overlay.showText(60)
.text("Gantry Shafts can have opposite orientations")
.pointAt(util.vector.of(2, 1.5, 2.5))
.placeNearTarget();
scene.idle(60);
ElementLink<WorldSectionElement> gantry1 =
scene.world.showIndependentSection(util.select.position(0, 1, 3), Direction.NORTH);
ElementLink<WorldSectionElement> gantry2 =
scene.world.showIndependentSection(util.select.position(3, 1, 3), Direction.NORTH);
scene.idle(10);
scene.world.moveSection(gantry1, util.vector.of(1, 0, 0), 20);
scene.world.moveSection(gantry2, util.vector.of(-1, 0, 0), 20);
scene.overlay.showText(80)
.text("The movement direction of carriages depend on their shafts' orientation")
.pointAt(util.vector.topOf(1, 1, 3))
.placeNearTarget();
scene.idle(80);
BlockPos lastShaft = util.grid.at(0, 1, 2);
boolean flip = true;
for (int i = 0; i < 3; i++) {
scene.world.modifyBlocks(util.select.fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED),
false);
scene.effects.indicateRedstone(util.grid.at(4, 2, 2));
scene.world.moveSection(gantry1, util.vector.of(flip ? -1 : 1, 0, 0), 20);
scene.world.moveSection(gantry2, util.vector.of(flip ? 1 : -1, 0, 0), 20);
scene.world.modifyKineticSpeed(shafts, f -> -f);
scene.effects.rotationDirectionIndicator(lastShaft.east(flip ? 1 : 0));
scene.idle(20);
if (i == 0) {
scene.overlay.showText(80)
.text("...as well as the rotation direction of the shaft")
.pointAt(util.vector.blockSurface(lastShaft, Direction.WEST))
.placeNearTarget();
}
scene.idle(30);
flip = !flip;
}
Selection kinetics = util.select.fromTo(0, 2, 3, 3, 3, 3);
Selection gears1 = util.select.fromTo(0, 1, 3, 0, 3, 3);
Selection gears2 = util.select.fromTo(3, 1, 3, 3, 3, 3);
scene.world.showSection(kinetics, Direction.DOWN);
scene.world.showSection(util.select.fromTo(0, 1, 0, 4, 1, 1), Direction.SOUTH);
scene.idle(20);
BlockPos leverPos = util.grid.at(4, 1, 0);
scene.world.modifyBlocks(util.select.fromTo(1, 1, 0, 3, 1, 1),
s -> s.has(RedstoneWireBlock.POWER) ? s.with(RedstoneWireBlock.POWER, 15) : s, false);
scene.world.toggleRedstonePower(util.select.position(leverPos));
scene.world.toggleRedstonePower(shafts);
scene.effects.indicateRedstone(leverPos);
scene.world.modifyKineticSpeed(gears1, f -> -32f);
scene.world.modifyKineticSpeed(gears2, f -> 32f);
scene.idle(20);
scene.overlay.showText(120)
.text("Same rules apply for the propagated rotation")
.pointAt(util.vector.topOf(0, 3, 3))
.placeNearTarget();
scene.idle(20);
for (boolean flip2 : Iterate.trueAndFalse) {
scene.effects.rotationDirectionIndicator(util.grid.at(0, 3, 3));
scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 3));
scene.idle(60);
scene.world.modifyBlocks(util.select.fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED),
false);
scene.effects.indicateRedstone(util.grid.at(4, 2, 2));
scene.world.modifyKineticSpeed(gears1, f -> -f);
scene.world.modifyKineticSpeed(gears2, f -> -f);
if (!flip2) {
scene.effects.rotationDirectionIndicator(util.grid.at(0, 3, 3));
scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 3));
scene.markAsFinished();
}
}
}
public static void subgantry(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("gantry_cascaded", "Cascaded Gantries");
scene.configureBasePlate(0, 0, 5);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f);
scene.world.showSection(util.select.layer(0)
.add(util.select.column(5, 3))
.add(util.select.fromTo(2, 1, 3, 4, 1, 3)), Direction.UP);
scene.idle(10);
BlockPos gantryPos = util.grid.at(5, 1, 2);
BlockPos gantryPos2 = util.grid.at(3, 2, 2);
ElementLink<WorldSectionElement> gantry =
scene.world.showIndependentSection(util.select.position(gantryPos), Direction.SOUTH);
scene.idle(5);
scene.world.showSectionAndMerge(util.select.fromTo(0, 1, 2, 4, 1, 2), Direction.EAST, gantry);
scene.idle(15);
scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40);
scene.overlay.showText(60)
.text("Gantry shafts attach to a carriage without the need of super glue")
.independent(20);
scene.idle(40);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f);
scene.world.moveSection(gantry, util.vector.of(0, -2, 0), 40);
scene.idle(40);
ElementLink<WorldSectionElement> secondGantry =
scene.world.showIndependentSection(util.select.position(gantryPos2), Direction.DOWN);
scene.idle(15);
scene.overlay.showText(60)
.text("Same applies for carriages on moved Gantry Shafts")
.independent(20);
scene.idle(15);
scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40);
scene.world.moveSection(secondGantry, util.vector.of(0, 2, 0), 40);
scene.idle(40);
BlockPos leverPos = util.grid.at(2, 1, 3);
scene.world.toggleRedstonePower(util.select.position(leverPos));
scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 3, 4, 1, 3));
scene.world.toggleRedstonePower(util.select.fromTo(5, 1, 3, 5, 4, 3));
scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 5, 1, 2), f -> -32f);
scene.effects.indicateRedstone(leverPos);
scene.world.moveSection(secondGantry, util.vector.of(-3, 0, 0), 60);
scene.idle(20);
scene.overlay.showText(120)
.text("Thus, a gantry system can be cascaded to cover multiple axes of movement")
.independent(20);
}
}

View file

@ -0,0 +1,690 @@
package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock;
import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.utility.Pointing;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
public class KineticsScenes {
public static void shaftAsRelay(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("shaft", "Relaying rotational force using Shafts");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
BlockPos gaugePos = util.grid.at(0, 1, 2);
Selection gauge = util.select.position(gaugePos);
scene.world.showSection(gauge, Direction.UP);
scene.world.setKineticSpeed(gauge, 0);
scene.idle(5);
scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN);
scene.idle(10);
for (int i = 4; i >= 1; i--) {
if (i == 2)
scene.rotateCameraY(70);
scene.idle(5);
scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN);
}
scene.world.setKineticSpeed(gauge, 64);
scene.effects.indicateSuccess(gaugePos);
scene.idle(10);
scene.overlay.showText(1000)
.text("Shafts will relay rotation in a straight line.")
.pointAt(util.vector.of(3, 1.5, 2.5));
scene.idle(20);
scene.markAsFinished();
}
public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("shaft_casing", "Encasing Shafts");
scene.configureBasePlate(0, 0, 5);
scene.showBasePlate();
Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(5, 0, 2));
Selection andesite = util.select.position(3, 1, 2);
Selection brass = util.select.position(1, 1, 2);
scene.world.showSection(shaft, Direction.DOWN);
scene.idle(20);
BlockEntry<EncasedShaftBlock> andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT;
ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack();
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 1, 2), Pointing.DOWN).rightClick()
.withItem(andesiteCasingItem), 60);
scene.idle(7);
scene.world.setBlocks(andesite, andesiteEncased.getDefaultState()
.with(EncasedShaftBlock.AXIS, Axis.X), true);
scene.world.setKineticSpeed(shaft, 32);
scene.idle(10);
BlockEntry<EncasedShaftBlock> brassEncased = AllBlocks.BRASS_ENCASED_SHAFT;
ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack();
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(1, 0, 2), Pointing.UP).rightClick()
.withItem(brassCasingItem), 60);
scene.idle(7);
scene.world.setBlocks(brass, brassEncased.getDefaultState()
.with(EncasedShaftBlock.AXIS, Axis.X), true);
scene.world.setKineticSpeed(shaft, 32);
scene.idle(10);
scene.overlay.showText(1000)
.text("Brass or Andesite Casing can be used to decorate Shafts")
.pointAt(util.vector.topOf(1, 1, 2));
}
public static void cogAsRelay(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("cogwheel", "Relaying rotational force using Cogwheels");
scene.configureBasePlate(0, 0, 5);
BlockPos gauge = util.grid.at(4, 1, 1);
Selection gaugeSelect = util.select.position(gauge);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.world.showSection(gaugeSelect, Direction.UP);
scene.world.setKineticSpeed(gaugeSelect, 0);
scene.idle(5);
scene.world.showSection(util.select.fromTo(1, 1, 3, 1, 1, 5), Direction.DOWN);
scene.idle(10);
for (int i = 1; i <= 4; i++) {
scene.idle(5);
if (i == 2)
scene.world.showSection(util.select.position(0, 1, 2), Direction.DOWN);
scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN);
}
scene.world.setKineticSpeed(gaugeSelect, 64);
scene.effects.indicateSuccess(gauge);
scene.idle(10);
scene.overlay.showText(60)
.text("Cogwheels will relay rotation to other adjacent cogwheels")
.pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.EAST));
scene.idle(60);
scene.world.showSection(util.select.fromTo(1, 1, 1, 2, 1, 1), Direction.SOUTH);
scene.idle(10);
scene.effects.rotationDirectionIndicator(util.grid.at(1, 1, 1));
scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 1));
scene.idle(20);
scene.overlay.showText(100)
.text("Neighbouring shafts connected like this will rotate in opposite directions")
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.NORTH));
}
public static void largeCogAsRelay(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("large_cogwheel", "Relaying rotational force using Large Cogwheels");
scene.configureBasePlate(1, 1, 5);
scene.world.setBlock(util.grid.at(4, 2, 3), AllBlocks.LARGE_COGWHEEL.getDefaultState()
.with(CogWheelBlock.AXIS, Axis.X), false);
scene.showBasePlate();
scene.idle(5);
scene.world.showSection(util.select.layer(1), Direction.DOWN);
scene.idle(5);
scene.world.showSection(util.select.position(3, 2, 4), Direction.NORTH);
for (int i = 3; i >= 1; i--) {
scene.idle(5);
if (i == 3)
scene.world.showSection(util.select.position(3, 2, 5), Direction.DOWN);
scene.world.showSection(util.select.position(3, 2, i), Direction.DOWN);
}
scene.overlay.showText(70)
.text("Large cogwheels can connect to each other at right angles")
.placeNearTarget()
.pointAt(util.vector.centerOf(3, 1, 4));
scene.idle(70);
scene.world.hideSection(util.select.fromTo(3, 2, 1, 3, 2, 5), Direction.SOUTH);
scene.idle(15);
scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.with(ShaftBlock.AXIS, Axis.X), false);
scene.world.setKineticSpeed(util.select.fromTo(1, 2, 3, 5, 2, 3), 16);
scene.world.showSection(util.select.position(4, 2, 3), Direction.WEST);
for (int i = 3; i >= 1; i--) {
scene.idle(5);
if (i == 3)
scene.world.showSection(util.select.position(5, 2, 3), Direction.DOWN);
scene.world.showSection(util.select.position(i, 2, 3), Direction.DOWN);
}
scene.idle(5);
scene.overlay.showText(90)
.text("It will help relaying conveyed speed to other axes of rotation")
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.WEST));
scene.effects.rotationSpeedIndicator(util.grid.at(3, 1, 3));
scene.effects.rotationSpeedIndicator(util.grid.at(4, 2, 3));
}
public static void cogsSpeedUp(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("cog_speedup", "Gearshifting with Cogs");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN);
scene.idle(10);
BlockPos lowerCog = util.grid.at(3, 1, 2);
BlockPos upperCog = util.grid.at(3, 2, 3);
BlockState largeCogState = AllBlocks.LARGE_COGWHEEL.getDefaultState()
.with(CogWheelBlock.AXIS, Axis.X);
BlockState smallCogState = AllBlocks.COGWHEEL.getDefaultState()
.with(CogWheelBlock.AXIS, Axis.X);
scene.world.setBlock(lowerCog, largeCogState, false);
scene.world.setBlock(upperCog, smallCogState, false);
BlockPos upperShaftEnd = upperCog.west(3);
BlockPos lowerShaftEnd = lowerCog.west(3);
scene.world.setKineticSpeed(util.select.fromTo(upperCog, upperShaftEnd), -64);
scene.world.showSection(util.select.fromTo(lowerCog, upperCog), Direction.EAST);
scene.overlay.showText(60)
.text("Large and Small cogs can be connected diagonally")
.placeNearTarget()
.pointAt(util.vector.blockSurface(upperCog, Direction.WEST));
scene.idle(80);
Selection gaugesSelect = util.select.fromTo(0, 1, 2, 2, 2, 3);
scene.world.showSection(gaugesSelect, Direction.DOWN);
scene.overlay.showText(60)
.text("Shifting from large to small cogs, the conveyed speed will be doubled")
.colored(PonderPalette.GREEN)
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH));
scene.idle(10);
scene.effects.rotationSpeedIndicator(upperCog);
scene.idle(60);
scene.overlay.showText(30)
.sharedText("rpm32")
.colored(PonderPalette.FAST)
.placeNearTarget()
.pointAt(util.vector.blockSurface(upperShaftEnd, Direction.WEST));
scene.idle(5);
scene.overlay.showText(30)
.sharedText("rpm16")
.colored(PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.blockSurface(lowerShaftEnd, Direction.WEST));
scene.idle(45);
scene.world.setKineticSpeed(util.select.fromTo(lowerCog, upperShaftEnd), 0);
ElementLink<WorldSectionElement> cogs =
scene.world.makeSectionIndependent(util.select.fromTo(lowerCog, upperCog));
scene.world.moveSection(cogs, util.vector.of(0, 1, 0), 5);
scene.idle(5);
scene.world.rotateSection(cogs, 180, 0, 0, 10);
scene.idle(10);
scene.world.setBlock(lowerCog, smallCogState, false);
scene.world.setBlock(upperCog, largeCogState, false);
scene.world.rotateSection(cogs, 180, 0, 0, 0);
scene.world.moveSection(cogs, util.vector.of(0, -1, 0), 5);
scene.idle(5);
scene.world.setKineticSpeed(util.select.fromTo(lowerCog, lowerShaftEnd), 32);
scene.world.setKineticSpeed(util.select.fromTo(upperCog, upperShaftEnd), -16);
scene.overlay.showText(80)
.text("Shifting the opposite way, the conveyed speed will be halved")
.colored(PonderPalette.RED)
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH));
scene.idle(10);
scene.effects.rotationSpeedIndicator(upperCog);
scene.idle(80);
scene.overlay.showText(60)
.sharedText("rpm8")
.colored(PonderPalette.SLOW)
.placeNearTarget()
.pointAt(util.vector.blockSurface(upperShaftEnd, Direction.WEST));
scene.idle(5);
scene.overlay.showText(60)
.sharedText("rpm16")
.colored(PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.blockSurface(lowerShaftEnd, Direction.WEST));
scene.idle(40);
}
public static void gearbox(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("gearbox", "Relaying rotational force using Gearboxes");
scene.configureBasePlate(1, 1, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.world.showSection(util.select.fromTo(4, 1, 6, 3, 2, 5), Direction.UP);
scene.idle(10);
BlockPos largeCogBack = util.grid.at(3, 2, 4);
BlockPos largeCogLeft = util.grid.at(4, 2, 3);
BlockPos largeCogFront = util.grid.at(3, 2, 2);
BlockPos largeCogRight = util.grid.at(2, 2, 3);
scene.world.showSection(util.select.position(largeCogBack), Direction.SOUTH);
scene.idle(5);
scene.world.showSection(util.select.position(largeCogLeft), Direction.WEST);
scene.world.showSection(util.select.position(largeCogLeft.east()), Direction.WEST);
scene.world.showSection(util.select.position(largeCogRight), Direction.EAST);
scene.world.showSection(util.select.position(largeCogRight.west()), Direction.EAST);
scene.idle(5);
scene.world.showSection(util.select.position(largeCogFront), Direction.SOUTH);
scene.world.showSection(util.select.position(largeCogFront.north()), Direction.SOUTH);
scene.idle(10);
scene.overlay.showText(80)
.colored(PonderPalette.RED)
.pointAt(util.vector.blockSurface(largeCogRight.west(), Direction.WEST))
.placeNearTarget()
.text("Jumping between axes of rotation can get bulky quickly");
scene.idle(80);
Selection gearbox = util.select.position(3, 2, 3);
scene.world.hideSection(util.select.fromTo(4, 2, 2, 2, 2, 4)
.substract(gearbox), Direction.UP);
scene.idle(20);
BlockState defaultState = AllBlocks.SHAFT.getDefaultState();
BlockState cogState = AllBlocks.COGWHEEL.getDefaultState();
scene.world.setBlock(largeCogBack, defaultState.with(CogWheelBlock.AXIS, Axis.Z), false);
scene.world.setBlock(largeCogFront, defaultState.with(CogWheelBlock.AXIS, Axis.Z), false);
scene.world.setBlock(largeCogRight, defaultState.with(CogWheelBlock.AXIS, Axis.X), false);
scene.world.setBlock(largeCogLeft, defaultState.with(CogWheelBlock.AXIS, Axis.X), false);
scene.world.showSection(util.select.fromTo(4, 2, 2, 2, 2, 4), Direction.DOWN);
scene.idle(20);
scene.overlay.showText(80)
.colored(PonderPalette.GREEN)
.pointAt(util.vector.topOf(3, 2, 3))
.placeNearTarget()
.text("A gearbox is the more compact equivalent of this setup");
scene.idle(90);
scene.world.setBlock(largeCogFront.north(), cogState.with(CogWheelBlock.AXIS, Axis.Z), true);
scene.world.setBlock(largeCogRight.west(), cogState.with(CogWheelBlock.AXIS, Axis.X), true);
scene.idle(10);
scene.effects.rotationDirectionIndicator(largeCogFront.north());
scene.effects.rotationDirectionIndicator(largeCogRight.west());
scene.idle(15);
scene.overlay.showText(60)
.pointAt(util.vector.of(3, 2.5, 3))
.placeNearTarget()
.text("Shafts around corners rotate in mirrored directions");
scene.idle(70);
scene.world.hideSection(util.select.fromTo(1, 2, 3, 2, 2, 3), Direction.WEST);
scene.world.hideSection(util.select.fromTo(4, 2, 3, 5, 2, 3), Direction.EAST);
scene.world.setBlock(largeCogBack.south(), cogState.with(CogWheelBlock.AXIS, Axis.Z), true);
scene.idle(10);
scene.effects.rotationDirectionIndicator(largeCogFront.north());
scene.effects.rotationDirectionIndicator(largeCogBack.south());
scene.idle(15);
scene.overlay.showText(60)
.pointAt(util.vector.centerOf(3, 2, 5))
.placeNearTarget()
.text("Straight connections will be reversed");
}
public static void clutch(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("clutch", "Controlling rotational force using a Clutch");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
BlockPos leverPos = util.grid.at(3, 1, 0);
scene.world.showSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP);
BlockPos gaugePos = util.grid.at(0, 1, 2);
Selection gauge = util.select.position(gaugePos);
scene.world.showSection(gauge, Direction.UP);
scene.world.setKineticSpeed(gauge, 0);
scene.idle(5);
scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN);
scene.idle(10);
for (int i = 4; i >= 1; i--) {
scene.idle(5);
scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN);
}
BlockPos clutch = util.grid.at(3, 1, 2);
scene.world.setKineticSpeed(gauge, 32);
scene.effects.indicateSuccess(gaugePos);
scene.idle(10);
scene.overlay.showText(50)
.text("Clutches will relay rotation in a straight line")
.placeNearTarget()
.pointAt(util.vector.topOf(clutch));
scene.idle(60);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2)));
scene.effects.indicateRedstone(leverPos);
scene.world.setKineticSpeed(util.select.fromTo(0, 1, 2, 2, 1, 2), 0);
scene.idle(10);
scene.idle(10);
scene.overlay.showText(50)
.colored(PonderPalette.RED)
.text("When powered by Redstone, it breaks the connection")
.placeNearTarget()
.pointAt(util.vector.topOf(clutch));
scene.idle(70);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2)));
scene.effects.indicateRedstone(leverPos);
scene.world.setKineticSpeed(util.select.fromTo(0, 1, 2, 2, 1, 2), 32);
scene.effects.indicateSuccess(gaugePos);
}
public static void gearshift(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("gearshift", "Controlling rotational force using a Gearshift");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
BlockPos leverPos = util.grid.at(3, 1, 0);
scene.world.showSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN);
scene.idle(10);
for (int i = 4; i >= 1; i--) {
scene.idle(5);
scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN);
}
BlockPos gearshift = util.grid.at(3, 1, 2);
scene.idle(10);
scene.overlay.showText(50)
.placeNearTarget()
.text("Gearshifts will relay rotation in a straight line")
.pointAt(util.vector.topOf(gearshift));
scene.idle(60);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2)));
scene.effects.indicateRedstone(leverPos);
scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 2, 2, 2), f -> -f);
scene.effects.rotationDirectionIndicator(gearshift.east(2));
scene.effects.rotationDirectionIndicator(gearshift.west(2));
scene.idle(30);
scene.overlay.showText(50)
.colored(PonderPalette.RED)
.placeNearTarget()
.text("When powered by Redstone, it reverses the transmission")
.pointAt(util.vector.topOf(gearshift));
for (int i = 0; i < 3; i++) {
scene.idle(60);
scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2)));
scene.effects.indicateRedstone(leverPos);
scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 2, 2, 2), f -> -f);
scene.effects.rotationDirectionIndicator(gearshift.east(2));
scene.effects.rotationDirectionIndicator(gearshift.west(2));
}
}
public static void creativeMotor(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("creative_motor", "Generating Rotational Force using Creative Motors");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
BlockPos motor = util.grid.at(3, 1, 2);
for (int i = 0; i < 3; i++) {
scene.idle(5);
scene.world.showSection(util.select.position(1 + i, 1, 2), Direction.DOWN);
}
scene.idle(10);
scene.effects.rotationSpeedIndicator(motor);
scene.overlay.showText(50)
.text("Creative motors are a compact and configurable source of Rotational Force")
.placeNearTarget()
.pointAt(util.vector.topOf(motor));
scene.idle(50);
scene.rotateCameraY(90);
scene.idle(20);
Vec3d blockSurface = util.vector.blockSurface(motor, Direction.EAST);
AxisAlignedBB point = new AxisAlignedBB(blockSurface, blockSurface);
AxisAlignedBB expanded = point.grow(1 / 16f, 1 / 5f, 1 / 5f);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 60);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll(), 60);
scene.idle(20);
scene.overlay.showText(50)
.text("Scrolling on the back panel changes the RPM of the motors' rotational output")
.placeNearTarget()
.pointAt(blockSurface);
scene.idle(10);
scene.world.modifyKineticSpeed(util.select.fromTo(1, 1, 2, 3, 1, 2), f -> 4 * f);
scene.idle(50);
scene.effects.rotationSpeedIndicator(motor);
scene.rotateCameraY(-90);
}
public static void waterWheel(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("water_wheel", "Generating Rotational Force using Water Wheels");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.fromTo(4, 1, 1, 4, 3, 3)
.add(util.select.fromTo(3, 1, 3, 3, 2, 3)), Direction.DOWN);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
BlockPos gaugePos = util.grid.at(0, 2, 2);
for (int i = 0; i < 4; i++) {
scene.idle(5);
scene.world.showSection(util.select.fromTo(gaugePos.east(i)
.down(), gaugePos.east(i)), Direction.DOWN);
}
scene.idle(10);
for (int i = 0; i < 3; i++) {
scene.idle(5);
scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN);
}
scene.world.setKineticSpeed(util.select.everywhere(), -12);
scene.effects.indicateSuccess(gaugePos);
for (int i = 0; i < 2; i++) {
scene.idle(5);
scene.world.showSection(util.select.position(3, 2 - i, 1), Direction.DOWN);
}
BlockPos wheel = util.grid.at(3, 2, 2);
scene.effects.rotationSpeedIndicator(wheel);
scene.overlay.showText(50)
.text("Water Wheels draw force from adjacent Water Currents")
.placeNearTarget()
.pointAt(util.vector.topOf(wheel));
scene.idle(50);
AxisAlignedBB bb = new AxisAlignedBB(wheel).grow(.125f, 0, 0);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 1.2, 0)
.contract(0, .75, 0), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 0, 1.2)
.contract(0, 0, .75), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, -1.2, 0)
.contract(0, -.75, 0), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 0, -1.2)
.contract(0, 0, -.75), 80);
scene.idle(5);
scene.overlay.showText(50)
.text("The more faces are powered, the faster the Water Wheel will rotate")
.colored(PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.topOf(wheel));
scene.idle(80);
scene.rotateCameraY(-30);
scene.overlay.showText(70)
.text("The Wheels' blades should be oriented against the flow")
.placeNearTarget()
.pointAt(util.vector.topOf(wheel));
scene.idle(80);
ElementLink<WorldSectionElement> water = scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 1, 3, 3, 1)
.add(util.select.fromTo(3, 3, 2, 3, 3, 3)));
ElementLink<WorldSectionElement> wheelElement = scene.world.makeSectionIndependent(util.select.position(wheel));
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.moveSection(water, util.vector.of(0, 2, -2), 10);
scene.world.moveSection(wheelElement, util.vector.of(0, 1, -1), 10);
scene.idle(10);
scene.world.rotateSection(wheelElement, 0, 180, 0, 5);
scene.idle(10);
scene.world.modifyBlock(wheel, s -> s.with(WaterWheelBlock.HORIZONTAL_FACING, Direction.WEST), false);
scene.world.rotateSection(wheelElement, 0, -180, 0, 0);
scene.idle(1);
scene.world.moveSection(water, util.vector.of(0, -2, 2), 10);
scene.world.moveSection(wheelElement, util.vector.of(0, -1, 1), 10);
scene.idle(10);
scene.world.setKineticSpeed(util.select.everywhere(), -8);
scene.overlay.showText(70)
.colored(PonderPalette.RED)
.text("Facing the opposite way, they will not be as effective")
.placeNearTarget()
.pointAt(util.vector.topOf(wheel));
scene.idle(80);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.moveSection(water, util.vector.of(0, 2, -2), 10);
scene.world.moveSection(wheelElement, util.vector.of(0, 1, -1), 10);
scene.idle(10);
scene.rotateCameraY(30);
scene.world.rotateSection(wheelElement, 0, 180, 0, 5);
scene.idle(10);
scene.world.modifyBlock(wheel, s -> s.with(WaterWheelBlock.HORIZONTAL_FACING, Direction.EAST), false);
scene.world.rotateSection(wheelElement, 0, -180, 0, 0);
scene.idle(1);
scene.world.moveSection(water, util.vector.of(0, -2, 2), 10);
scene.world.moveSection(wheelElement, util.vector.of(0, -1, 1), 10);
scene.idle(10);
scene.world.setKineticSpeed(util.select.everywhere(), -12);
scene.effects.indicateSuccess(gaugePos);
}
public static void handCrank(SceneBuilder scene, SceneBuildingUtil util) {
manualSource(scene, util, true);
}
public static void valveHandle(SceneBuilder scene, SceneBuildingUtil util) {
manualSource(scene, util, false);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(20);
Vec3d centerOf = util.vector.centerOf(2, 2, 2);
scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick()
.withItem(new ItemStack(Items.BLUE_DYE)), 40);
scene.idle(7);
scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES[11].getDefaultState()
.with(ValveHandleBlock.FACING, Direction.UP), true);
scene.idle(10);
scene.overlay.showText(70)
.text("Valve handles can be dyed for aesthetic purposes")
.placeNearTarget()
.pointAt(centerOf);
}
private static void manualSource(SceneBuilder scene, SceneBuildingUtil util, boolean handCrank) {
String name = handCrank ? "Hand Cranks" : "Valve Handles";
scene.title(handCrank ? "hand_crank" : "valve_handle", "Generating Rotational Force using " + name);
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
BlockPos gaugePos = util.grid.at(1, 3, 3);
BlockPos handlePos = util.grid.at(2, 2, 2);
Selection handleSelect = util.select.position(handlePos);
scene.world.showSection(util.select.layersFrom(1)
.substract(handleSelect), Direction.DOWN);
scene.idle(10);
scene.world.showSection(handleSelect, Direction.DOWN);
scene.idle(20);
Vec3d centerOf = util.vector.centerOf(handlePos);
scene.overlay.showText(70)
.text(name + " can be used by players to apply rotational force manually")
.placeNearTarget()
.pointAt(centerOf);
scene.idle(80);
scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40);
scene.idle(7);
scene.world.setKineticSpeed(util.select.everywhere(), handCrank ? 32 : 16);
scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2);
scene.effects.rotationDirectionIndicator(handlePos);
scene.effects.indicateSuccess(gaugePos);
scene.idle(10);
scene.overlay.showText(50)
.text("Hold Right-Click to rotate it Counter-Clockwise")
.placeNearTarget()
.pointAt(centerOf);
scene.idle(70);
scene.overlay.showText(50)
.colored(handCrank ? PonderPalette.MEDIUM : PonderPalette.SLOW)
.text("Its conveyed speed is " + (handCrank ? "relatively high" : "slow and precise"))
.placeNearTarget()
.pointAt(centerOf);
scene.idle(70);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(10);
scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick()
.whileSneaking(), 40);
scene.idle(7);
scene.world.setKineticSpeed(util.select.everywhere(), handCrank ? -32 : -16);
scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2);
scene.effects.rotationDirectionIndicator(handlePos);
scene.effects.indicateSuccess(gaugePos);
scene.idle(10);
scene.overlay.showText(90)
.text("Sneak and Hold Right-Click to rotate it Clockwise")
.placeNearTarget()
.pointAt(centerOf);
scene.idle(90);
}
}

View file

@ -0,0 +1,189 @@
package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.elements.EntityElement;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
public class MovementActorScenes {
public static void psiTransfer(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("portable_storage_interface", "Contraption Storage Exchange");
scene.configureBasePlate(0, 0, 8);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
BlockPos bearing = util.grid.at(5, 1, 2);
scene.world.showSection(util.select.position(bearing), Direction.DOWN);
scene.idle(5);
ElementLink<WorldSectionElement> contraption =
scene.world.showIndependentSection(util.select.fromTo(5, 2, 2, 6, 3, 2), Direction.DOWN);
scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearing));
scene.idle(10);
scene.world.rotateBearing(bearing, 360, 70);
scene.world.rotateSection(contraption, 0, 360, 0, 70);
scene.overlay.showText(60)
.pointAt(util.vector.topOf(bearing.up(2)))
.colored(PonderPalette.RED)
.placeNearTarget()
.text("Inventories on moving contraptions cannot be accessed by players.");
scene.idle(70);
BlockPos psi = util.grid.at(4, 2, 2);
scene.world.showSectionAndMerge(util.select.position(psi), Direction.EAST, contraption);
scene.idle(13);
scene.effects.superGlue(psi, Direction.EAST, true);
scene.overlay.showText(80)
.pointAt(util.vector.topOf(psi))
.colored(PonderPalette.GREEN)
.placeNearTarget()
.text("This component can interact with storage without the need to stop the contraption.");
scene.idle(90);
BlockPos psi2 = psi.west(2);
scene.world.showSection(util.select.position(psi2), Direction.DOWN);
scene.overlay.showSelectionWithText(util.select.position(psi.west()), 50)
.colored(PonderPalette.RED)
.placeNearTarget()
.text("Place a second one with a gap of 1 or 2 blocks inbetween");
scene.idle(55);
scene.world.rotateBearing(bearing, 360, 60);
scene.world.rotateSection(contraption, 0, 360, 0, 60);
scene.idle(20);
scene.overlay.showText(40)
.placeNearTarget()
.pointAt(util.vector.of(3, 3, 2.5))
.text("Whenever they pass by each other, they will engage in a connection");
scene.idle(35);
Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2);
Class<PortableItemInterfaceTileEntity> psiClass = PortableItemInterfaceTileEntity.class;
scene.world.modifyTileNBT(both, psiClass, nbt -> {
nbt.putFloat("Distance", 1);
nbt.putFloat("Timer", 40);
});
scene.idle(20);
scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 3, 2), 80);
scene.idle(10);
scene.overlay.showSelectionWithText(util.select.position(psi2), 70)
.placeNearTarget()
.colored(PonderPalette.GREEN)
.text("While engaged, the stationary interface will represent ALL inventories on the contraption");
scene.idle(80);
BlockPos hopper = util.grid.at(2, 3, 2);
scene.world.showSection(util.select.position(hopper), Direction.DOWN);
scene.overlay.showText(70)
.placeNearTarget()
.pointAt(util.vector.topOf(hopper))
.text("Items can now be inserted...");
ItemStack itemStack = AllItems.COPPER_INGOT.asStack();
Vec3d entitySpawn = util.vector.topOf(hopper.up(3));
ElementLink<EntityElement> entity1 =
scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack);
scene.idle(10);
ElementLink<EntityElement> entity2 =
scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack);
scene.idle(10);
scene.world.modifyEntity(entity1, Entity::remove);
scene.idle(10);
scene.world.modifyEntity(entity2, Entity::remove);
scene.overlay
.showControls(new InputWindowElement(util.vector.topOf(6, 3, 2), Pointing.DOWN).withItem(itemStack), 40);
scene.idle(30);
scene.world.hideSection(util.select.position(hopper), Direction.UP);
scene.idle(15);
BlockPos beltPos = util.grid.at(1, 1, 2);
scene.world.showSection(util.select.fromTo(0, 1, 0, 1, 2, 6), Direction.DOWN);
scene.idle(10);
scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack.copy());
scene.overlay.showText(40)
.placeNearTarget()
.pointAt(util.vector.topOf(beltPos.up()))
.text("...or extracted from the contraption");
scene.idle(15);
scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack);
scene.idle(20);
scene.world.modifyEntities(ItemEntity.class, Entity::remove);
scene.idle(15);
scene.world.modifyEntities(ItemEntity.class, Entity::remove);
scene.overlay.showText(120)
.placeNearTarget()
.pointAt(util.vector.topOf(psi2))
.text("After no items have been exchanged for a while, the contraption will continue on its way");
scene.world.modifyTileNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 9));
scene.idle(15);
scene.markAsFinished();
scene.world.rotateBearing(bearing, 270, 120);
scene.world.rotateSection(contraption, 0, 270, 0, 120);
}
public static void psiRedstone(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("portable_storage_interface_redstone", "Redstone Control");
scene.configureBasePlate(0, 0, 6);
Class<PortableItemInterfaceTileEntity> psiClass = PortableItemInterfaceTileEntity.class;
Selection psis = util.select.fromTo(1, 1, 3, 1, 3, 3);
scene.world.modifyTileNBT(psis, psiClass, nbt -> {
nbt.putFloat("Distance", 1);
nbt.putFloat("Timer", 40);
});
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.layer(1), Direction.DOWN);
scene.idle(5);
ElementLink<WorldSectionElement> contraption =
scene.world.showIndependentSection(util.select.layersFrom(2), Direction.DOWN);
BlockPos bearing = util.grid.at(3, 1, 3);
scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearing));
scene.idle(20);
scene.world.modifyTileNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 9));
scene.idle(20);
scene.world.rotateBearing(bearing, 360 * 3 + 270, 240 + 60);
scene.world.rotateSection(contraption, 0, 360 * 3 + 270, 0, 240 + 60);
scene.idle(20);
scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 1, 1, 1, 2));
scene.effects.indicateRedstone(util.grid.at(1, 1, 1));
scene.idle(10);
scene.overlay.showSelectionWithText(util.select.position(1, 1, 3), 120)
.colored(PonderPalette.RED)
.text("Redstone power will prevent the stationary interface from engaging");
scene.idle(20);
scene.markAsFinished();
}
}

View file

@ -0,0 +1,52 @@
package com.simibubi.create.foundation.ponder.content;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.gui.IScreenRenderable;
import com.simibubi.create.foundation.ponder.PonderRegistry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nonnull;
public class PonderChapter implements IScreenRenderable {
private final String id;
private final ResourceLocation icon;
private PonderChapter(String id) {
this.id = id;
icon = new ResourceLocation(Create.ID, "textures/ponder/chapter/" + id + ".png");
}
@Override
public void draw(AbstractGui screen, int x, int y) {
RenderSystem.pushMatrix();
Minecraft.getInstance().getTextureManager().bindTexture(icon);
RenderSystem.scaled(0.25, 0.25, 1);
//x and y offset, blit z offset, tex x and y, tex width and height, entire tex sheet width and height
AbstractGui.blit(x, y, 0, 0, 0, 64, 64, 64, 64);
RenderSystem.popMatrix();
}
@Nonnull
public static PonderChapter of(String id) {
PonderChapter chapter = PonderRegistry.chapters.getChapter(id);
if (chapter == null) {
chapter = PonderRegistry.chapters.addChapter(new PonderChapter(id));
}
return chapter;
}
public PonderChapter addTagsToChapter(PonderTag... tags) {
for (PonderTag t : tags)
PonderRegistry.tags.add(t, this);
return this;
}
public String getId() {
return id;
}
}

Some files were not shown because too many files have changed in this diff Show more