mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-11-10 20:11:35 +01:00
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:
commit
e943705fb7
214 changed files with 13637 additions and 471 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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!"
|
||||
|
||||
}
|
|
@ -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",
|
|
@ -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",
|
|
@ -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",
|
|
@ -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",
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/gantry_carriage/item"
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/gantry_pinion/item"
|
||||
}
|
|
@ -28,8 +28,8 @@
|
|||
"trigger": "create:bracket_apply",
|
||||
"conditions": {
|
||||
"accepted_entries": [
|
||||
"create:large_cogwheel",
|
||||
"create:cogwheel"
|
||||
"create:cogwheel",
|
||||
"create:large_cogwheel"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
},
|
|
@ -6,7 +6,7 @@
|
|||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "create:gantry_pinion"
|
||||
"name": "create:gantry_carriage"
|
||||
}
|
||||
],
|
||||
"conditions": [
|
|
@ -20,6 +20,6 @@
|
|||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "create:gantry_pinion"
|
||||
"item": "create:gantry_carriage"
|
||||
}
|
||||
}
|
|
@ -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"),
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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)
|
|
@ -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()
|
|
@ -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))
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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> {
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
|
@ -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)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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
Loading…
Reference in a new issue