port recent changes

This commit is contained in:
grimmauld 2021-03-24 14:54:24 +01:00
commit cbbf502003
189 changed files with 6885 additions and 1689 deletions

View file

@ -141,8 +141,13 @@ fc652317e03b57c76e23a805da16a28d15254029 assets/create/blockstates/fancy_scoria_
5864daf839e54789a0dc8a44505f070bf3e184bc assets/create/blockstates/fancy_weathered_limestone_bricks.json 5864daf839e54789a0dc8a44505f070bf3e184bc assets/create/blockstates/fancy_weathered_limestone_bricks.json
fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json
b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json
<<<<<<< HEAD
8e532856c3c2b4e4e59c65a2a81a694e35d14658 assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json 8e532856c3c2b4e4e59c65a2a81a694e35d14658 assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json
65f5fa4b779af5150993b20174404ec93bfc4303 assets/create/blockstates/fluid_pipe.json 65f5fa4b779af5150993b20174404ec93bfc4303 assets/create/blockstates/fluid_pipe.json
=======
6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json
37bc041b7449dc4d7962225e606125ba1b188974 assets/create/blockstates/fluid_pipe.json
>>>>>>> mc1.15/dev
f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json
5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json
e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json
@ -339,7 +344,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json 8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
@ -405,6 +410,7 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
<<<<<<< HEAD
ff55f756f4bf71c142540d1a415a8dbbae86850e assets/create/lang/en_ud.json ff55f756f4bf71c142540d1a415a8dbbae86850e assets/create/lang/en_ud.json
eb8e279de2f546a4e285605f2040b4d69a973567 assets/create/lang/en_us.json eb8e279de2f546a4e285605f2040b4d69a973567 assets/create/lang/en_us.json
75e1aaf752e50a00b9a70769c7e301844e0e091c assets/create/lang/unfinished/de_de.json 75e1aaf752e50a00b9a70769c7e301844e0e091c assets/create/lang/unfinished/de_de.json
@ -425,6 +431,28 @@ b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_windo
1358ff546e99004444fccca5355853d1738ef191 assets/create/models/block/acacia_window_pane_post.json 1358ff546e99004444fccca5355853d1738ef191 assets/create/models/block/acacia_window_pane_post.json
bd33b944ec6ad89850a1d275b3d2843fe6f831cc assets/create/models/block/acacia_window_pane_side.json bd33b944ec6ad89850a1d275b3d2843fe6f831cc assets/create/models/block/acacia_window_pane_side.json
b272035cd746364a0bd3bf13061f51190e9b46d6 assets/create/models/block/acacia_window_pane_side_alt.json b272035cd746364a0bd3bf13061f51190e9b46d6 assets/create/models/block/acacia_window_pane_side_alt.json
=======
2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json
3522bc1dd15fd219aaf506766fb96be5f65b1939 assets/create/lang/en_us.json
d389c171d3d6a7382fb5b2e80b14e9bee53d8179 assets/create/lang/unfinished/de_de.json
b3caab7bb37be53ea93895cbaae2081452cd095e assets/create/lang/unfinished/es_es.json
0039068794faea032b0a39c954f142e2c8e4dfc1 assets/create/lang/unfinished/es_mx.json
1e34083359caea11cf9fdbb3f04a5881ea62a55e assets/create/lang/unfinished/fr_fr.json
c9abd10d296055f56877317a5c7dee14d0e33bf5 assets/create/lang/unfinished/it_it.json
83298d57034c2bb54924dff2d9b5257502ac3b9a assets/create/lang/unfinished/ja_jp.json
2c0e5fbfc813949d973e9f95af9501ed65b80b82 assets/create/lang/unfinished/ko_kr.json
4b3b113e5f9351b741974bc18d13d9d648d38f91 assets/create/lang/unfinished/nl_nl.json
9bddfffdf5349353d37d7003546c94799c6e812d assets/create/lang/unfinished/pt_br.json
5119b6690e8faa7e25450674caebf3c9c53fd54b assets/create/lang/unfinished/ru_ru.json
f11eb922b49753b60894f0dfe8baabe004d13e05 assets/create/lang/unfinished/zh_cn.json
017a9c9cc6f4538c8c497097cbd59f590b4af160 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
7d23c8e4543108f5f53b78ccb4908f7a5bb76c54 assets/create/models/block/acacia_window_pane_post.json
3bdcc6bd616a179ffc22e66307aab538e9bcb75f assets/create/models/block/acacia_window_pane_side.json
7b5b6809e3ef685a497ba15b549d3918aeb6c135 assets/create/models/block/acacia_window_pane_side_alt.json
>>>>>>> mc1.15/dev
8e1e834bab1c09591006a063216e93c832503852 assets/create/models/block/adjustable_chain_gearshift_end_horizontal.json 8e1e834bab1c09591006a063216e93c832503852 assets/create/models/block/adjustable_chain_gearshift_end_horizontal.json
5d3d8b3989b087a5e9177951e9246f27a1838e84 assets/create/models/block/adjustable_chain_gearshift_end_horizontal_powered.json 5d3d8b3989b087a5e9177951e9246f27a1838e84 assets/create/models/block/adjustable_chain_gearshift_end_horizontal_powered.json
0ae6c67468b448f2f05c06f41bb162fafd86846a assets/create/models/block/adjustable_chain_gearshift_end_vertical.json 0ae6c67468b448f2f05c06f41bb162fafd86846a assets/create/models/block/adjustable_chain_gearshift_end_vertical.json

View file

@ -181,9 +181,13 @@
}, },
{ {
"when": { "when": {
"south": "true",
"west": "true",
"east": "false", "east": "false",
"west": "true",
<<<<<<< HEAD
"east": "false",
=======
"south": "true",
>>>>>>> mc1.15/dev
"north": "false" "north": "false"
}, },
"apply": { "apply": {
@ -192,9 +196,13 @@
}, },
{ {
"when": { "when": {
"south": "true",
"west": "false",
"east": "true", "east": "true",
"west": "false",
<<<<<<< HEAD
"east": "true",
=======
"south": "true",
>>>>>>> mc1.15/dev
"north": "false" "north": "false"
}, },
"apply": { "apply": {
@ -203,9 +211,13 @@
}, },
{ {
"when": { "when": {
"south": "false",
"west": "true",
"east": "false", "east": "false",
"west": "true",
<<<<<<< HEAD
"east": "false",
=======
"south": "false",
>>>>>>> mc1.15/dev
"north": "true" "north": "true"
}, },
"apply": { "apply": {
@ -214,9 +226,13 @@
}, },
{ {
"when": { "when": {
"south": "false",
"west": "false",
"east": "true", "east": "true",
"west": "false",
<<<<<<< HEAD
"east": "true",
=======
"south": "false",
>>>>>>> mc1.15/dev
"north": "true" "north": "true"
}, },
"apply": { "apply": {
@ -225,9 +241,13 @@
}, },
{ {
"when": { "when": {
"south": "true",
"west": "false",
"east": "false", "east": "false",
"west": "false",
<<<<<<< HEAD
"east": "false",
=======
"south": "true",
>>>>>>> mc1.15/dev
"north": "true" "north": "true"
}, },
"apply": { "apply": {
@ -236,9 +256,13 @@
}, },
{ {
"when": { "when": {
"south": "true",
"west": "false",
"east": "false", "east": "false",
"west": "false",
<<<<<<< HEAD
"east": "false",
=======
"south": "true",
>>>>>>> mc1.15/dev
"north": "false" "north": "false"
}, },
"apply": { "apply": {
@ -247,9 +271,13 @@
}, },
{ {
"when": { "when": {
"south": "false",
"west": "false",
"east": "false", "east": "false",
"west": "false",
<<<<<<< HEAD
"east": "false",
=======
"south": "false",
>>>>>>> mc1.15/dev
"north": "true" "north": "true"
}, },
"apply": { "apply": {
@ -258,31 +286,13 @@
}, },
{ {
"when": { "when": {
"south": "false",
"west": "true",
"east": "true", "east": "true",
"north": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
}
},
{
"when": {
"south": "false",
"west": "true", "west": "true",
"east": "false", <<<<<<< HEAD
"north": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
}
},
{
"when": {
"south": "false",
"west": "false",
"east": "true", "east": "true",
=======
"south": "false",
>>>>>>> mc1.15/dev
"north": "false" "north": "false"
}, },
"apply": { "apply": {
@ -291,9 +301,43 @@
}, },
{ {
"when": { "when": {
"south": "false",
"west": "false",
"east": "false", "east": "false",
"west": "true",
<<<<<<< HEAD
"east": "false",
=======
"south": "false",
>>>>>>> mc1.15/dev
"north": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
}
},
{
"when": {
"east": "true",
"west": "false",
<<<<<<< HEAD
"east": "true",
=======
"south": "false",
>>>>>>> mc1.15/dev
"north": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
}
},
{
"when": {
"east": "false",
"west": "false",
<<<<<<< HEAD
"east": "false",
=======
"south": "false",
>>>>>>> mc1.15/dev
"north": "false" "north": "false"
}, },
"apply": { "apply": {
@ -302,10 +346,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "true", "up": "true",
"east": "true", "east": "true",
"west": "false", "west": "false",
"down": "false" "down": "false"
=======
"down": "false",
"east": "true",
"west": "false",
"up": "true"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lu_z" "model": "create:block/fluid_pipe/lu_z"
@ -313,10 +364,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "true", "up": "true",
"east": "false", "east": "false",
"west": "true", "west": "true",
"down": "false" "down": "false"
=======
"down": "false",
"east": "false",
"west": "true",
"up": "true"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ru_z" "model": "create:block/fluid_pipe/ru_z"
@ -324,10 +382,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "false", "up": "false",
"east": "true", "east": "true",
"west": "false", "west": "false",
"down": "true" "down": "true"
=======
"down": "true",
"east": "true",
"west": "false",
"up": "false"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ld_z" "model": "create:block/fluid_pipe/ld_z"
@ -335,10 +400,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "false", "up": "false",
"east": "false", "east": "false",
"west": "true", "west": "true",
"down": "true" "down": "true"
=======
"down": "true",
"east": "false",
"west": "true",
"up": "false"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/rd_z" "model": "create:block/fluid_pipe/rd_z"
@ -346,10 +418,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "true", "up": "true",
"east": "false", "east": "false",
"west": "false", "west": "false",
"down": "true" "down": "true"
=======
"down": "true",
"east": "false",
"west": "false",
"up": "true"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_z" "model": "create:block/fluid_pipe/ud_z"
@ -357,10 +436,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "true", "up": "true",
"east": "false", "east": "false",
"west": "false", "west": "false",
"down": "false" "down": "false"
=======
"down": "false",
"east": "false",
"west": "false",
"up": "true"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_z" "model": "create:block/fluid_pipe/ud_z"
@ -368,10 +454,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "false", "up": "false",
"east": "false", "east": "false",
"west": "false", "west": "false",
"down": "true" "down": "true"
=======
"down": "true",
"east": "false",
"west": "false",
"up": "false"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_z" "model": "create:block/fluid_pipe/ud_z"
@ -379,10 +472,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "false", "up": "false",
"east": "true", "east": "true",
"west": "true", "west": "true",
"down": "false" "down": "false"
=======
"down": "false",
"east": "true",
"west": "true",
"up": "false"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_z" "model": "create:block/fluid_pipe/lr_z"
@ -390,10 +490,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "false", "up": "false",
"east": "true", "east": "true",
"west": "false", "west": "false",
"down": "false" "down": "false"
=======
"down": "false",
"east": "true",
"west": "false",
"up": "false"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_z" "model": "create:block/fluid_pipe/lr_z"
@ -401,10 +508,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "false", "up": "false",
"east": "false", "east": "false",
"west": "true", "west": "true",
"down": "false" "down": "false"
=======
"down": "false",
"east": "false",
"west": "true",
"up": "false"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_z" "model": "create:block/fluid_pipe/lr_z"
@ -412,10 +526,17 @@
}, },
{ {
"when": { "when": {
<<<<<<< HEAD
"up": "false", "up": "false",
"east": "false", "east": "false",
"west": "false", "west": "false",
"down": "false" "down": "false"
=======
"down": "false",
"east": "false",
"west": "false",
"up": "false"
>>>>>>> mc1.15/dev
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/none_z" "model": "create:block/fluid_pipe/none_z"

View file

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

View file

@ -1877,6 +1877,17 @@
"create.ponder.analog_lever.text_2": "Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "Processing Items in the Basin",
"create.ponder.basin.text_1": "A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "A number of options are applicable here",
"create.ponder.basin.text_5": "Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1899,12 +1910,18 @@
"create.ponder.belt_directions.text_3": "2. They can connect diagonally", "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_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_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_directions.text_6": "These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "The Brass Funnel", "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_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_2": "Brass Funnels can extract up to a full stack.",
@ -1944,6 +1961,16 @@
"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_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.chain_gearshift.text_6": "12 RPM",
"create.ponder.chute.header": "Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1971,6 +1998,12 @@
"create.ponder.creative_motor.text_1": "Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "Using the Deployer", "create.ponder.deployer.header": "Using the Deployer",
"create.ponder.deployer.text_1": "Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "Right-click the front to give it an Item to use",
@ -2002,6 +2035,19 @@
"create.ponder.deployer_redstone.text_2": "Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "Using Depots",
"create.ponder.depot.text_1": "Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "Air flow of Encased Fans", "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_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_direction.text_2": "Strength and Direction of Flow depends on the Rotational Input",
@ -2042,7 +2088,7 @@
"create.ponder.funnel_intro.text_1": "Funnels are ideal for transferring items from and to inventories.", "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.header": "Redstone control",
"create.ponder.funnel_redstone.text_1": "Redstone power will prevent any funnel from acting.", "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.header": "Direct transfer",
"create.ponder.funnel_transfer.text_1": "Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "Funnels cannot ever transfer between closed inventories directly.",
@ -2128,6 +2174,12 @@
"create.ponder.mechanical_harvester.text_1": "Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "Speed and direction of movement depend on the Rotational Input",
@ -2143,6 +2195,18 @@
"create.ponder.mechanical_plough.text_3": "Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2158,6 +2222,13 @@
"create.ponder.mechanical_saw_processing.text_4": "When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "Processing Items in the Millstone",
"create.ponder.millstone.text_1": "Millstones process items by grinding them",
"create.ponder.millstone.text_2": "They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "Throw or Insert items at the top",
"create.ponder.millstone.text_4": "After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "Piston Extension Poles", "create.ponder.piston_pole.header": "Piston Extension Poles",
"create.ponder.piston_pole.text_1": "Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "The Length of pole added at its back determines the Extension Range",
@ -2243,6 +2314,17 @@
"create.ponder.shaft_casing.header": "Encasing Shafts", "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.shaft_casing.text_1": "Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "..they will attempt to keep themselves upright",
@ -2255,6 +2337,11 @@
"create.ponder.sticker.text_3": "If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "Attaching blocks using Super Glue", "create.ponder.super_glue.header": "Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 1374", "_": "Missing Localizations: 1374",
=======
"_": "Missing Localizations: 1443",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 405", "_": "Missing Localizations: 405",
=======
"_": "Missing Localizations: 474",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1300", "_": "Missing Localizations: 1373",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1878,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1911,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1962,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +1999,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2036,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2089,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2175,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2196,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2223,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2315,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2338,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 1086", "_": "Missing Localizations: 1086",
=======
"_": "Missing Localizations: 1155",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 422", "_": "Missing Localizations: 422",
=======
"_": "Missing Localizations: 491",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 429", "_": "Missing Localizations: 429",
=======
"_": "Missing Localizations: 498",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 475", "_": "Missing Localizations: 475",
=======
"_": "Missing Localizations: 544",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 1573", "_": "Missing Localizations: 1573",
=======
"_": "Missing Localizations: 1642",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"_": "Missing Localizations: 1639", "_": "Missing Localizations: 1639",
=======
"_": "Missing Localizations: 1708",
>>>>>>> mc1.15/dev
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1882,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1915,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1966,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +2003,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2040,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2093,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2179,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2200,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2227,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2319,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2342,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 421", "_": "Missing Localizations: 494",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1878,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1911,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1962,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +1999,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2036,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2089,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2175,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2196,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2223,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2315,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2338,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 419", "_": "Missing Localizations: 492",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1878,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1911,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1962,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +1999,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2036,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2089,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2175,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2196,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2223,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2315,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2338,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 424", "_": "Missing Localizations: 497",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1878,6 +1878,17 @@
"create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output",
"create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again",
"create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin",
"create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing",
"create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them",
"create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet",
"create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here",
"create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below",
"create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing",
"create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients",
"create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin",
"create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items",
"create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing",
"create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle",
"create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at",
@ -1900,12 +1911,18 @@
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", "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_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_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_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks",
"create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", "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_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.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt",
"create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners",
"create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin",
"create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items",
"create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat",
"create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms",
"create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "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_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_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.",
@ -1945,6 +1962,16 @@
"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_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.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM",
"create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward",
"create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction",
"create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides",
"create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings",
"create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them",
"create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day",
@ -1972,6 +1999,12 @@
"create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "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.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output",
"create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels",
"create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively",
"create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other",
"create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed",
"create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well",
"create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer",
"create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions",
"create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use",
@ -2003,6 +2036,19 @@
"create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles",
"create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.depot.header": "UNLOCALIZED: Using Depots",
"create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements",
"create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it",
"create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing",
"create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms",
"create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners",
"create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it",
"create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly",
"create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines",
"create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel",
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "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_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_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input",
@ -2043,7 +2089,7 @@
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "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.header": "UNLOCALIZED: Redstone control",
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", "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.header": "UNLOCALIZED: Direct transfer",
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
@ -2129,6 +2175,12 @@
"create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...",
"create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way",
"create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer",
"create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated",
"create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons",
"create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them",
"create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input",
@ -2144,6 +2196,18 @@
"create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland",
"create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them",
"create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press",
"create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it",
"create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press",
"create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...",
"create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically",
"create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press",
"create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted",
"create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones",
"create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner",
"create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.",
"create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
"create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground",
@ -2159,6 +2223,13 @@
"create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it",
"create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead",
"create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone",
"create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them",
"create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels",
"create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top",
"create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click",
"create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation",
"create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles",
"create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move",
"create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range",
@ -2244,6 +2315,17 @@
"create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "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.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts",
"create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer",
"create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.",
"create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components",
"create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
"create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions",
"create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..",
"create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright",
@ -2256,6 +2338,11 @@
"create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it",
"create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached",
"create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer",
"create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network",
"create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements",
"create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue",
"create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks",
"create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption",

View file

@ -19,7 +19,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
@ -277,7 +276,7 @@ public class AllBlockPartials {
.unCentre(); .unCentre();
return stack; return stack;
}; };
return dispatcher.getMaterial(RenderMaterials.MODELS).getModel(this, referenceState, facing, ms); return dispatcher.getMaterial(RenderMaterials.TRANSFORMED).getModel(this, referenceState, facing, ms);
} }
} }

View file

@ -108,9 +108,7 @@ public class AllShapes {
PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12) PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12)
.add(3, 12, 3, 13, 16, 13) .add(3, 12, 3, 13, 16, 13)
.forDirectional(Direction.UP), .forDirectional(Direction.UP),
CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16) CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16).forDirectional(Direction.DOWN)
.forDirectional(Direction.DOWN)
; ;
@ -144,12 +142,12 @@ public class AllShapes {
.add(2, 0, 2, 14, 2, 14) .add(2, 0, 2, 14, 2, 14)
.build(), .build(),
SPEED_CONTROLLER = shape(0, 0, 0, 16, 4, 16).add(1, 1, 1, 15, 13, 15) SPEED_CONTROLLER = shape(0, 0, 0, 16, 4, 16).add(1, 1, 1, 15, 13, 15)
.add(0, 8, 0, 16, 14, 16).build(), .add(0, 8, 0, 16, 14, 16)
.build(),
HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16) HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16)
.build(), .build(),
HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(), HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(),
CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 16, 16), CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 16, 16), SEAT = cuboid(0, 0, 0, 16, 8, 16),
SEAT = cuboid(0, 0, 0, 16, 8, 16),
SEAT_COLLISION = cuboid(0, 0, 0, 16, 6, 16), SEAT_COLLISION = cuboid(0, 0, 0, 16, 6, 16),
MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.fullCube()).erase(4, 0, 4, 12, 16, 12) MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.fullCube()).erase(4, 0, 4, 12, 16, 12)
.build(), .build(),
@ -172,8 +170,10 @@ public class AllShapes {
GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15) GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15)
.build(), .build(),
MECHANICAL_ARM = shape(2, 0, 2, 14, 10, 14).add(3, 0, 3, 13, 14, 13) MECHANICAL_ARM = shape(2, 0, 2, 14, 10, 14).add(3, 0, 3, 13, 14, 13)
.add(0, 0, 0, 16, 6, 16)
.build(), .build(),
MECHANICAL_ARM_CEILING = shape(2, 6, 2, 14, 16, 14).add(3, 2, 3, 13, 16, 13) MECHANICAL_ARM_CEILING = shape(2, 6, 2, 14, 16, 14).add(3, 2, 3, 13, 16, 13)
.add(0, 10, 0, 16, 16, 16)
.build(), .build(),
CHUTE = shape(1, 8, 1, 15, 16, 15).add(2, 0, 2, 14, 8, 14) CHUTE = shape(1, 8, 1, 15, 16, 15).add(2, 0, 2, 14, 8, 14)
.build(), .build(),

View file

@ -97,6 +97,7 @@ import com.simibubi.create.content.logistics.block.chute.SmartChuteTileEntity;
import com.simibubi.create.content.logistics.block.depot.DepotRenderer; import com.simibubi.create.content.logistics.block.depot.DepotRenderer;
import com.simibubi.create.content.logistics.block.depot.DepotTileEntity; import com.simibubi.create.content.logistics.block.depot.DepotTileEntity;
import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterInstance;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterTileEntity;
import com.simibubi.create.content.logistics.block.funnel.FunnelInstance; import com.simibubi.create.content.logistics.block.funnel.FunnelInstance;
@ -114,8 +115,6 @@ import com.simibubi.create.content.schematics.block.SchematicannonRenderer;
import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity;
import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer;
import com.tterrag.registrate.util.entry.TileEntityEntry; import com.tterrag.registrate.util.entry.TileEntityEntry;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
public class AllTileEntities { public class AllTileEntities {
@ -595,6 +594,7 @@ public class AllTileEntities {
public static final TileEntityEntry<AdjustableRepeaterTileEntity> ADJUSTABLE_REPEATER = Create.registrate() public static final TileEntityEntry<AdjustableRepeaterTileEntity> ADJUSTABLE_REPEATER = Create.registrate()
.tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new) .tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new)
.instance(() -> AdjustableRepeaterInstance::new)
.validBlocks(AllBlocks.ADJUSTABLE_REPEATER) .validBlocks(AllBlocks.ADJUSTABLE_REPEATER)
.renderer(() -> AdjustableRepeaterRenderer::new) .renderer(() -> AdjustableRepeaterRenderer::new)
.register(); .register();
@ -602,6 +602,7 @@ public class AllTileEntities {
public static final TileEntityEntry<AdjustablePulseRepeaterTileEntity> ADJUSTABLE_PULSE_REPEATER = public static final TileEntityEntry<AdjustablePulseRepeaterTileEntity> ADJUSTABLE_PULSE_REPEATER =
Create.registrate() Create.registrate()
.tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new) .tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new)
.instance(() -> AdjustableRepeaterInstance::new)
.validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER) .validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER)
.renderer(() -> AdjustableRepeaterRenderer::new) .renderer(() -> AdjustableRepeaterRenderer::new)
.register(); .register();

View file

@ -14,10 +14,10 @@ public class HalfShaftInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
Direction dir = getShaftDirection(); Direction dir = getShaftDirection();
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, dir); return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir);
} }
protected Direction getShaftDirection() { protected Direction getShaftDirection() {
return lastState.get(BlockStateProperties.FACING); return blockState.get(BlockStateProperties.FACING);
} }
} }

View file

@ -12,6 +12,6 @@ public class HorizontalHalfShaftInstance extends HalfShaftInstance {
@Override @Override
protected Direction getShaftDirection() { protected Direction getShaftDirection() {
return lastState.get(BlockStateProperties.HORIZONTAL_FACING).getOpposite(); return blockState.get(BlockStateProperties.HORIZONTAL_FACING).getOpposite();
} }
} }

View file

@ -5,10 +5,8 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec;
public enum KineticVertexAttributes implements IVertexAttrib { public enum KineticAttributes implements IVertexAttrib {
INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3), INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3),
LIGHT("aLight", CommonAttributes.LIGHT),
NETWORK_COLOR("aNetworkTint", CommonAttributes.RGB),
SPEED("aSpeed", CommonAttributes.FLOAT), SPEED("aSpeed", CommonAttributes.FLOAT),
OFFSET("aOffset", CommonAttributes.FLOAT), OFFSET("aOffset", CommonAttributes.FLOAT),
; ;
@ -16,7 +14,7 @@ public enum KineticVertexAttributes implements IVertexAttrib {
private final String name; private final String name;
private final VertexAttribSpec spec; private final VertexAttribSpec spec;
KineticVertexAttributes(String name, VertexAttribSpec spec) { KineticAttributes(String name, VertexAttribSpec spec) {
this.name = name; this.name = name;
this.spec = spec; this.spec = spec;
} }

View file

@ -1,23 +1,17 @@
package com.simibubi.create.content.contraptions.base; package com.simibubi.create.content.contraptions.base;
import com.simibubi.create.foundation.render.backend.instancing.InstanceData;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.impl.IFlatLight; import com.simibubi.create.foundation.render.backend.instancing.impl.BasicData;
import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3f; import net.minecraft.util.math.vector.Vector3f;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
public class KineticData<D extends KineticData<D>> extends InstanceData implements IFlatLight<D> { public class KineticData extends BasicData {
private float x; private float x;
private float y; private float y;
private float z; private float z;
private byte blockLight;
private byte skyLight;
private byte r;
private byte g;
private byte b;
private float rotationalSpeed; private float rotationalSpeed;
private float rotationOffset; private float rotationOffset;
@ -25,25 +19,25 @@ public class KineticData<D extends KineticData<D>> extends InstanceData implemen
super(owner); super(owner);
} }
public D setTileEntity(KineticTileEntity te) { public KineticData setTileEntity(KineticTileEntity te) {
setPosition(te.getPos()); setPosition(te.getPos());
if (te.hasSource()) { if (te.hasSource()) {
setColor(te.network); setColor(te.network);
}else { }else {
setColor(0xFF, 0xFF, 0x00); setColor(0xFF, 0xFF, 0x00);
} }
return (D) this; return this;
} }
public D setPosition(BlockPos pos) { public KineticData setPosition(BlockPos pos) {
return setPosition(pos.getX(), pos.getY(), pos.getZ()); return setPosition(pos.getX(), pos.getY(), pos.getZ());
} }
public D setPosition(Vector3f pos) { public KineticData setPosition(Vector3f pos) {
return setPosition(pos.getX(), pos.getY(), pos.getZ()); return setPosition(pos.getX(), pos.getY(), pos.getZ());
} }
public D setPosition(int x, int y, int z) { public KineticData setPosition(int x, int y, int z) {
BlockPos origin = owner.renderer.getOriginCoordinate(); BlockPos origin = owner.renderer.getOriginCoordinate();
return setPosition((float) (x - origin.getX()), return setPosition((float) (x - origin.getX()),
@ -51,75 +45,62 @@ public class KineticData<D extends KineticData<D>> extends InstanceData implemen
(float) (z - origin.getZ())); (float) (z - origin.getZ()));
} }
public D setPosition(float x, float y, float z) { public KineticData setPosition(float x, float y, float z) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
return (D) this; return this;
} }
public D nudge(float x, float y, float z) { public KineticData nudge(float x, float y, float z) {
this.x += x; this.x += x;
this.y += y; this.y += y;
this.z += z; this.z += z;
return (D) this; return this;
} }
@Override public KineticData setColor(Long l) {
public D setBlockLight(int blockLight) {
this.blockLight = (byte) ((blockLight & 0xF) << 4);
return (D) this;
}
@Override
public D setSkyLight(int skyLight) {
this.skyLight = (byte) ((skyLight & 0xF) << 4);
return (D) this;
}
public D setColor(Long l) {
if (l != null) if (l != null)
return setColor(l.longValue()); return setColor(l.longValue());
else else {
return setColor(0xFF, 0xFF, 0xFF); setColor(0xFF, 0xFF, 0xFF);
return this;
}
} }
private D setColor(long l) { private KineticData setColor(long l) {
int color = ColorHelper.colorFromLong(l); int color = ColorHelper.colorFromLong(l);
byte r = (byte) ((color >> 16) & 0xFF); byte r = (byte) ((color >> 16) & 0xFF);
byte g = (byte) ((color >> 8) & 0xFF); byte g = (byte) ((color >> 8) & 0xFF);
byte b = (byte) (color & 0xFF); byte b = (byte) (color & 0xFF);
return setColor(r, g, b); setColor(r, g, b);
return this;
} }
public D setColor(int r, int g, int b) { public KineticData setRotationalSpeed(float rotationalSpeed) {
return setColor((byte) r, (byte) g, (byte) b);
}
public D setColor(byte r, byte g, byte b) {
this.r = r;
this.g = g;
this.b = b;
return (D) this;
}
public D setRotationalSpeed(float rotationalSpeed) {
this.rotationalSpeed = rotationalSpeed; this.rotationalSpeed = rotationalSpeed;
return (D) this; return this;
} }
public D setRotationOffset(float rotationOffset) { public KineticData setRotationOffset(float rotationOffset) {
this.rotationOffset = rotationOffset; this.rotationOffset = rotationOffset;
return (D) this; return this;
} }
@Override @Override
public void write(ByteBuffer buf) { public void write(ByteBuffer buf) {
putVec3(buf, x, y, z); super.write(buf);
putVec2(buf, blockLight, skyLight);
putVec3(buf, r, g, b); buf.asFloatBuffer().put(new float[] {
put(buf, rotationalSpeed); x,
put(buf, rotationOffset); y,
z,
rotationalSpeed,
rotationOffset
});
buf.position(buf.position() + 5 * 4);
} }
} }

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.contraptions.base; package com.simibubi.create.content.contraptions.base;
import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.components.actors.ActorData;
import com.simibubi.create.content.contraptions.relays.belt.BeltData; import com.simibubi.create.content.contraptions.relays.belt.BeltData;
import com.simibubi.create.content.logistics.block.FlapData; import com.simibubi.create.content.logistics.block.FlapData;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
@ -10,7 +10,7 @@ public class KineticRenderMaterials {
public static final MaterialType<InstancedModel<RotatingData>> ROTATING = new MaterialType<>(); public static final MaterialType<InstancedModel<RotatingData>> ROTATING = new MaterialType<>();
public static final MaterialType<InstancedModel<BeltData>> BELTS = new MaterialType<>(); public static final MaterialType<InstancedModel<BeltData>> BELTS = new MaterialType<>();
public static final MaterialType<InstancedModel<ContraptionActorData>> ACTORS = new MaterialType<>(); public static final MaterialType<InstancedModel<ActorData>> ACTORS = new MaterialType<>();
public static final MaterialType<InstancedModel<FlapData>> FLAPS = new MaterialType<>(); public static final MaterialType<InstancedModel<FlapData>> FLAPS = new MaterialType<>();
} }

View file

@ -15,27 +15,38 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
} }
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis) { protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis) {
key.getInstance() updateRotation(key, axis, tile.getSpeed());
.setColor(tile.network) }
.setRotationalSpeed(tile.getSpeed())
.setRotationOffset(getRotationOffset(axis)) protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis, float speed) {
.setRotationAxis(axis); updateRotation(key.getInstance(), axis, speed);
}
protected final void updateRotation(RotatingData key, Direction.Axis axis, float speed) {
key.setRotationAxis(axis)
.setRotationOffset(getRotationOffset(axis))
.setRotationalSpeed(speed)
.setColor(tile.network);
}
protected final void updateRotation(RotatingData key, Direction.Axis axis) {
updateRotation(key, axis, tile.getSpeed());
} }
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, float speed, Direction.Axis axis) { protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, float speed, Direction.Axis axis) {
key.getInstance() key.getInstance()
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) .setRotationAxis(axis)
.setSkyLight(world.getLightLevel(LightType.SKY, pos)) .setRotationalSpeed(speed)
.setTileEntity(tile) .setRotationOffset(getRotationOffset(axis))
.setRotationalSpeed(speed) .setTileEntity(tile)
.setRotationOffset(getRotationOffset(axis)) .setSkyLight(world.getLightLevel(LightType.SKY, pos))
.setRotationAxis(axis); .setBlockLight(world.getLightLevel(LightType.BLOCK, pos));
return key; return key;
} }
protected float getRotationOffset(final Direction.Axis axis) { protected float getRotationOffset(final Direction.Axis axis) {
float offset = CogWheelBlock.isLargeCog(lastState) ? 11.25f : 0; float offset = CogWheelBlock.isLargeCog(blockState) ? 11.25f : 0;
double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY()) double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY())
+ ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2; + ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2;
if (d == 0) { if (d == 0) {
@ -50,7 +61,7 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
} }
public Direction.Axis getRotationAxis() { public Direction.Axis getRotationAxis() {
return ((IRotate) lastState.getBlock()).getRotationAxis(lastState); return ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
} }
protected final RenderMaterial<?, InstancedModel<RotatingData>> rotatingMaterial() { protected final RenderMaterial<?, InstancedModel<RotatingData>> rotatingMaterial() {

View file

@ -5,14 +5,14 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec;
public enum RotatingVertexAttributes implements IVertexAttrib { public enum RotatingAttributes implements IVertexAttrib {
AXIS("aAxis", CommonAttributes.NORMAL), AXIS("aAxis", CommonAttributes.NORMAL),
; ;
private final String name; private final String name;
private final VertexAttribSpec spec; private final VertexAttribSpec spec;
RotatingVertexAttributes(String name, VertexAttribSpec spec) { RotatingAttributes(String name, VertexAttribSpec spec) {
this.name = name; this.name = name;
this.spec = spec; this.spec = spec;
} }

View file

@ -2,18 +2,12 @@ package com.simibubi.create.content.contraptions.base;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.vector.Vector3f; import net.minecraft.util.math.vector.Vector3f;
public class RotatingData extends KineticData<RotatingData> { public class RotatingData extends KineticData {
public static VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(KineticVertexAttributes.class)
.addAttributes(RotatingVertexAttributes.class)
.build();
private byte rotationAxisX; private byte rotationAxisX;
private byte rotationAxisY; private byte rotationAxisY;
private byte rotationAxisZ; private byte rotationAxisZ;

View file

@ -3,11 +3,18 @@ package com.simibubi.create.content.contraptions.base;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.BasicAttributes;
import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder;
public class RotatingInstancedModel extends InstancedModel<RotatingData> { public class RotatingModel extends InstancedModel<RotatingData> {
public RotatingInstancedModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) { public static VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(BasicAttributes.class)
.addAttributes(KineticAttributes.class)
.addAttributes(RotatingAttributes.class)
.build();
public RotatingModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
super(renderer, buf); super(renderer, buf);
} }
@ -18,7 +25,7 @@ public class RotatingInstancedModel extends InstancedModel<RotatingData> {
@Override @Override
protected VertexFormat getInstanceFormat() { protected VertexFormat getInstanceFormat() {
return RotatingData.FORMAT; return FORMAT;
} }
} }

View file

@ -10,21 +10,18 @@ import static com.simibubi.create.content.contraptions.base.KineticTileEntityRen
public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntity> { public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntity> {
protected InstanceKey<RotatingData> rotatingModelKey; protected final InstanceKey<RotatingData> rotatingModelKey;
public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) { public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
protected void init() {
Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState);
rotatingModelKey = setup(getModel().createInstance(), tile.getSpeed(), axis); rotatingModelKey = setup(getModel().createInstance(), tile.getSpeed(), axis);
} }
@Override @Override
public void onUpdate() { public void update() {
Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
updateRotation(rotatingModelKey, axis); updateRotation(rotatingModelKey, axis);
} }
@ -39,7 +36,7 @@ public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntit
} }
protected BlockState getRenderedBlockState() { protected BlockState getRenderedBlockState() {
return lastState; return blockState;
} }
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {

View file

@ -1,6 +1,5 @@
package com.simibubi.create.content.contraptions.components.actors; package com.simibubi.create.content.contraptions.components.actors;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstanceData;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -9,11 +8,7 @@ import net.minecraft.util.math.vector.Vector3f;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
public class ContraptionActorData extends InstanceData { public class ActorData extends InstanceData {
public static VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(ActorVertexAttributes.class)
.build();
private float x; private float x;
private float y; private float y;
private float z; private float z;
@ -33,63 +28,63 @@ public class ContraptionActorData extends InstanceData {
private float speed; private float speed;
protected ContraptionActorData(InstancedModel<?> owner) { protected ActorData(InstancedModel<?> owner) {
super(owner); super(owner);
} }
public ContraptionActorData setPosition(BlockPos pos) { public ActorData setPosition(BlockPos pos) {
this.x = pos.getX(); this.x = pos.getX();
this.y = pos.getY(); this.y = pos.getY();
this.z = pos.getZ(); this.z = pos.getZ();
return this; return this;
} }
public ContraptionActorData setBlockLight(int blockLight) { public ActorData setBlockLight(int blockLight) {
this.blockLight = (byte) ((blockLight & 0xF) << 4); this.blockLight = (byte) ((blockLight & 0xF) << 4);
return this; return this;
} }
public ContraptionActorData setSkyLight(int skyLight) { public ActorData setSkyLight(int skyLight) {
this.skyLight = (byte) ((skyLight & 0xF) << 4); this.skyLight = (byte) ((skyLight & 0xF) << 4);
return this; return this;
} }
public ContraptionActorData setRotationOffset(float rotationOffset) { public ActorData setRotationOffset(float rotationOffset) {
this.rotationOffset = rotationOffset; this.rotationOffset = rotationOffset;
return this; return this;
} }
public ContraptionActorData setSpeed(float speed) { public ActorData setSpeed(float speed) {
this.speed = speed; this.speed = speed;
return this; return this;
} }
public ContraptionActorData setRotationAxis(Vector3f axis) { public ActorData setRotationAxis(Vector3f axis) {
setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); setRotationAxis(axis.getX(), axis.getY(), axis.getZ());
return this; return this;
} }
public ContraptionActorData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { public ActorData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) {
this.rotationAxisX = (byte) (rotationAxisX * 127); this.rotationAxisX = (byte) (rotationAxisX * 127);
this.rotationAxisY = (byte) (rotationAxisY * 127); this.rotationAxisY = (byte) (rotationAxisY * 127);
this.rotationAxisZ = (byte) (rotationAxisZ * 127); this.rotationAxisZ = (byte) (rotationAxisZ * 127);
return this; return this;
} }
public ContraptionActorData setRotationCenter(Vector3f axis) { public ActorData setRotationCenter(Vector3f axis) {
setRotationCenter(axis.getX(), axis.getY(), axis.getZ()); setRotationCenter(axis.getX(), axis.getY(), axis.getZ());
return this; return this;
} }
public ContraptionActorData setRotationCenter(float rotationCenterX, float rotationCenterY, float rotationCenterZ) { public ActorData setRotationCenter(float rotationCenterX, float rotationCenterY, float rotationCenterZ) {
this.rotationCenterX = (byte) (rotationCenterX * 127); this.rotationCenterX = (byte) (rotationCenterX * 127);
this.rotationCenterY = (byte) (rotationCenterY * 127); this.rotationCenterY = (byte) (rotationCenterY * 127);
this.rotationCenterZ = (byte) (rotationCenterZ * 127); this.rotationCenterZ = (byte) (rotationCenterZ * 127);
return this; return this;
} }
public ContraptionActorData setLocalRotation(Quaternion q) { public ActorData setLocalRotation(Quaternion q) {
this.qX = q.getX(); this.qX = q.getX();
this.qY = q.getY(); this.qY = q.getY();
this.qZ = q.getZ(); this.qZ = q.getZ();

View file

@ -6,18 +6,22 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRen
import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder;
public class RotatingActorModel extends InstancedModel<ContraptionActorData> { public class ActorModel extends InstancedModel<ActorData> {
public RotatingActorModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) { public static VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(ActorVertexAttributes.class)
.build();
public ActorModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
super(renderer, buf); super(renderer, buf);
} }
@Override @Override
protected VertexFormat getInstanceFormat() { protected VertexFormat getInstanceFormat() {
return ContraptionActorData.FORMAT; return FORMAT;
} }
@Override @Override
protected ContraptionActorData newInstance() { protected ActorData newInstance() {
return new ContraptionActorData(this); return new ActorData(this);
} }
} }

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.actors;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
@ -13,15 +12,15 @@ import net.minecraft.block.BlockState;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Quaternion;
public class DrillActorInstance extends ActorInstance { public class DrillActorInstance extends com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance {
InstanceKey<ContraptionActorData> drillHead; InstanceKey<ActorData> drillHead;
private Direction facing; private Direction facing;
public DrillActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { public DrillActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context); super(modelManager, context);
RenderMaterial<?, InstancedModel<ContraptionActorData>> renderMaterial = modelManager.getActorMaterial(); RenderMaterial<?, InstancedModel<ActorData>> renderMaterial = modelManager.getActorMaterial();
BlockState state = context.state; BlockState state = context.state;
@ -48,11 +47,10 @@ public class DrillActorInstance extends ActorInstance {
} }
@Override @Override
protected void tick() { public void beginFrame() {
drillHead.getInstance().setSpeed(getSpeed(facing)); drillHead.getInstance().setSpeed(getSpeed(facing));
} }
@Override
protected float getSpeed(Direction facing) { protected float getSpeed(Direction facing) {
if (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite())) if (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()))
return context.getAnimationSpeed(); return context.getAnimationSpeed();

View file

@ -1,5 +1,6 @@
package com.simibubi.create.content.contraptions.components.actors; package com.simibubi.create.content.contraptions.components.actors;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance;
@ -7,44 +8,87 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING;
public class HarvesterActorInstance extends ActorInstance { public class HarvesterActorInstance extends ActorInstance {
static double oneOverRadius = 16.0 / 6.5;
static float originOffset = 1 / 16f;
static Vector3d rotOffset = new Vector3d(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f);
InstanceKey<ContraptionActorData> harvester;
InstanceKey<ModelData> harvester;
private Direction facing; private Direction facing;
private float horizontalAngle;
private double rotation;
private double previousRotation;
public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context); super(modelManager, context);
RenderMaterial<?, InstancedModel<ContraptionActorData>> renderMaterial = modelManager.getActorMaterial(); RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.transformMaterial();
BlockState state = context.state; BlockState state = context.state;
facing = state.get(HORIZONTAL_FACING); facing = state.get(HORIZONTAL_FACING);
float originOffset = 1 / 16f;
Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f);
harvester = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance(); harvester = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance();
float horizontalAngle = facing.getHorizontalAngle() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0); horizontalAngle = facing.getHorizontalAngle() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0);
harvester.getInstance() harvester.getInstance()
.setPosition(context.localPos) .setBlockLight(localBlockLight());
.setBlockLight(localBlockLight())
.setRotationOffset(0)
.setRotationCenter(rotOffset)
.setRotationAxis(-1, 0, 0)
.setLocalRotation(new Quaternion(Vector3f.POSITIVE_Y, horizontalAngle, true))
.setSpeed(getSpeed(facing));
} }
@Override @Override
protected void tick() { public void tick() {
harvester.getInstance().setSpeed(getSpeed(facing)); super.tick();
previousRotation = rotation;
if (context.contraption.stalled || VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()))
return;
double arcLength = context.motion.length();
double radians = arcLength * oneOverRadius;
float deg = AngleHelper.deg(radians);
deg = (float) (((int) (deg * 3000)) / 3000);
rotation += deg * 1.25;
rotation %= 360;
}
@Override
public void beginFrame() {
MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(context.localPos)
.centre()
.rotateY(horizontalAngle)
.unCentre()
.translate(rotOffset)
.rotateX(getRotation())
.translateBack(rotOffset);
harvester.getInstance().setTransform(ms);
}
private double getRotation() {
return AngleHelper.angleLerp(AnimationTickHolder.getPartialTicks(), previousRotation, rotation);
} }
} }

View file

@ -20,7 +20,7 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
Direction facing = lastState.get(MechanicalCrafterBlock.HORIZONTAL_FACING); Direction facing = blockState.get(MechanicalCrafterBlock.HORIZONTAL_FACING);
Supplier<MatrixStack> ms = () -> { Supplier<MatrixStack> ms = () -> {
MatrixStack stack = new MatrixStack(); MatrixStack stack = new MatrixStack();
@ -34,6 +34,6 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance {
stacker.unCentre(); stacker.unCentre();
return stack; return stack;
}; };
return rotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, lastState, facing, ms); return rotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState, facing, ms);
} }
} }

View file

@ -37,7 +37,6 @@ import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
public class MechanicalCrafterTileEntity extends KineticTileEntity { public class MechanicalCrafterTileEntity extends KineticTileEntity {
@ -46,7 +45,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
IDLE, ACCEPTING, ASSEMBLING, EXPORTING, WAITING, CRAFTING, INSERTING; IDLE, ACCEPTING, ASSEMBLING, EXPORTING, WAITING, CRAFTING, INSERTING;
} }
static class Inventory extends SmartInventory { public static class Inventory extends SmartInventory {
private MechanicalCrafterTileEntity te; private MechanicalCrafterTileEntity te;
@ -57,11 +56,11 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
whenContentsChanged(slot -> { whenContentsChanged(slot -> {
if (getStackInSlot(slot).isEmpty()) if (getStackInSlot(slot).isEmpty())
return; return;
if(te.phase == Phase.IDLE) if (te.phase == Phase.IDLE)
te.checkCompletedRecipe(false); te.checkCompletedRecipe(false);
}); });
} }
@Override @Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (te.phase != Phase.IDLE) if (te.phase != Phase.IDLE)
@ -70,9 +69,9 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
return stack; return stack;
return super.insertItem(slot, stack, simulate); return super.insertItem(slot, stack, simulate);
} }
} }
protected Inventory inventory; protected Inventory inventory;
protected GroupedItems groupedItems = new GroupedItems(); protected GroupedItems groupedItems = new GroupedItems();
protected ConnectedInput input = new ConnectedInput(); protected ConnectedInput input = new ConnectedInput();
@ -87,13 +86,15 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
private InvManipulationBehaviour inserting; private InvManipulationBehaviour inserting;
private EdgeInteractionBehaviour connectivity; private EdgeInteractionBehaviour connectivity;
private ItemStack scriptedResult = ItemStack.EMPTY;
public MechanicalCrafterTileEntity(TileEntityType<? extends MechanicalCrafterTileEntity> type) { public MechanicalCrafterTileEntity(TileEntityType<? extends MechanicalCrafterTileEntity> type) {
super(type); super(type);
setLazyTickRate(20); setLazyTickRate(20);
phase = Phase.IDLE; phase = Phase.IDLE;
groupedItemsBeforeCraft = new GroupedItems(); groupedItemsBeforeCraft = new GroupedItems();
inventory = new Inventory(this); inventory = new Inventory(this);
// Does not get serialized due to active checking in tick // Does not get serialized due to active checking in tick
wasPoweredBefore = true; wasPoweredBefore = true;
} }
@ -118,7 +119,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
public BlockFace getTargetFace(World world, BlockPos pos, BlockState state) { public BlockFace getTargetFace(World world, BlockPos pos, BlockState state) {
return new BlockFace(pos, MechanicalCrafterBlock.getTargetDirection(state)); return new BlockFace(pos, MechanicalCrafterBlock.getTargetDirection(state));
} }
public Direction getTargetDirection() { public Direction getTargetDirection() {
return MechanicalCrafterBlock.getTargetDirection(getBlockState()); return MechanicalCrafterBlock.getTargetDirection(getBlockState());
} }
@ -140,7 +141,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
compound.putBoolean("Cover", covered); compound.putBoolean("Cover", covered);
super.write(compound, clientPacket); super.write(compound, clientPacket);
if (clientPacket && reRender) { if (clientPacket && reRender) {
compound.putBoolean("Redraw", true); compound.putBoolean("Redraw", true);
reRender = false; reRender = false;
@ -151,7 +152,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) {
Phase phaseBefore = phase; Phase phaseBefore = phase;
GroupedItems before = this.groupedItems; GroupedItems before = this.groupedItems;
inventory.deserializeNBT(compound.getCompound("Inventory")); inventory.deserializeNBT(compound.getCompound("Inventory"));
input.read(compound.getCompound("ConnectedInput")); input.read(compound.getCompound("ConnectedInput"));
groupedItems = GroupedItems.read(compound.getCompound("GroupedItems")); groupedItems = GroupedItems.read(compound.getCompound("GroupedItems"));
@ -164,7 +165,6 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
countDown = compound.getInt("CountDown"); countDown = compound.getInt("CountDown");
covered = compound.getBoolean("Cover"); covered = compound.getBoolean("Cover");
super.fromTag(state, compound, clientPacket); super.fromTag(state, compound, clientPacket);
if (!clientPacket) if (!clientPacket)
return; return;
if (compound.contains("Redraw")) if (compound.contains("Redraw"))
@ -200,10 +200,13 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
if (phase == Phase.ACCEPTING) if (phase == Phase.ACCEPTING)
return; return;
boolean onClient = world.isRemote;
boolean runLogic = !onClient || isVirtual();
if (wasPoweredBefore != world.isBlockPowered(pos)) { if (wasPoweredBefore != world.isBlockPowered(pos)) {
wasPoweredBefore = world.isBlockPowered(pos); wasPoweredBefore = world.isBlockPowered(pos);
if (wasPoweredBefore) { if (wasPoweredBefore) {
if (world.isRemote) if (!runLogic)
return; return;
checkCompletedRecipe(true); checkCompletedRecipe(true);
} }
@ -213,7 +216,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
countDown -= getCountDownSpeed(); countDown -= getCountDownSpeed();
if (countDown < 0) { if (countDown < 0) {
countDown = 0; countDown = 0;
if (world.isRemote) if (!runLogic)
return; return;
if (RecipeGridHandler.getTargetingCrafter(this) != null) { if (RecipeGridHandler.getTargetingCrafter(this) != null) {
phase = Phase.EXPORTING; phase = Phase.EXPORTING;
@ -221,9 +224,11 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
sendData(); sendData();
return; return;
} }
ItemStack result = RecipeGridHandler.tryToApplyRecipe(world, groupedItems);
if (result != null) {
ItemStack result =
isVirtual() ? scriptedResult : RecipeGridHandler.tryToApplyRecipe(world, groupedItems);
if (result != null) {
List<ItemStack> containers = new ArrayList<>(); List<ItemStack> containers = new ArrayList<>();
groupedItems.grid.values() groupedItems.grid.values()
.forEach(stack -> { .forEach(stack -> {
@ -232,6 +237,9 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
.copy()); .copy());
}); });
if (isVirtual())
groupedItemsBeforeCraft = groupedItems;
groupedItems = new GroupedItems(result); groupedItems = new GroupedItems(result);
for (int i = 0; i < containers.size(); i++) { for (int i = 0; i < containers.size(); i++) {
ItemStack stack = containers.get(i); ItemStack stack = containers.get(i);
@ -255,7 +263,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
if (countDown < 0) { if (countDown < 0) {
countDown = 0; countDown = 0;
if (world.isRemote) if (!runLogic)
return; return;
MechanicalCrafterTileEntity targetingCrafter = RecipeGridHandler.getTargetingCrafter(this); MechanicalCrafterTileEntity targetingCrafter = RecipeGridHandler.getTargetingCrafter(this);
@ -278,7 +286,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
if (phase == Phase.CRAFTING) { if (phase == Phase.CRAFTING) {
if (world.isRemote) { if (onClient) {
Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING); Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING);
float progress = countDown / 2000f; float progress = countDown / 2000f;
Vector3d facingVec = Vector3d.of(facing.getDirectionVec()); Vector3d facingVec = Vector3d.of(facing.getDirectionVec());
@ -314,7 +322,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
countDown -= getCountDownSpeed(); countDown -= getCountDownSpeed();
if (countDown < 0) { if (countDown < 0) {
countDown = 0; countDown = 0;
if (world.isRemote) if (!runLogic)
return; return;
tryInsert(); tryInsert();
return; return;
@ -322,7 +330,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
} }
if (phase == Phase.INSERTING) { if (phase == Phase.INSERTING) {
if (!world.isRemote && isTargetingBelt()) if (runLogic && isTargetingBelt())
tryInsert(); tryInsert();
return; return;
} }
@ -359,7 +367,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
stack.setCount(remainder.getCount()); stack.setCount(remainder.getCount());
continue; continue;
} }
inserted.add(pair); inserted.add(pair);
} }
@ -405,7 +413,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
@Override @Override
public void lazyTick() { public void lazyTick() {
super.lazyTick(); super.lazyTick();
if (world.isRemote) if (world.isRemote && !isVirtual())
return; return;
if (phase == Phase.IDLE && craftingItemPresent()) if (phase == Phase.IDLE && craftingItemPresent())
checkCompletedRecipe(false); checkCompletedRecipe(false);
@ -426,7 +434,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
protected void checkCompletedRecipe(boolean poweredStart) { protected void checkCompletedRecipe(boolean poweredStart) {
if (getSpeed() == 0) if (getSpeed() == 0)
return; return;
if (world.isRemote) if (world.isRemote && !isVirtual())
return; return;
List<MechanicalCrafterTileEntity> chain = RecipeGridHandler.getAllCraftersOfChainIf(this, List<MechanicalCrafterTileEntity> chain = RecipeGridHandler.getAllCraftersOfChainIf(this,
poweredStart ? MechanicalCrafterTileEntity::craftingItemPresent poweredStart ? MechanicalCrafterTileEntity::craftingItemPresent
@ -466,11 +474,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
@Override @Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { if (isItemHandlerCap(cap))
if (getBlockState().get(HORIZONTAL_FACING) == side)
return LazyOptional.empty();
return invSupplier.cast(); return invSupplier.cast();
}
return super.getCapability(cap, side); return super.getCapability(cap, side);
} }
@ -490,4 +495,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
return true; return true;
} }
public void setScriptedResult(ItemStack scriptedResult) {
this.scriptedResult = scriptedResult;
}
} }

View file

@ -4,10 +4,10 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
@ -15,35 +15,30 @@ import net.minecraft.block.Block;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
public class HandCrankInstance extends SingleRotatingInstance implements ITickableInstance { public class HandCrankInstance extends SingleRotatingInstance implements IDynamicInstance {
private InstanceKey<ModelData> crank; private InstanceKey<ModelData> crank;
private Direction facing; private Direction facing;
public HandCrankInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) { public HandCrankInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override Block block = blockState.getBlock();
protected void init() {
super.init();
Block block = lastState.getBlock();
AllBlockPartials renderedHandle = null; AllBlockPartials renderedHandle = null;
if (block instanceof HandCrankBlock) if (block instanceof HandCrankBlock)
renderedHandle = ((HandCrankBlock) block).getRenderedHandle(); renderedHandle = ((HandCrankBlock) block).getRenderedHandle();
if (renderedHandle == null) if (renderedHandle == null)
return; return;
facing = lastState.get(BlockStateProperties.FACING); facing = blockState.get(BlockStateProperties.FACING);
InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, lastState, facing.getOpposite()); InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, blockState, facing.getOpposite());
crank = model.createInstance(); crank = model.createInstance();
updateLight(); updateLight();
} }
@Override @Override
public void tick() { public void beginFrame() {
if (crank == null) return; if (crank == null) return;
HandCrankTileEntity crankTile = (HandCrankTileEntity) tile; HandCrankTileEntity crankTile = (HandCrankTileEntity) tile;
@ -58,7 +53,7 @@ public class HandCrankInstance extends SingleRotatingInstance implements ITickab
.rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle) .rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle)
.unCentre(); .unCentre();
crank.getInstance().setTransformNoCopy(ms); crank.getInstance().setTransform(ms);
} }
@Override @Override

View file

@ -37,7 +37,7 @@ public class DeployerActorInstance extends ActorInstance {
public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context); super(modelManager, context);
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.basicMaterial(); RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.transformMaterial();
BlockState state = context.state; BlockState state = context.state;
DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class); DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class);
@ -62,16 +62,16 @@ public class DeployerActorInstance extends ActorInstance {
int blockLight = localBlockLight(); int blockLight = localBlockLight();
shaft.getInstance() shaft.getInstance()
.setBlockLight(blockLight) .setRotationAxis(axis)
.setRotationAxis(axis) .setPosition(context.localPos)
.setPosition(context.localPos); .setBlockLight(blockLight);
pole.getInstance().setBlockLight(blockLight); pole.getInstance().setBlockLight(blockLight);
hand.getInstance().setBlockLight(blockLight); hand.getInstance().setBlockLight(blockLight);
} }
@Override @Override
protected void tick() { public void beginFrame() {
double factor; double factor;
if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) {
factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f;
@ -91,6 +91,23 @@ public class DeployerActorInstance extends ActorInstance {
msr.translate(context.localPos) msr.translate(context.localPos)
.translate(offset); .translate(offset);
DeployerInstance.transformModel(msr, pole, hand, yRot, zRot, zRotPole); transformModel(msr, pole, hand, yRot, zRot, zRotPole);
}
static void transformModel(MatrixStacker msr, InstanceKey<ModelData> pole, InstanceKey<ModelData> hand, float yRot, float zRot, float zRotPole) {
msr.centre();
msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI));
msr.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI));
msr.push();
msr.rotate(Direction.SOUTH, (float) ((zRotPole) / 180 * Math.PI));
msr.unCentre();
pole.getInstance().setTransform(msr.unwrap());
msr.pop();
msr.unCentre();
hand.getInstance().setTransform(msr.unwrap());
} }
} }

View file

@ -1,81 +1,90 @@
package com.simibubi.create.content.contraptions.components.deployer; package com.simibubi.create.content.contraptions.components.deployer;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.OrientedData;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3i;
import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE;
import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING;
public class DeployerInstance extends ShaftInstance implements ITickableInstance { public class DeployerInstance extends ShaftInstance implements IDynamicInstance, ITickableInstance {
DeployerTileEntity tile; final DeployerTileEntity tile;
final Direction facing;
final float yRot;
final float zRot;
final float zRotPole;
Direction facing; protected final InstanceKey<OrientedData> pole;
InstanceKey<ModelData> pole; protected InstanceKey<OrientedData> hand;
AllBlockPartials currentHand; AllBlockPartials currentHand;
InstanceKey<ModelData> hand;
float yRot;
float zRot;
float zRotPole;
float progress = Float.NaN; float progress = Float.NaN;
private boolean newHand = false;
public DeployerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { public DeployerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
}
@Override
protected void init() {
super.init();
this.tile = (DeployerTileEntity) super.tile; this.tile = (DeployerTileEntity) super.tile;
facing = lastState.get(FACING); facing = blockState.get(FACING);
boolean rotatePole = lastState.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; boolean rotatePole = blockState.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z;
yRot = AngleHelper.horizontalAngle(facing); yRot = AngleHelper.horizontalAngle(facing);
zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0;
zRotPole = rotatePole ? 90 : 0; zRotPole = rotatePole ? 90 : 0;
pole = modelManager.basicMaterial().getModel(AllBlockPartials.DEPLOYER_POLE, lastState).createInstance(); pole = RenderMaterials.ORIENTED.get(modelManager).getModel(AllBlockPartials.DEPLOYER_POLE, blockState).createInstance();
updateHandPose(); updateHandPose();
relight(pos, pole.getInstance()); relight(pos, pole.getInstance());
updateRotation(pole, hand, yRot, zRot, zRotPole);
} }
@Override @Override
public void tick() { public void tick() {
newHand = updateHandPose();
}
boolean newHand = updateHandPose(); @Override
public void beginFrame() {
float newProgress = getProgress(AnimationTickHolder.getPartialTicks()); float newProgress = getProgress(AnimationTickHolder.getPartialTicks());
if (!newHand && MathHelper.epsilonEquals(newProgress, progress)) return; if (!newHand && MathHelper.epsilonEquals(newProgress, progress)) return;
progress = newProgress; progress = newProgress;
newHand = false;
MatrixStack ms = new MatrixStack(); float handLength = currentHand == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0
MatrixStacker msr = MatrixStacker.of(ms); : currentHand == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f;
float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f);
Vector3i facingVec = facing.getDirectionVec();
BlockPos blockPos = getFloatingPos();
msr.translate(getFloatingPos()) float x = blockPos.getX() + ((float) facingVec.getX()) * distance;
.translate(getHandOffset()); float y = blockPos.getY() + ((float) facingVec.getY()) * distance;
float z = blockPos.getZ() + ((float) facingVec.getZ()) * distance;
transformModel(msr, pole, hand, yRot, zRot, zRotPole); pole.getInstance().setPosition(x, y, z);
hand.getInstance().setPosition(x, y, z);
} }
@ -102,20 +111,14 @@ public class DeployerInstance extends ShaftInstance implements ITickableInstance
if (hand != null) hand.delete(); if (hand != null) hand.delete();
hand = modelManager.basicMaterial().getModel(currentHand, lastState).createInstance(); hand = RenderMaterials.ORIENTED.get(modelManager).getModel(currentHand, blockState).createInstance();
relight(pos, hand.getInstance()); relight(pos, hand.getInstance());
updateRotation(pole, hand, yRot, zRot, zRotPole);
return true; return true;
} }
protected Vector3d getHandOffset() {
float handLength = tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0
: tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f;
float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f);
return Vector3d.of(facing.getDirectionVec()).scale(distance);
}
private float getProgress(float partialTicks) { private float getProgress(float partialTicks) {
if (tile.state == DeployerTileEntity.State.EXPANDING) if (tile.state == DeployerTileEntity.State.EXPANDING)
return 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; return 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f;
@ -124,20 +127,15 @@ public class DeployerInstance extends ShaftInstance implements ITickableInstance
return 0; return 0;
} }
static void transformModel(MatrixStacker msr, InstanceKey<ModelData> pole, InstanceKey<ModelData> hand, float yRot, float zRot, float zRotPole) { static void updateRotation(InstanceKey<OrientedData> pole, InstanceKey<OrientedData> hand, float yRot, float zRot, float zRotPole) {
msr.centre(); Quaternion q = Direction.SOUTH.getUnitVector().getDegreesQuaternion(zRot);
msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI)); q.multiply(Direction.UP.getUnitVector().getDegreesQuaternion(yRot));
msr.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI));
msr.push(); hand.getInstance().setRotation(q);
msr.rotate(Direction.SOUTH, (float) ((zRotPole) / 180 * Math.PI));
msr.unCentre();
pole.getInstance().setTransform(msr.unwrap());
msr.pop();
msr.unCentre(); q.multiply(Direction.SOUTH.getUnitVector().getDegreesQuaternion(zRotPole));
hand.getInstance().setTransform(msr.unwrap()); pole.getInstance().setRotation(q);
} }
} }

View file

@ -5,7 +5,6 @@ import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.KineticTileInstance;
import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -15,37 +14,27 @@ import static net.minecraft.state.properties.BlockStateProperties.FACING;
public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> { public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
protected InstanceKey<RotatingData> shaft; protected final InstanceKey<RotatingData> shaft;
protected InstanceKey<RotatingData> fan; protected final InstanceKey<RotatingData> fan;
final Direction.Axis axis;
final Direction direction;
public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) { public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override direction = blockState.get(FACING);
protected void init() { axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
final Direction direction = lastState.get(FACING);
final Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState);
InstancedModel<RotatingData> shaftHalf = shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite()); fan = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
InstancedModel<RotatingData> fanInner =
AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite());
shaft = shaftHalf.createInstance(); RotatingData shaftInstance = shaft.getInstance();
shaft.getInstance() shaftInstance.setTileEntity(tile);
.setRotationalSpeed(tile.getSpeed()) updateRotation(shaftInstance, axis);
.setRotationOffset(getRotationOffset(axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setTileEntity(tile);
RotatingData fanInstance = fan.getInstance();
fan = fanInner.createInstance(); fanInstance.setTileEntity(tile);
fan.getInstance() updateRotation(fanInstance, axis, getFanSpeed());
.setRotationalSpeed(getFanSpeed())
.setRotationOffset(getRotationOffset(axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setTileEntity(tile);
updateLight(); updateLight();
} }
@ -60,21 +49,13 @@ public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
} }
@Override @Override
protected void onUpdate() { protected void update() {
Direction.Axis axis = lastState.get(FACING).getAxis();
updateRotation(shaft, axis); updateRotation(shaft, axis);
updateRotation(fan, axis, getFanSpeed());
fan.getInstance()
.setColor(tile.network)
.setRotationalSpeed(getFanSpeed())
.setRotationOffset(getRotationOffset(axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector());
} }
@Override @Override
public void updateLight() { public void updateLight() {
final Direction direction = lastState.get(FACING);
BlockPos behind = pos.offset(direction.getOpposite()); BlockPos behind = pos.offset(direction.getOpposite());
relight(behind, shaft.getInstance()); relight(behind, shaft.getInstance());

View file

@ -1,5 +1,8 @@
package com.simibubi.create.content.contraptions.components.flywheel; package com.simibubi.create.content.contraptions.components.flywheel;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
@ -17,26 +20,24 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Rotation; import net.minecraft.util.Rotation;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import java.util.Collections; public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> implements IDynamicInstance {
import java.util.List;
public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> implements ITickableInstance { protected final Direction facing;
protected final Direction connection;
protected Direction facing;
protected boolean connectedLeft; protected boolean connectedLeft;
protected float connectorAngleMult; protected float connectorAngleMult;
protected Direction connection; protected final InstanceKey<RotatingData> shaft;
protected InstanceKey<RotatingData> shaft; protected final InstanceKey<ModelData> wheel;
protected InstanceKey<ModelData> wheel; protected List<InstanceKey<ModelData>> connectors;
protected InstanceKey<ModelData> upperRotating; protected InstanceKey<ModelData> upperRotating;
protected InstanceKey<ModelData> lowerRotating; protected InstanceKey<ModelData> lowerRotating;
protected InstanceKey<ModelData> upperSliding; protected InstanceKey<ModelData> upperSliding;
protected InstanceKey<ModelData> lowerSliding; protected InstanceKey<ModelData> lowerSliding;
protected List<InstanceKey<ModelData>> connectors;
protected float lastAngle = Float.NaN; protected float lastAngle = Float.NaN;
@ -44,31 +45,28 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
public FlyWheelInstance(InstancedTileRenderer<?> modelManager, FlywheelTileEntity tile) { public FlyWheelInstance(InstancedTileRenderer<?> modelManager, FlywheelTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
protected void init() {
facing = lastState.get(BlockStateProperties.HORIZONTAL_FACING);
Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
shaft = setup(shaftModel().createInstance(), tile.getSpeed(), axis); shaft = setup(shaftModel().createInstance(), tile.getSpeed(), axis);
wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontalModel(modelManager, lastState.rotate(Rotation.CLOCKWISE_90)).createInstance(); wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontalModel(modelManager, blockState.rotate(Rotation.CLOCKWISE_90)).createInstance();
connection = FlywheelBlock.getConnection(lastState); connection = FlywheelBlock.getConnection(blockState);
if (connection != null) { if (connection != null) {
connectedLeft = lastState.get(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT; connectedLeft = blockState.get(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT;
boolean flipAngle = connection.getAxis() == Direction.Axis.X ^ connection.getAxisDirection() == Direction.AxisDirection.NEGATIVE; boolean flipAngle = connection.getAxis() == Direction.Axis.X ^ connection.getAxisDirection() == Direction.AxisDirection.NEGATIVE;
connectorAngleMult = flipAngle ? -1 : 1; connectorAngleMult = flipAngle ? -1 : 1;
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.MODELS); RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, lastState).createInstance(); upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance();
lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, lastState).createInstance(); lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance();
upperSliding = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_SLIDING, lastState).createInstance(); upperSliding = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_SLIDING, blockState).createInstance();
lowerSliding = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_SLIDING, lastState).createInstance(); lowerSliding = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_SLIDING, blockState).createInstance();
connectors = Lists.newArrayList(upperRotating, lowerRotating, upperSliding, lowerSliding); connectors = Lists.newArrayList(upperRotating, lowerRotating, upperSliding, lowerSliding);
} else { } else {
@ -76,11 +74,10 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
} }
updateLight(); updateLight();
firstFrame = true;
} }
@Override @Override
public void tick() { public void beginFrame() {
float partialTicks = AnimationTickHolder.getPartialTicks(); float partialTicks = AnimationTickHolder.getPartialTicks();
@ -127,15 +124,15 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
.rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, facing.getAxis()), AngleHelper.rad(angle)) .rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, facing.getAxis()), AngleHelper.rad(angle))
.unCentre(); .unCentre();
wheel.getInstance().setTransformNoCopy(ms); wheel.getInstance().setTransform(ms);
lastAngle = angle; lastAngle = angle;
firstFrame = false; firstFrame = false;
} }
@Override @Override
protected void onUpdate() { protected void update() {
Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
updateRotation(shaft, axis); updateRotation(shaft, axis);
} }
@ -158,7 +155,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
} }
protected InstancedModel<RotatingData> shaftModel() { protected InstancedModel<RotatingData> shaftModel() {
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, facing.getOpposite()); return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, facing.getOpposite());
} }
protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) { protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) {

View file

@ -19,21 +19,18 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
public EngineInstance(InstancedTileRenderer<?> modelManager, EngineTileEntity tile) { public EngineInstance(InstancedTileRenderer<?> modelManager, EngineTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override Block block = blockState
protected void init() { .getBlock();
Block block = lastState
.getBlock();
if (!(block instanceof EngineBlock)) if (!(block instanceof EngineBlock))
return; return;
EngineBlock engineBlock = (EngineBlock) block; EngineBlock engineBlock = (EngineBlock) block;
AllBlockPartials frame = engineBlock.getFrameModel(); AllBlockPartials frame = engineBlock.getFrameModel();
Direction facing = lastState.get(BlockStateProperties.HORIZONTAL_FACING); Direction facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
this.frame = modelManager.getMaterial(RenderMaterials.MODELS).getModel(frame, lastState).createInstance(); this.frame = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(frame, blockState).createInstance();
float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing)); float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing));
@ -48,7 +45,7 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
.translate(0, 0, -1); .translate(0, 0, -1);
this.frame.getInstance() this.frame.getInstance()
.setTransformNoCopy(ms); .setTransform(ms);
updateLight(); updateLight();
} }

View file

@ -117,7 +117,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
if (world.isRemote && runningTicks == 20) if (world.isRemote && runningTicks == 20)
renderParticles(); renderParticles();
if (!world.isRemote && runningTicks == 20) { if ((!world.isRemote || isVirtual()) && runningTicks == 20) {
if (processingTicks < 0) { if (processingTicks < 0) {
processingTicks = MathHelper.clamp((MathHelper.log2((int) (512 / speed))) * 15 + 1, 1, 512); processingTicks = MathHelper.clamp((MathHelper.log2((int) (512 / speed))) * 15 + 1, 1, 512);
} else { } else {

View file

@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance; import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
@ -14,27 +15,22 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
public class MixerInstance extends ShaftlessCogInstance implements ITickableInstance { public class MixerInstance extends ShaftlessCogInstance implements IDynamicInstance {
private InstanceKey<RotatingData> mixerHead; private final InstanceKey<RotatingData> mixerHead;
private InstanceKey<ModelData> mixerPole; private final InstanceKey<ModelData> mixerPole;
public MixerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { public MixerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
}
@Override mixerHead = rotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState)
protected void init() {
super.init();
mixerHead = rotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, lastState)
.createInstance(); .createInstance();
mixerHead.getInstance() mixerHead.getInstance()
.setRotationAxis(Direction.Axis.Y); .setRotationAxis(Direction.Axis.Y);
mixerPole = modelManager.getMaterial(RenderMaterials.MODELS) mixerPole = modelManager.getMaterial(RenderMaterials.TRANSFORMED)
.getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, lastState) .getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState)
.createInstance(); .createInstance();
@ -47,7 +43,7 @@ public class MixerInstance extends ShaftlessCogInstance implements ITickableInst
} }
@Override @Override
public void tick() { public void beginFrame() {
MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tile; MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tile;
float renderedHeadOffset = getRenderedHeadOffset(mixer); float renderedHeadOffset = getRenderedHeadOffset(mixer);
@ -75,7 +71,7 @@ public class MixerInstance extends ShaftlessCogInstance implements ITickableInst
msr.translate(getFloatingPos()); msr.translate(getFloatingPos());
msr.translate(0, -renderedHeadOffset, 0); msr.translate(0, -renderedHeadOffset, 0);
mixerPole.getInstance().setTransformNoCopy(ms); mixerPole.getInstance().setTransform(ms);
} }
private float getRenderedHeadOffset(MechanicalMixerTileEntity mixer) { private float getRenderedHeadOffset(MechanicalMixerTileEntity mixer) {

View file

@ -121,6 +121,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
public void start(Mode mode) { public void start(Mode mode) {
this.mode = mode; this.mode = mode;
running = true; running = true;
prevRunningTicks = 0;
runningTicks = 0; runningTicks = 0;
pressedItems.clear(); pressedItems.clear();
sendData(); sendData();
@ -204,7 +205,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2) { if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2) {
runningTicks = CYCLE / 2; runningTicks = CYCLE / 2;
// Pause the ticks until a packet is received // Pause the ticks until a packet is received
if (world.isRemote) if (world.isRemote && !isVirtual())
runningTicks = -(CYCLE / 2); runningTicks = -(CYCLE / 2);
} }
} }
@ -343,7 +344,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
return Optional.of(AllTriggers.PRESS_COMPACT); return Optional.of(AllTriggers.PRESS_COMPACT);
} }
enum Mode { public enum Mode {
WORLD(1), BELT(19f / 16f), BASIN(22f / 16f) WORLD(1), BELT(19f / 16f), BASIN(22f / 16f)
; ;

View file

@ -4,36 +4,28 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
public class PressInstance extends ShaftInstance implements ITickableInstance { public class PressInstance extends ShaftInstance implements IDynamicInstance {
private InstanceKey<ModelData> pressHead; private final InstanceKey<ModelData> pressHead;
public PressInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { public PressInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
}
@Override pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance();
protected void init() {
super.init();
pressHead = modelManager.getMaterial(RenderMaterials.MODELS)
.getModel(AllBlockPartials.MECHANICAL_PRESS_HEAD, lastState)
.createInstance();
updateLight(); updateLight();
transformModels((MechanicalPressTileEntity) tile); transformModels((MechanicalPressTileEntity) tile);
} }
@Override @Override
public void tick() { public void beginFrame() {
MechanicalPressTileEntity press = (MechanicalPressTileEntity) tile; MechanicalPressTileEntity press = (MechanicalPressTileEntity) tile;
if (!press.running) if (!press.running)
return; return;
@ -51,7 +43,7 @@ public class PressInstance extends ShaftInstance implements ITickableInstance {
msr.translate(0, -renderedHeadOffset, 0); msr.translate(0, -renderedHeadOffset, 0);
pressHead.getInstance() pressHead.getInstance()
.setTransformNoCopy(ms); .setTransform(ms);
} }
private float getRenderedHeadOffset(MechanicalPressTileEntity press) { private float getRenderedHeadOffset(MechanicalPressTileEntity press) {

View file

@ -19,8 +19,8 @@ public class SawInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
if (lastState.get(FACING).getAxis().isHorizontal()) if (blockState.get(FACING).getAxis().isHorizontal())
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180)); return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180));
else else
return rotatingMaterial().getModel(KineticTileEntityRenderer.KINETIC_TILE, shaft(getRotationAxis())); return rotatingMaterial().getModel(KineticTileEntityRenderer.KINETIC_TILE, shaft(getRotationAxis()));
} }

View file

@ -1,5 +1,14 @@
package com.simibubi.create.content.contraptions.components.saw; package com.simibubi.create.content.contraptions.components.saw;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllTags; import com.simibubi.create.AllTags;
import com.simibubi.create.content.contraptions.components.actors.BlockBreakingKineticTileEntity; import com.simibubi.create.content.contraptions.components.actors.BlockBreakingKineticTileEntity;
@ -42,21 +51,13 @@ import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class SawTileEntity extends BlockBreakingKineticTileEntity { public class SawTileEntity extends BlockBreakingKineticTileEntity {
private static final Object cuttingRecipesKey = new Object(); private static final Object cuttingRecipesKey = new Object();
public static final LazyValue<IRecipeType<?>> woodcuttingRecipeType = new LazyValue<>(() -> Registry.RECIPE_TYPE.getOrDefault(new ResourceLocation("druidcraft", "woodcutting"))); public static final LazyValue<IRecipeType<?>> woodcuttingRecipeType =
new LazyValue<>(() -> Registry.RECIPE_TYPE.getOrDefault(new ResourceLocation("druidcraft", "woodcutting")));
public ProcessingInventory inventory; public ProcessingInventory inventory;
private int recipeIndex; private int recipeIndex;
@ -137,10 +138,14 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
continue; continue;
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE) ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite()); .tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite());
if (tryExportingToBeltFunnel.getCount() != stack.getCount()) { if (tryExportingToBeltFunnel != null) {
inventory.setStackInSlot(slot, tryExportingToBeltFunnel); if (tryExportingToBeltFunnel.getCount() != stack.getCount()) {
notifyUpdate(); inventory.setStackInSlot(slot, tryExportingToBeltFunnel);
return; notifyUpdate();
return;
}
if (!tryExportingToBeltFunnel.isEmpty())
return;
} }
} }
@ -263,19 +268,19 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
private List<? extends IRecipe<?>> getRecipes() { private List<? extends IRecipe<?>> getRecipes() {
/* /*
Predicate<IRecipe<?>> types = AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() * Predicate<IRecipe<?>> types =
? RecipeConditions.isOfType(IRecipeType.STONECUTTING, AllRecipeTypes.CUTTING.getType()) * AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() ?
: RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType()); * RecipeConditions.isOfType(IRecipeType.STONECUTTING,
* AllRecipeTypes.CUTTING.getType()) :
* RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType());
*
*/ */
Predicate<IRecipe<?>> types = RecipeConditions.isOfType( Predicate<IRecipe<?>> types = RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType(),
AllRecipeTypes.CUTTING.getType(),
AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() ? IRecipeType.STONECUTTING : null, AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() ? IRecipeType.STONECUTTING : null,
AllConfigs.SERVER.recipes.allowWoodcuttingOnSaw.get() ? woodcuttingRecipeType.getValue() : null AllConfigs.SERVER.recipes.allowWoodcuttingOnSaw.get() ? woodcuttingRecipeType.getValue() : null);
);
List<IRecipe<?>> startedSearch = RecipeFinder.get(cuttingRecipesKey, world, types); List<IRecipe<?>> startedSearch = RecipeFinder.get(cuttingRecipesKey, world, types);
return startedSearch.stream() return startedSearch.stream()
.filter(RecipeConditions.outputMatchesFilter(filtering)) .filter(RecipeConditions.outputMatchesFilter(filtering))
.filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0))) .filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0)))

View file

@ -110,6 +110,8 @@ public abstract class Contraption {
public List<TileEntity> maybeInstancedTileEntities; public List<TileEntity> maybeInstancedTileEntities;
public List<TileEntity> specialRenderedTileEntities; public List<TileEntity> specialRenderedTileEntities;
protected ContraptionWorld world;
public Contraption() { public Contraption() {
blocks = new HashMap<>(); blocks = new HashMap<>();
storage = new HashMap<>(); storage = new HashMap<>();
@ -127,6 +129,14 @@ public abstract class Contraption {
stabilizedSubContraptions = new HashMap<>(); stabilizedSubContraptions = new HashMap<>();
} }
public ContraptionWorld getContraptionWorld() {
if (world == null) {
world = new ContraptionWorld(entity.world, this);
}
return world;
}
public abstract boolean assemble(World world, BlockPos pos) throws AssemblyException; public abstract boolean assemble(World world, BlockPos pos) throws AssemblyException;
public abstract boolean canBeStabilized(Direction facing, BlockPos localPos); public abstract boolean canBeStabilized(Direction facing, BlockPos localPos);
@ -1062,7 +1072,7 @@ public abstract class Contraption {
GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius); GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius);
GridAlignedBB contraptionBounds = GridAlignedBB.fromAABB(bounds); GridAlignedBB contraptionBounds = GridAlignedBB.from(bounds);
if (axis == Direction.Axis.X) { if (axis == Direction.Axis.X) {
betterBounds.maxX = contraptionBounds.maxX; betterBounds.maxX = contraptionBounds.maxX;
betterBounds.minX = contraptionBounds.minX; betterBounds.minX = contraptionBounds.minX;

View file

@ -69,7 +69,6 @@ public class ContraptionCollider {
Vector3d contraptionPosition = contraptionEntity.getPositionVec(); Vector3d contraptionPosition = contraptionEntity.getPositionVec();
Vector3d contraptionMotion = contraptionPosition.subtract(contraptionEntity.getPrevPositionVec()); Vector3d contraptionMotion = contraptionPosition.subtract(contraptionEntity.getPrevPositionVec());
Vector3d anchorVec = contraptionEntity.getAnchorVec(); Vector3d anchorVec = contraptionEntity.getAnchorVec();
Vector3d centerOfBlock = VecHelper.CENTER_OF_ORIGIN;
ContraptionRotationState rotation = null; ContraptionRotationState rotation = null;
// After death, multiple refs to the client player may show up in the area // After death, multiple refs to the client player may show up in the area
@ -102,19 +101,10 @@ public class ContraptionCollider {
// Transform entity position and motion to local space // Transform entity position and motion to local space
Vector3d entityPosition = entity.getPositionVec(); Vector3d entityPosition = entity.getPositionVec();
AxisAlignedBB entityBounds = entity.getBoundingBox(); AxisAlignedBB entityBounds = entity.getBoundingBox();
Vector3d centerY = new Vector3d(0, entityBounds.getYSize() / 2, 0);
Vector3d motion = entity.getMotion(); Vector3d motion = entity.getMotion();
float yawOffset = rotation.getYawOffset(); float yawOffset = rotation.getYawOffset();
Vector3d position = entityPosition; Vector3d position = getWorldToLocalTranslation(entity, anchorVec, rotationMatrix, yawOffset);
position = position.add(centerY);
position = position.subtract(centerOfBlock);
position = position.subtract(anchorVec);
position = VecHelper.rotate(position, -yawOffset, Axis.Y);
position = rotationMatrix.transform(position);
position = position.add(centerOfBlock);
position = position.subtract(centerY);
position = position.subtract(entityPosition);
// Find all potential block shapes to collide with // Find all potential block shapes to collide with
AxisAlignedBB localBB = entityBounds.offset(position) AxisAlignedBB localBB = entityBounds.offset(position)
@ -263,6 +253,48 @@ public class ContraptionCollider {
} }
public static Vector3d getWorldToLocalTranslation(Entity entity, AbstractContraptionEntity contraptionEntity) {
return getWorldToLocalTranslation(entity, contraptionEntity.getAnchorVec(), contraptionEntity.getRotationState());
}
public static Vector3d getWorldToLocalTranslation(Entity entity, Vector3d anchorVec, ContraptionRotationState rotation) {
return getWorldToLocalTranslation(entity, anchorVec, rotation.asMatrix(), rotation.getYawOffset());
}
public static Vector3d getWorldToLocalTranslation(Entity entity, Vector3d anchorVec, Matrix3d rotationMatrix, float yawOffset) {
Vector3d entityPosition = entity.getPositionVec();
Vector3d centerY = new Vector3d(0, entity.getBoundingBox().getYSize() / 2, 0);
Vector3d position = entityPosition;
position = position.add(centerY);
position = position.subtract(VecHelper.CENTER_OF_ORIGIN);
position = position.subtract(anchorVec);
position = VecHelper.rotate(position, -yawOffset, Axis.Y);
position = rotationMatrix.transform(position);
position = position.add(VecHelper.CENTER_OF_ORIGIN);
position = position.subtract(centerY);
position = position.subtract(entityPosition);
return position;
}
public static Vector3d getWorldToLocalTranslation(Vector3d entity, AbstractContraptionEntity contraptionEntity) {
return getWorldToLocalTranslation(entity, contraptionEntity.getAnchorVec(), contraptionEntity.getRotationState());
}
public static Vector3d getWorldToLocalTranslation(Vector3d inPos, Vector3d anchorVec, ContraptionRotationState rotation) {
return getWorldToLocalTranslation(inPos, anchorVec, rotation.asMatrix(), rotation.getYawOffset());
}
public static Vector3d getWorldToLocalTranslation(Vector3d inPos, Vector3d anchorVec, Matrix3d rotationMatrix, float yawOffset) {
Vector3d position = inPos;
position = position.subtract(VecHelper.CENTER_OF_ORIGIN);
position = position.subtract(anchorVec);
position = VecHelper.rotate(position, -yawOffset, Axis.Y);
position = rotationMatrix.transform(position);
position = position.add(VecHelper.CENTER_OF_ORIGIN);
position = position.subtract(inPos);
return position;
}
/** From Entity#getAllowedMovement **/ /** From Entity#getAllowedMovement **/
static Vector3d getAllowedMovement(Vector3d movement, Entity e) { static Vector3d getAllowedMovement(Vector3d movement, Entity e) {
AxisAlignedBB bb = e.getBoundingBox(); AxisAlignedBB bb = e.getBoundingBox();

View file

@ -1,10 +1,15 @@
package com.simibubi.create.content.contraptions.components.structureMovement; package com.simibubi.create.content.contraptions.components.structureMovement;
import net.minecraft.world.IBlockDisplayReader;
import net.minecraft.world.LightType;
import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption;
import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB;
import com.simibubi.create.foundation.render.backend.light.LightUpdateListener;
import com.simibubi.create.foundation.render.backend.light.LightUpdater;
import com.simibubi.create.foundation.render.backend.light.LightVolume; import com.simibubi.create.foundation.render.backend.light.LightVolume;
public abstract class ContraptionLighter<C extends Contraption> { public abstract class ContraptionLighter<C extends Contraption> implements LightUpdateListener {
protected final C contraption; protected final C contraption;
public final LightVolume lightVolume; public final LightVolume lightVolume;
@ -21,14 +26,8 @@ public abstract class ContraptionLighter<C extends Contraption> {
lightVolume.initialize(contraption.entity.world); lightVolume.initialize(contraption.entity.world);
scheduleRebuild = true; scheduleRebuild = true;
}
protected GridAlignedBB contraptionBoundsToVolume(GridAlignedBB bounds) { startListening();
bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting
bounds.minY = Math.max(bounds.minY, 0);
bounds.maxY = Math.min(bounds.maxY, 255);
return bounds;
} }
public void tick(RenderedContraption owner) { public void tick(RenderedContraption owner) {
@ -39,4 +38,28 @@ public abstract class ContraptionLighter<C extends Contraption> {
} }
public abstract GridAlignedBB getContraptionBounds(); public abstract GridAlignedBB getContraptionBounds();
@Override
public boolean onLightUpdate(IBlockDisplayReader world, LightType type, GridAlignedBB changed) {
lightVolume.notifyLightUpdate(world, type, changed);
return false;
}
@Override
public boolean onLightPacket(IBlockDisplayReader world, int chunkX, int chunkZ) {
lightVolume.notifyLightPacket(world, chunkX, chunkZ);
return false;
}
protected void startListening() {
LightUpdater.getInstance().startListening(bounds, this);
}
protected GridAlignedBB contraptionBoundsToVolume(GridAlignedBB bounds) {
bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting
bounds.minY = Math.max(bounds.minY, 0);
bounds.maxY = Math.min(bounds.maxY, 255);
return bounds;
}
} }

View file

@ -0,0 +1,48 @@
package com.simibubi.create.content.contraptions.components.structureMovement;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.template.Template;
public class ContraptionWorld extends WrappedWorld {
final Contraption contraption;
public ContraptionWorld(World world, Contraption contraption) {
super(world);
this.contraption = contraption;
}
@Override
public BlockState getBlockState(BlockPos pos) {
Template.BlockInfo blockInfo = contraption.getBlocks().get(pos);
if (blockInfo != null)
return blockInfo.state;
return Blocks.AIR.getDefaultState();
}
@Override
public void playSound(PlayerEntity player, double x, double y, double z, SoundEvent soundIn, SoundCategory category, float volume, float pitch) {
Vector3d worldPos = ContraptionCollider.getWorldToLocalTranslation(new Vector3d(x, y, z), this.contraption.entity);
worldPos = worldPos.add(x, y, z);
world.playSound(player, worldPos.x, worldPos.y, worldPos.z, soundIn, category, volume, pitch);
}
@Override
public void playSound(double x, double y, double z, SoundEvent p_184134_7_, SoundCategory p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) {
world.playSound(x, y, z, p_184134_7_, p_184134_8_, p_184134_9_, p_184134_10_, p_184134_11_);
}
}

View file

@ -25,12 +25,14 @@ public class NonStationaryLighter<C extends Contraption> extends ContraptionLigh
if (!contraptionBounds.sameAs(bounds)) { if (!contraptionBounds.sameAs(bounds)) {
lightVolume.move(contraption.entity.world, contraptionBoundsToVolume(contraptionBounds)); lightVolume.move(contraption.entity.world, contraptionBoundsToVolume(contraptionBounds));
bounds = contraptionBounds; bounds = contraptionBounds;
startListening();
} }
} }
@Override @Override
public GridAlignedBB getContraptionBounds() { public GridAlignedBB getContraptionBounds() {
GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds); GridAlignedBB bb = GridAlignedBB.from(contraption.bounds);
bb.translate(contraption.entity.getBlockPos()); bb.translate(contraption.entity.getBlockPos());

View file

@ -12,7 +12,7 @@ public class AnchoredLighter extends ContraptionLighter<Contraption> {
@Override @Override
public GridAlignedBB getContraptionBounds() { public GridAlignedBB getContraptionBounds() {
GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds); GridAlignedBB bb = GridAlignedBB.from(contraption.bounds);
bb.translate(contraption.anchor); bb.translate(contraption.anchor);
return bb; return bb;
} }

View file

@ -114,10 +114,10 @@ public class StickerBlock extends ProperDirectionalBlock implements ITE<StickerT
} }
private void func_226946_a_(Entity p_226946_1_) { private void func_226946_a_(Entity p_226946_1_) {
Vector3d vec3d = p_226946_1_.getMotion(); Vector3d Vector3d = p_226946_1_.getMotion();
if (vec3d.y < 0.0D) { if (Vector3d.y < 0.0D) {
double d0 = p_226946_1_ instanceof LivingEntity ? 1.0D : 0.8D; double d0 = p_226946_1_ instanceof LivingEntity ? 1.0D : 0.8D;
p_226946_1_.setMotion(vec3d.x, -vec3d.y * d0, vec3d.z); p_226946_1_.setMotion(Vector3d.x, -Vector3d.y * d0, Vector3d.z);
} }
} }
@ -146,13 +146,13 @@ public class StickerBlock extends ProperDirectionalBlock implements ITE<StickerT
@Override @Override
public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) { public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) {
if (state.get(FACING) == Direction.UP) { if (state.get(FACING) == Direction.UP) {
Vector3d vec3d = entity.getMotion(); Vector3d Vector3d = entity.getMotion();
world.addParticle( world.addParticle(
new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()).setPos(pos), new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()).setPos(pos),
entity.getX() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), entity.getX() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(),
entity.getY() + 0.1D, entity.getY() + 0.1D,
entity.getZ() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), vec3d.x * -4.0D, entity.getZ() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), Vector3d.x * -4.0D,
1.5D, vec3d.z * -4.0D); 1.5D, Vector3d.z * -4.0D);
return true; return true;
} }
return super.addRunningEffects(state, world, pos, entity); return super.addRunningEffects(state, world, pos, entity);

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ch
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance; import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance;
@ -13,37 +13,39 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.MathHelper;
public class StickerInstance extends TileEntityInstance<StickerTileEntity> implements ITickableInstance { public class StickerInstance extends TileEntityInstance<StickerTileEntity> implements IDynamicInstance {
float lastOffset = Float.NaN; float lastOffset = Float.NaN;
final Direction facing;
final boolean fakeWorld;
final int offset;
private InstanceKey<ModelData> head; private final InstanceKey<ModelData> head;
public StickerInstance(InstancedTileRenderer<?> modelManager, StickerTileEntity tile) { public StickerInstance(InstancedTileRenderer<?> modelManager, StickerTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override head = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.STICKER_HEAD, blockState).createInstance();
protected void init() {
head = modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.STICKER_HEAD, lastState).createInstance(); fakeWorld = tile.getWorld() != Minecraft.getInstance().world;
facing = blockState.get(StickerBlock.FACING);
offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0;
updateLight(); updateLight();
} }
@Override @Override
public void tick() { public void beginFrame() {
lastState = world.getBlockState(pos);
float offset = tile.piston.getValue(AnimationTickHolder.getPartialTicks()); float offset = tile.piston.getValue(AnimationTickHolder.getPartialTicks());
if (tile.getWorld() != Minecraft.getInstance().world) if (fakeWorld)
offset = lastState.get(StickerBlock.EXTENDED) ? 1 : 0; offset = this.offset;
if (Math.abs(offset - lastOffset) < 1e-4) if (MathHelper.epsilonEquals(offset, lastOffset))
return; return;
Direction facing = lastState.get(StickerBlock.FACING);
MatrixStack stack = new MatrixStack(); MatrixStack stack = new MatrixStack();
MatrixStacker.of(stack) MatrixStacker.of(stack)
.translate(getFloatingPos()) .translate(getFloatingPos())
@ -55,7 +57,7 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> imple
.translate(0, (offset * offset) * 4 / 16f, 0); .translate(0, (offset * offset) * 4 / 16f, 0);
head.getInstance() head.getInstance()
.setTransformNoCopy(stack); .setTransform(stack);
lastOffset = offset; lastOffset = offset;
} }

View file

@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
@ -68,6 +69,8 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende
if (isAttachedToBlock() && target == 0 && piston.getChaseTarget() == 1) if (isAttachedToBlock() && target == 0 && piston.getChaseTarget() == 1)
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(false)); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(false));
piston.chase(target, .4f, Chaser.LINEAR); piston.chase(target, .4f, Chaser.LINEAR);
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this));
} }
public boolean isAttachedToBlock() { public boolean isAttachedToBlock() {

View file

@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
@ -17,34 +17,35 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3f; import net.minecraft.util.math.vector.Vector3f;
public class GantryCarriageInstance extends ShaftInstance implements ITickableInstance { public class GantryCarriageInstance extends ShaftInstance implements IDynamicInstance {
private InstanceKey<ModelData> gantryCogs; private final InstanceKey<ModelData> gantryCogs;
final Direction facing;
final Boolean alongFirst;
final Direction.Axis rotationAxis;
final BlockPos visualPos;
public GantryCarriageInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { public GantryCarriageInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
}
@Override gantryCogs = modelManager.getMaterial(RenderMaterials.TRANSFORMED)
protected void init() { .getModel(AllBlockPartials.GANTRY_COGS, blockState)
super.init();
gantryCogs = modelManager.getMaterial(RenderMaterials.MODELS)
.getModel(AllBlockPartials.GANTRY_COGS, lastState)
.createInstance(); .createInstance();
facing = blockState.get(GantryCarriageBlock.FACING);
alongFirst = blockState.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE);
rotationAxis = KineticTileEntityRenderer.getRotationAxisOf(tile);
visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos()
: tile.getPos()
.offset(facing.getOpposite());
updateLight(); updateLight();
} }
@Override @Override
public void tick() { public void beginFrame() {
lastState = tile.getBlockState();
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 = GantryCarriageRenderer.getAngleForTe(tile, visualPos, rotationAxis); float angleForTe = GantryCarriageRenderer.getAngleForTe(tile, visualPos, rotationAxis);
Direction.Axis gantryAxis = Direction.Axis.X; Direction.Axis gantryAxis = Direction.Axis.X;
@ -71,7 +72,7 @@ public class GantryCarriageInstance extends ShaftInstance implements ITickableIn
.translate(0, 9 / 16f, 0) .translate(0, 9 / 16f, 0)
.unCentre(); .unCentre();
gantryCogs.getInstance().setTransformNoCopy(ms); gantryCogs.getInstance().setTransform(ms);
} }
@Override @Override

View file

@ -12,7 +12,7 @@ public class PistonLighter extends ContraptionLighter<PistonContraption> {
@Override @Override
public GridAlignedBB getContraptionBounds() { public GridAlignedBB getContraptionBounds() {
GridAlignedBB bounds = GridAlignedBB.fromAABB(contraption.bounds); GridAlignedBB bounds = GridAlignedBB.from(contraption.bounds);
bounds.translate(contraption.anchor); bounds.translate(contraption.anchor);
int length = contraption.extensionLength; int length = contraption.extensionLength;

View file

@ -15,7 +15,7 @@ public class PulleyLighter extends ContraptionLighter<PulleyContraption> {
@Override @Override
public GridAlignedBB getContraptionBounds() { public GridAlignedBB getContraptionBounds() {
GridAlignedBB bounds = GridAlignedBB.fromAABB(contraption.bounds); GridAlignedBB bounds = GridAlignedBB.from(contraption.bounds);
World world = contraption.entity.world; World world = contraption.entity.world;

View file

@ -1,8 +1,6 @@
package com.simibubi.create.content.contraptions.components.structureMovement.render; package com.simibubi.create.content.contraptions.components.structureMovement.render;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.util.Direction;
import net.minecraft.world.LightType; import net.minecraft.world.LightType;
public abstract class ActorInstance { public abstract class ActorInstance {
@ -14,16 +12,11 @@ public abstract class ActorInstance {
this.context = context; this.context = context;
} }
protected void tick() { } public void tick() { }
protected float getSpeed(Direction facing) { public void beginFrame() { }
if (context.contraption.stalled)
return 0;
return !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()) ? context.getAnimationSpeed() : 0;
}
protected int localBlockLight() { protected int localBlockLight() {
return modelManager.contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos); return modelManager.getContraption().renderWorld.getLightLevel(LightType.BLOCK, context.localPos);
} }
} }

View file

@ -5,7 +5,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec;
public enum ContraptionVertexAttributes implements IVertexAttrib { public enum ContraptionAttributes implements IVertexAttrib {
VERTEX_POSITION("aPos", CommonAttributes.VEC3), VERTEX_POSITION("aPos", CommonAttributes.VEC3),
NORMAL("aNormal", CommonAttributes.NORMAL), NORMAL("aNormal", CommonAttributes.NORMAL),
TEXTURE("aTexCoords", CommonAttributes.UV), TEXTURE("aTexCoords", CommonAttributes.UV),
@ -16,7 +16,7 @@ public enum ContraptionVertexAttributes implements IVertexAttrib {
private final String name; private final String name;
private final VertexAttribSpec spec; private final VertexAttribSpec spec;
ContraptionVertexAttributes(String name, VertexAttribSpec spec) { ContraptionAttributes(String name, VertexAttribSpec spec) {
this.name = name; this.name = name;
this.spec = spec; this.spec = spec;
} }

View file

@ -2,63 +2,71 @@ package com.simibubi.create.content.contraptions.components.structureMovement.re
import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.AllMovementBehaviours;
import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials;
import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.base.RotatingModel;
import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.components.actors.ActorData;
import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; import com.simibubi.create.content.contraptions.components.actors.ActorModel;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel;
import com.simibubi.create.content.logistics.block.FlapInstancedModel; import com.simibubi.create.content.logistics.block.FlapModel;
import com.simibubi.create.foundation.render.AllProgramSpecs; import com.simibubi.create.foundation.render.AllProgramSpecs;
import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial;
import com.simibubi.create.foundation.render.backend.instancing.impl.BasicInstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.impl.OrientedModel;
import com.simibubi.create.foundation.render.backend.instancing.impl.TransformedModel;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.gen.feature.template.Template; import net.minecraft.world.gen.feature.template.Template;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
public class ContraptionKineticRenderer extends InstancedTileRenderer<ContraptionProgram> { public class ContraptionKineticRenderer extends InstancedTileRenderer<ContraptionProgram> {
protected ArrayList<ActorInstance> actors = new ArrayList<>(); protected ArrayList<com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance> actors = new ArrayList<>();
public final RenderedContraption contraption; private final WeakReference<RenderedContraption> contraption;
ContraptionKineticRenderer(RenderedContraption contraption) { ContraptionKineticRenderer(RenderedContraption contraption) {
this.contraption = contraption; this.contraption = new WeakReference<>(contraption);
} }
@Override @Override
public void registerMaterials() { public void registerMaterials() {
materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, BasicInstancedModel::new)); materials.put(RenderMaterials.TRANSFORMED, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, TransformedModel::new));
materials.put(RenderMaterials.ORIENTED, new RenderMaterial<>(this, AllProgramSpecs.C_ORIENTED, OrientedModel::new));
materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.C_BELT, BeltInstancedModel::new)); materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.C_BELT, BeltInstancedModel::new));
materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.C_ROTATING, RotatingInstancedModel::new)); materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.C_ROTATING, RotatingModel::new));
materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.C_FLAPS, FlapInstancedModel::new)); materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.C_FLAPS, FlapModel::new));
materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(this, AllProgramSpecs.C_ACTOR, RotatingActorModel::new)); materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(this, AllProgramSpecs.C_ACTOR, ActorModel::new));
} }
@Override
public void tick() {
actors.forEach(com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance::tick);
}
@Override @Override
public void beginFrame(double cameraX, double cameraY, double cameraZ) { public void beginFrame(double cameraX, double cameraY, double cameraZ) {
super.beginFrame(cameraX, cameraY, cameraZ); super.beginFrame(cameraX, cameraY, cameraZ);
actors.forEach(ActorInstance::tick); actors.forEach(com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance::beginFrame);
} }
@Nullable @Nullable
public ActorInstance createActor(Pair<Template.BlockInfo, MovementContext> actor) { public com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance createActor(Pair<Template.BlockInfo, MovementContext> actor) {
Template.BlockInfo blockInfo = actor.getLeft(); Template.BlockInfo blockInfo = actor.getLeft();
MovementContext context = actor.getRight(); MovementContext context = actor.getRight();
MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state);
if (movementBehaviour != null && movementBehaviour.hasSpecialInstancedRendering()) { if (movementBehaviour != null && movementBehaviour.hasSpecialInstancedRendering()) {
ActorInstance instance = movementBehaviour.createInstance(this, context); com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance instance = movementBehaviour.createInstance(this, context);
actors.add(instance); actors.add(instance);
@ -68,10 +76,14 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer<Contraptio
return null; return null;
} }
public RenderMaterial<?, InstancedModel<ContraptionActorData>> getActorMaterial() { public RenderMaterial<?, InstancedModel<ActorData>> getActorMaterial() {
return getMaterial(KineticRenderMaterials.ACTORS); return getMaterial(KineticRenderMaterials.ACTORS);
} }
public RenderedContraption getContraption() {
return contraption.get();
}
@Override @Override
public BlockPos getOriginCoordinate() { public BlockPos getOriginCoordinate() {
return BlockPos.ZERO; return BlockPos.ZERO;

View file

@ -13,7 +13,7 @@ import java.nio.ByteBuffer;
public class ContraptionModel extends BufferedModel { public class ContraptionModel extends BufferedModel {
public static final VertexFormat FORMAT = VertexFormat.builder() public static final VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(ContraptionVertexAttributes.class) .addAttributes(ContraptionAttributes.class)
.build(); .build();
protected GlPrimitiveType eboIndexType; protected GlPrimitiveType eboIndexType;

View file

@ -1,5 +1,13 @@
package com.simibubi.create.content.contraptions.components.structureMovement.render; package com.simibubi.create.content.contraptions.components.structureMovement.render;
import java.util.List;
import java.util.Random;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.world.IBlockDisplayReader;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.*;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.AllMovementBehaviours;
import com.simibubi.create.CreateClient; import com.simibubi.create.CreateClient;
@ -7,48 +15,44 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.foundation.render.*; import com.simibubi.create.foundation.render.AllProgramSpecs;
import com.simibubi.create.foundation.render.Compartment;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.render.SuperByteBufferCache;
import com.simibubi.create.foundation.render.TileEntityRenderHelper;
import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.Backend;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.BlockModelRenderer;
import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.SectionPos;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.world.IBlockDisplayReader;
import net.minecraft.world.LightType; import net.minecraft.world.LightType;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.gen.feature.template.Template; import net.minecraft.world.gen.feature.template.Template;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL40;
import java.util.List;
import java.util.Random;
public class ContraptionRenderDispatcher { public class ContraptionRenderDispatcher {
public static final Int2ObjectMap<RenderedContraption> renderers = new Int2ObjectOpenHashMap<>(); public static final Int2ObjectMap<RenderedContraption> renderers = new Int2ObjectOpenHashMap<>();
public static final Compartment<Pair<Contraption, Integer>> CONTRAPTION = new Compartment<>(); public static final Compartment<Pair<Contraption, Integer>> CONTRAPTION = new Compartment<>();
protected static PlacementSimulationWorld renderWorld; protected static PlacementSimulationWorld renderWorld;
public static void notifyLightUpdate(IBlockDisplayReader world, LightType type, SectionPos pos) {
for (RenderedContraption renderer : renderers.values()) {
renderer.getLighter().lightVolume.notifyLightUpdate(world, type, pos);
}
}
public static void notifyLightPacket(IBlockDisplayReader world, int chunkX, int chunkZ) { public static void notifyLightPacket(IBlockDisplayReader world, int chunkX, int chunkZ) {
for (RenderedContraption renderer : renderers.values()) { for (RenderedContraption renderer : renderers.values()) {
renderer.getLighter().lightVolume.notifyLightPacket(world, chunkX, chunkZ); renderer.getLighter().lightVolume.notifyLightPacket(world, chunkX, chunkZ);
@ -56,7 +60,7 @@ public class ContraptionRenderDispatcher {
} }
public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal,
IRenderTypeBuffer buffer) { IRenderTypeBuffer buffer) {
PlacementSimulationWorld renderWorld = null; PlacementSimulationWorld renderWorld = null;
if (Backend.canUseVBOs()) { if (Backend.canUseVBOs()) {
RenderedContraption renderer = getRenderer(world, c); RenderedContraption renderer = getRenderer(world, c);
@ -68,8 +72,12 @@ public class ContraptionRenderDispatcher {
} }
public static void tick() { public static void tick() {
if (Minecraft.getInstance().isGamePaused()) return;
for (RenderedContraption contraption : renderers.values()) { for (RenderedContraption contraption : renderers.values()) {
contraption.getLighter().tick(contraption); contraption.getLighter().tick(contraption);
contraption.kinetics.tick();
} }
} }
@ -157,7 +165,7 @@ public class ContraptionRenderDispatcher {
} }
public static void renderStructure(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, public static void renderStructure(World world, Contraption c, MatrixStack ms, MatrixStack msLocal,
IRenderTypeBuffer buffer) { IRenderTypeBuffer buffer) {
SuperByteBufferCache bufferCache = CreateClient.bufferCache; SuperByteBufferCache bufferCache = CreateClient.bufferCache;
List<RenderType> blockLayers = RenderType.getBlockLayers(); List<RenderType> blockLayers = RenderType.getBlockLayers();
@ -187,17 +195,19 @@ public class ContraptionRenderDispatcher {
ForgeHooksClient.setRenderLayer(layer); ForgeHooksClient.setRenderLayer(layer);
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
BlockRendererDispatcher dispatcher = Minecraft.getInstance() BlockRendererDispatcher dispatcher = Minecraft.getInstance()
.getBlockRendererDispatcher(); .getBlockRendererDispatcher();
BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer();
Random random = new Random(); Random random = new Random();
BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize());
builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
renderWorld.setTileEntities(c.presentTileEntities.values()); renderWorld.setTileEntities(c.presentTileEntities.values());
for (Template.BlockInfo info : c.getBlocks().values()) for (Template.BlockInfo info : c.getBlocks()
.values())
renderWorld.setBlockState(info.pos, info.state); renderWorld.setBlockState(info.pos, info.state);
for (Template.BlockInfo info : c.getBlocks().values()) { for (Template.BlockInfo info : c.getBlocks()
.values()) {
BlockState state = info.state; BlockState state = info.state;
if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED)
@ -209,7 +219,7 @@ public class ContraptionRenderDispatcher {
ms.push(); ms.push();
ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ()); ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ());
blockRenderer.renderModel(renderWorld, originalModel, state, info.pos, ms, builder, true, random, 42, blockRenderer.renderModel(renderWorld, originalModel, state, info.pos, ms, builder, true, random, 42,
OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE);
ms.pop(); ms.pop();
} }
@ -232,7 +242,7 @@ public class ContraptionRenderDispatcher {
for (MatrixStack m : matrixStacks) { for (MatrixStack m : matrixStacks) {
m.push(); m.push();
MatrixStacker.of(m) MatrixStacker.of(m)
.translate(blockInfo.pos); .translate(blockInfo.pos);
} }
MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state);

View file

@ -1,5 +1,12 @@
package com.simibubi.create.content.contraptions.components.structureMovement.render; package com.simibubi.create.content.contraptions.components.structureMovement.render;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;

View file

@ -106,10 +106,10 @@ public class MinecartSim2020 {
} }
Pair<Vector3i, Vector3i> pair = MATRIX.get(railshape); Pair<Vector3i, Vector3i> pair = MATRIX.get(railshape);
Vector3i vec3i = pair.getFirst(); Vector3i Vector3i = pair.getFirst();
Vector3i vec3i1 = pair.getSecond(); Vector3i Vector3i1 = pair.getSecond();
double d4 = (double) (vec3i1.getX() - vec3i.getX()); double d4 = (double) (Vector3i1.getX() - Vector3i.getX());
double d5 = (double) (vec3i1.getZ() - vec3i.getZ()); double d5 = (double) (Vector3i1.getZ() - Vector3i.getZ());
// double d6 = Math.sqrt(d4 * d4 + d5 * d5); // double d6 = Math.sqrt(d4 * d4 + d5 * d5);
double d7 = forcedMovement.x * d4 + forcedMovement.z * d5; double d7 = forcedMovement.x * d4 + forcedMovement.z * d5;
if (d7 < 0.0D) { if (d7 < 0.0D) {
@ -117,10 +117,10 @@ public class MinecartSim2020 {
d5 = -d5; d5 = -d5;
} }
double d23 = (double) cartPos.getX() + 0.5D + (double) vec3i.getX() * 0.5D; double d23 = (double) cartPos.getX() + 0.5D + (double) Vector3i.getX() * 0.5D;
double d10 = (double) cartPos.getZ() + 0.5D + (double) vec3i.getZ() * 0.5D; double d10 = (double) cartPos.getZ() + 0.5D + (double) Vector3i.getZ() * 0.5D;
double d12 = (double) cartPos.getX() + 0.5D + (double) vec3i1.getX() * 0.5D; double d12 = (double) cartPos.getX() + 0.5D + (double) Vector3i1.getX() * 0.5D;
double d13 = (double) cartPos.getZ() + 0.5D + (double) vec3i1.getZ() * 0.5D; double d13 = (double) cartPos.getZ() + 0.5D + (double) Vector3i1.getZ() * 0.5D;
d4 = d12 - d23; d4 = d12 - d23;
d5 = d13 - d10; d5 = d13 - d10;
double d14; double d14;
@ -145,12 +145,12 @@ public class MinecartSim2020 {
y = cart.getY(); y = cart.getY();
z = cart.getZ(); z = cart.getZ();
if (vec3i.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == vec3i.getX() if (Vector3i.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == Vector3i.getX()
&& MathHelper.floor(z) - cartPos.getZ() == vec3i.getZ()) { && MathHelper.floor(z) - cartPos.getZ() == Vector3i.getZ()) {
cart.setPosition(x, y + (double) vec3i.getY(), z); cart.setPosition(x, y + (double) Vector3i.getY(), z);
} else if (vec3i1.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == vec3i1.getX() } else if (Vector3i1.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == Vector3i1.getX()
&& MathHelper.floor(z) - cartPos.getZ() == vec3i1.getZ()) { && MathHelper.floor(z) - cartPos.getZ() == Vector3i1.getZ()) {
cart.setPosition(x, y + (double) vec3i1.getY(), z); cart.setPosition(x, y + (double) Vector3i1.getY(), z);
} }
x = cart.getX(); x = cart.getX();

View file

@ -100,7 +100,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
} }
boolean onClient = world.isRemote && !isVirtual(); boolean onClient = world.isRemote && !isVirtual();
if (processingTicks > 0) { if (processingTicks > 0) {
heldItem.prevBeltPosition = .5f; heldItem.prevBeltPosition = .5f;
boolean wasAtBeginning = processingTicks == FILLING_TIME; boolean wasAtBeginning = processingTicks == FILLING_TIME;
@ -130,13 +130,17 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE) ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(heldItem.stack, side.getOpposite()); .tryExportingToBeltFunnel(heldItem.stack, side.getOpposite());
if (tryExportingToBeltFunnel.getCount() != heldItem.stack.getCount()) { if (tryExportingToBeltFunnel != null) {
if (tryExportingToBeltFunnel.isEmpty()) if (tryExportingToBeltFunnel.getCount() != heldItem.stack.getCount()) {
heldItem = null; if (tryExportingToBeltFunnel.isEmpty())
else heldItem = null;
heldItem.stack = tryExportingToBeltFunnel; else
notifyUpdate(); heldItem.stack = tryExportingToBeltFunnel;
return; notifyUpdate();
return;
}
if (!tryExportingToBeltFunnel.isEmpty())
return;
} }
BlockPos nextPosition = pos.offset(side); BlockPos nextPosition = pos.offset(side);

View file

@ -5,7 +5,7 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
@ -15,42 +15,36 @@ import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
public class FluidValveInstance extends ShaftInstance implements ITickableInstance { public class FluidValveInstance extends ShaftInstance implements IDynamicInstance {
protected InstanceKey<ModelData> pointer; protected InstanceKey<ModelData> pointer;
protected double xRot; protected final double xRot;
protected double yRot; protected final double yRot;
protected int pointerRotationOffset; protected final int pointerRotationOffset;
public FluidValveInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { public FluidValveInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
}
@Override Direction facing = blockState.get(FluidValveBlock.FACING);
protected void init() {
super.init();
Direction facing = lastState.get(FluidValveBlock.FACING);
yRot = AngleHelper.horizontalAngle(facing); yRot = AngleHelper.horizontalAngle(facing);
xRot = facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90; xRot = facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90;
Direction.Axis pipeAxis = FluidValveBlock.getPipeAxis(lastState); Direction.Axis pipeAxis = FluidValveBlock.getPipeAxis(blockState);
Direction.Axis shaftAxis = KineticTileEntityRenderer.getRotationAxisOf(tile); Direction.Axis shaftAxis = KineticTileEntityRenderer.getRotationAxisOf(tile);
pointerRotationOffset = 0; boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical();
if (pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical()) pointerRotationOffset = twist ? 90 : 0;
pointerRotationOffset = 90;
pointer = modelManager.basicMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, lastState).createInstance(); pointer = modelManager.transformMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance();
updateLight(); updateLight();
transformPointer((FluidValveTileEntity) tile); transformPointer((FluidValveTileEntity) tile);
} }
@Override @Override
public void tick() { public void beginFrame() {
FluidValveTileEntity valve = (FluidValveTileEntity) tile; FluidValveTileEntity valve = (FluidValveTileEntity) tile;

View file

@ -1,6 +1,12 @@
package com.simibubi.create.content.contraptions.goggles; package com.simibubi.create.content.contraptions.goggles;
import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
@ -10,11 +16,6 @@ import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler;
import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
/* /*
* Implement this Interface in the TileEntity class that wants to add info to the screen * Implement this Interface in the TileEntity class that wants to add info to the screen
* */ * */
@ -36,7 +37,8 @@ public interface IHaveGoggleInformation {
} }
static String format(double d) { static String format(double d) {
return numberFormat.get().format(d); return numberFormat.get()
.format(d);
} }
default boolean containedFluidTooltip(List<ITextComponent> tooltip, boolean isPlayerSneaking, LazyOptional<IFluidHandler> handler) { default boolean containedFluidTooltip(List<ITextComponent> tooltip, boolean isPlayerSneaking, LazyOptional<IFluidHandler> handler) {
@ -73,7 +75,13 @@ public interface IHaveGoggleInformation {
isEmpty = false; isEmpty = false;
} }
if (tank.getTanks() > 1 || !isEmpty) if (tank.getTanks() > 1) {
if (isEmpty)
tooltip.remove(tooltip.size() - 1);
return true;
}
if (!isEmpty)
return true; return true;
ITextComponent capacity = Lang.translate("gui.goggles.fluid_container.capacity").formatted(TextFormatting.GRAY); ITextComponent capacity = Lang.translate("gui.goggles.fluid_container.capacity").formatted(TextFormatting.GRAY);
@ -96,7 +104,10 @@ public interface IHaveGoggleInformation {
} }
public void update() { public void update() {
format = NumberFormat.getInstance(Minecraft.getInstance().getLanguageManager().getCurrentLanguage().getJavaLocale()); format = NumberFormat.getInstance(Minecraft.getInstance()
.getLanguageManager()
.getCurrentLanguage()
.getJavaLocale());
format.setMaximumFractionDigits(2); format.setMaximumFractionDigits(2);
format.setMinimumFractionDigits(0); format.setMinimumFractionDigits(0);
format.setGroupingUsed(true); format.setGroupingUsed(true);

View file

@ -21,6 +21,7 @@ import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext; import net.minecraft.item.ItemUseContext;
import net.minecraft.item.Items;
import net.minecraft.state.DirectionProperty; import net.minecraft.state.DirectionProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
@ -35,6 +36,10 @@ import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
@ -94,6 +99,11 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem) if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem)
|| GenericItemFilling.canItemBeFilled(worldIn, heldItem)) || GenericItemFilling.canItemBeFilled(worldIn, heldItem))
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
if (heldItem.getItem().equals(Items.SPONGE) &&
!te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).map(iFluidHandler ->
iFluidHandler.drain(Integer.MAX_VALUE, IFluidHandler.FluidAction.EXECUTE)).orElse(FluidStack.EMPTY).isEmpty()) {
return ActionResultType.SUCCESS;
}
return ActionResultType.PASS; return ActionResultType.PASS;
} }

View file

@ -75,8 +75,14 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
ClientPlayerEntity player = Minecraft.getInstance().player; ClientPlayerEntity player = Minecraft.getInstance().player;
float target = 0; float target = 0;
if (player != null) { if (player != null) {
double dx = player.getX() - (getPos().getX() + 0.5); double x = player.getX();
double dz = player.getZ() - (getPos().getZ() + 0.5); double z = player.getZ();
if (isVirtual()) {
x = -4;
z = -10;
}
double dx = x - (getPos().getX() + 0.5);
double dz = z - (getPos().getZ() + 0.5);
target = AngleHelper.deg(-MathHelper.atan2(dz, dx)) - 90; target = AngleHelper.deg(-MathHelper.atan2(dz, dx)) - 90;
} }
target = headAngle.getValue() + AngleHelper.getShortestAngleDiff(headAngle.getValue(), target); target = headAngle.getValue() + AngleHelper.getShortestAngleDiff(headAngle.getValue(), target);

View file

@ -5,7 +5,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec;
public enum BeltVertexAttributes implements IVertexAttrib { public enum BeltAttributes implements IVertexAttrib {
INSTANCE_ROTATION("aInstanceRot", CommonAttributes.QUATERNION), INSTANCE_ROTATION("aInstanceRot", CommonAttributes.QUATERNION),
SOURCE_TEX("aSourceTexture", CommonAttributes.UV), SOURCE_TEX("aSourceTexture", CommonAttributes.UV),
SCROLL_TEX("aScrollTexture", CommonAttributes.VEC4), SCROLL_TEX("aScrollTexture", CommonAttributes.VEC4),
@ -15,7 +15,7 @@ public enum BeltVertexAttributes implements IVertexAttrib {
private final String name; private final String name;
private final VertexAttribSpec spec; private final VertexAttribSpec spec;
BeltVertexAttributes(String name, VertexAttribSpec spec) { BeltAttributes(String name, VertexAttribSpec spec) {
this.name = name; this.name = name;
this.spec = spec; this.spec = spec;
} }

View file

@ -1,21 +1,14 @@
package com.simibubi.create.content.contraptions.relays.belt; package com.simibubi.create.content.contraptions.relays.belt;
import com.simibubi.create.content.contraptions.base.KineticData; import com.simibubi.create.content.contraptions.base.KineticData;
import com.simibubi.create.content.contraptions.base.KineticVertexAttributes;
import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.block.render.SpriteShiftEntry;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Quaternion;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
public class BeltData extends KineticData<BeltData> { public class BeltData extends KineticData {
public static VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(KineticVertexAttributes.class)
.addAttributes(BeltVertexAttributes.class)
.build();
private float qX; private float qX;
private float qY; private float qY;
private float qZ; private float qZ;

View file

@ -21,30 +21,27 @@ import java.util.function.Supplier;
public class BeltInstance extends KineticTileInstance<BeltTileEntity> { public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
private boolean upward; boolean upward;
private boolean diagonal; boolean diagonal;
private boolean sideways; boolean sideways;
private boolean vertical; boolean vertical;
private boolean alongX; boolean alongX;
private boolean alongZ; boolean alongZ;
private BeltSlope beltSlope; BeltSlope beltSlope;
private Direction facing; Direction facing;
protected ArrayList<InstanceKey<BeltData>> keys; protected ArrayList<InstanceKey<BeltData>> keys;
protected InstanceKey<RotatingData> pulleyKey; protected InstanceKey<RotatingData> pulleyKey;
public BeltInstance(InstancedTileRenderer<?> modelManager, BeltTileEntity tile) { public BeltInstance(InstancedTileRenderer<?> modelManager, BeltTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override if (!AllBlocks.BELT.has(blockState))
protected void init() {
if (!AllBlocks.BELT.has(lastState))
return; return;
keys = new ArrayList<>(2); keys = new ArrayList<>(2);
beltSlope = lastState.get(BeltBlock.SLOPE); beltSlope = blockState.get(BeltBlock.SLOPE);
facing = lastState.get(BeltBlock.HORIZONTAL_FACING); facing = blockState.get(BeltBlock.HORIZONTAL_FACING);
upward = beltSlope == BeltSlope.UPWARD; upward = beltSlope == BeltSlope.UPWARD;
diagonal = beltSlope.isDiagonal(); diagonal = beltSlope.isDiagonal();
sideways = beltSlope == BeltSlope.SIDEWAYS; sideways = beltSlope == BeltSlope.SIDEWAYS;
@ -52,7 +49,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
alongX = facing.getAxis() == Direction.Axis.X; alongX = facing.getAxis() == Direction.Axis.X;
alongZ = facing.getAxis() == Direction.Axis.Z; alongZ = facing.getAxis() == Direction.Axis.Z;
BeltPart part = lastState.get(BeltBlock.PART); BeltPart part = blockState.get(BeltBlock.PART);
boolean start = part == BeltPart.START; boolean start = part == BeltPart.START;
boolean end = part == BeltPart.END; boolean end = part == BeltPart.END;
DyeColor color = tile.color.orElse(null); DyeColor color = tile.color.orElse(null);
@ -61,7 +58,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
AllBlockPartials beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); AllBlockPartials beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom);
SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom);
InstancedModel<BeltData> beltModel = beltPartial.renderOnBelt(modelManager, lastState); InstancedModel<BeltData> beltModel = beltPartial.renderOnBelt(modelManager, blockState);
keys.add(setup(beltModel.createInstance(), bottom, spriteShift)); keys.add(setup(beltModel.createInstance(), bottom, spriteShift));
@ -76,7 +73,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
} }
@Override @Override
public void onUpdate() { public void update() {
DyeColor color = tile.color.orElse(null); DyeColor color = tile.color.orElse(null);
boolean bottom = true; boolean bottom = true;
@ -141,11 +138,11 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
return modelTransform; return modelTransform;
}; };
return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, lastState, dir, ms); return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms);
} }
private Direction getOrientation() { private Direction getOrientation() {
Direction dir = lastState.get(BeltBlock.HORIZONTAL_FACING) Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING)
.rotateY(); .rotateY();
if (beltSlope == BeltSlope.SIDEWAYS) if (beltSlope == BeltSlope.SIDEWAYS)
dir = Direction.UP; dir = Direction.UP;
@ -162,14 +159,14 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
Quaternion q = new Quaternion(rotX, rotY, rotZ, true); Quaternion q = new Quaternion(rotX, rotY, rotZ, true);
key.getInstance() key.getInstance()
.setTileEntity(tile) .setScrollTexture(spriteShift)
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) .setScrollMult(diagonal ? 3f / 8f : 0.5f)
.setSkyLight(world.getLightLevel(LightType.SKY, pos)) .setRotation(q)
.setRotation(q) .setRotationalSpeed(getScrollSpeed())
.setRotationalSpeed(getScrollSpeed()) .setRotationOffset(bottom ? 0.5f : 0f)
.setRotationOffset(bottom ? 0.5f : 0f) .setTileEntity(tile)
.setScrollTexture(spriteShift) .setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
.setScrollMult(diagonal ? 3f / 8f : 0.5f); .setSkyLight(world.getLightLevel(LightType.SKY, pos));
return key; return key;
} }

View file

@ -1,24 +1,32 @@
package com.simibubi.create.content.contraptions.relays.belt; package com.simibubi.create.content.contraptions.relays.belt;
import com.simibubi.create.content.contraptions.base.KineticAttributes;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.BasicAttributes;
import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder;
public class BeltInstancedModel extends InstancedModel<BeltData> { public class BeltInstancedModel extends InstancedModel<BeltData> {
public BeltInstancedModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) { public static VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(BasicAttributes.class)
.addAttributes(KineticAttributes.class)
.addAttributes(BeltAttributes.class)
.build();
public BeltInstancedModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
super(renderer, buf); super(renderer, buf);
} }
@Override @Override
protected BeltData newInstance() { protected BeltData newInstance() {
return new BeltData(this); return new BeltData(this);
} }
@Override @Override
protected VertexFormat getInstanceFormat() { protected VertexFormat getInstanceFormat() {
return BeltData.FORMAT; return FORMAT;
} }
} }

View file

@ -294,10 +294,10 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
} }
protected int getPackedLight(BeltTileEntity controller, float beltPos) { protected int getPackedLight(BeltTileEntity controller, float beltPos) {
BeltTileEntity belt = BeltHelper.getBeltForOffset(controller, beltPos); int segment = (int) Math.floor(beltPos) * 2;
if (belt == null) return 0; if (controller.light == null || segment >= controller.light.length) return 0;
return (belt.skyLight << 20) | (belt.blockLight << 4); return (controller.light[segment + 1] << 20) | (controller.light[segment] << 4);
} }
} }

View file

@ -7,7 +7,9 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.*;
import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo;
import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
import com.simibubi.create.foundation.render.backend.light.ILightListener; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB;
import com.simibubi.create.foundation.render.backend.light.LightUpdateListener;
import com.simibubi.create.foundation.render.backend.light.LightUpdater;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; 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;
@ -29,6 +31,7 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3i; import net.minecraft.util.math.vector.Vector3i;
import net.minecraft.world.IBlockDisplayReader;
import net.minecraft.world.LightType; import net.minecraft.world.LightType;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.IModelData;
@ -48,7 +51,8 @@ import static com.simibubi.create.content.contraptions.relays.belt.BeltSlope.HOR
import static net.minecraft.util.Direction.AxisDirection.NEGATIVE; import static net.minecraft.util.Direction.AxisDirection.NEGATIVE;
import static net.minecraft.util.Direction.AxisDirection.POSITIVE; import static net.minecraft.util.Direction.AxisDirection.POSITIVE;
public class BeltTileEntity extends KineticTileEntity implements ILightListener {
public class BeltTileEntity extends KineticTileEntity implements LightUpdateListener {
public Map<Entity, TransportedEntityInfo> passengers; public Map<Entity, TransportedEntityInfo> passengers;
public Optional<DyeColor> color; public Optional<DyeColor> color;
@ -64,8 +68,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
public CompoundNBT trackerUpdateTag; public CompoundNBT trackerUpdateTag;
// client // client
public byte blockLight = -1; public byte[] light;
public byte skyLight = -1;
public static enum CasingType { public static enum CasingType {
NONE, ANDESITE, BRASS; NONE, ANDESITE, BRASS;
@ -100,12 +103,15 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
initializeItemHandler(); initializeItemHandler();
if (blockLight == -1)
updateLight();
// Move Items // Move Items
if (!isController()) if (!isController())
return; return;
if (light == null && world.isRemote) {
initializeLight();
LightUpdater.getInstance().startListening(getBeltVolume(), this);
}
getInventory().tick(); getInventory().tick();
if (getSpeed() == 0) if (getSpeed() == 0)
@ -223,7 +229,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
if (casingBefore == casing) if (casingBefore == casing)
return; return;
requestModelDataUpdate(); if (!isVirtual())
requestModelDataUpdate();
if (hasWorld()) if (hasWorld())
world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16);
} }
@ -276,10 +283,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
} }
public boolean isController() { public boolean isController() {
return controller != null && return controller != null && pos.getX() == controller.getX() && pos.getY() == controller.getY()
pos.getX() == controller.getX() && && pos.getZ() == controller.getZ();
pos.getY() == controller.getY() &&
pos.getZ() == controller.getZ();
} }
public float getBeltMovementSpeed() { public float getBeltMovementSpeed() {
@ -297,7 +302,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
public boolean hasPulley() { public boolean hasPulley() {
if (!AllBlocks.BELT.has(getBlockState())) if (!AllBlocks.BELT.has(getBlockState()))
return false; return false;
return getBlockState().get(BeltBlock.PART) != BeltPart.MIDDLE; return getBlockState().get(BeltBlock.PART) != MIDDLE;
} }
protected boolean isLastBelt() { protected boolean isLastBelt() {
@ -500,23 +505,77 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
return 0; return 0;
} }
@Override
public void onChunkLightUpdate() {
updateLight();
}
@Override @Override
public boolean shouldRenderAsTE() { public boolean shouldRenderAsTE() {
return isController(); return isController();
} }
private void updateLight() { @Override
if (world != null) { public boolean onLightUpdate(IBlockDisplayReader world, LightType type, GridAlignedBB changed) {
skyLight = (byte) world.getLightLevel(LightType.SKY, pos); if (this.removed) {
blockLight = (byte) world.getLightLevel(LightType.BLOCK, pos); return true;
} else { }
skyLight = -1;
blockLight = -1; GridAlignedBB beltVolume = getBeltVolume();
if (beltVolume.intersects(changed)) {
if (type == LightType.BLOCK)
updateBlockLight();
if (type == LightType.SKY)
updateSkyLight();
}
return false;
}
private GridAlignedBB getBeltVolume() {
BlockPos endPos = BeltHelper.getPositionForOffset(this, beltLength - 1);
GridAlignedBB bb = GridAlignedBB.from(pos, endPos);
bb.fixMinMax();
return bb;
}
private void initializeLight() {
light = new byte[beltLength * 2];
Vector3i vec = getBeltFacing().getDirectionVec();
BeltSlope slope = getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0;
BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ());
for (int i = 0; i < beltLength * 2; i += 2) {
light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos);
light[i + 1] = (byte) world.getLightLevel(LightType.SKY, pos);
pos.move(vec.getX(), verticality, vec.getZ());
}
}
private void updateBlockLight() {
Vector3i vec = getBeltFacing().getDirectionVec();
BeltSlope slope = getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0;
BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ());
for (int i = 0; i < beltLength * 2; i += 2) {
light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos);
pos.move(vec.getX(), verticality, vec.getZ());
}
}
private void updateSkyLight() {
Vector3i vec = getBeltFacing().getDirectionVec();
BeltSlope slope = getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0;
BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ());
for (int i = 1; i < beltLength * 2; i += 2) {
light[i] = (byte) world.getLightLevel(LightType.SKY, pos);
pos.move(vec.getX(), verticality, vec.getZ());
} }
} }
} }

View file

@ -106,6 +106,12 @@ public class BeltInventory {
// Don't move if held by processing (client) // Don't move if held by processing (client)
if (world.isRemote && currentItem.locked) if (world.isRemote && currentItem.locked)
continue; continue;
// Don't move if held by external components
if (currentItem.lockedExternally) {
currentItem.lockedExternally = false;
continue;
}
// Don't move if other items are waiting in front // Don't move if other items are waiting in front
float currentPos = currentItem.beltPosition; float currentPos = currentItem.beltPosition;

View file

@ -20,6 +20,7 @@ public class TransportedItemStack implements Comparable<TransportedItemStack> {
public int insertedAt; public int insertedAt;
public Direction insertedFrom; public Direction insertedFrom;
public boolean locked; public boolean locked;
public boolean lockedExternally;
public float prevBeltPosition; public float prevBeltPosition;
public float prevSideOffset; public float prevSideOffset;
@ -73,7 +74,10 @@ public class TransportedItemStack implements Comparable<TransportedItemStack> {
nbt.putInt("InSegment", insertedAt); nbt.putInt("InSegment", insertedAt);
nbt.putInt("Angle", angle); nbt.putInt("Angle", angle);
nbt.putInt("InDirection", insertedFrom.getIndex()); nbt.putInt("InDirection", insertedFrom.getIndex());
nbt.putBoolean("Locked", locked); if (locked)
nbt.putBoolean("Locked", locked);
if (lockedExternally)
nbt.putBoolean("LockedExternally", lockedExternally);
return nbt; return nbt;
} }
@ -87,6 +91,7 @@ public class TransportedItemStack implements Comparable<TransportedItemStack> {
stack.angle = nbt.getInt("Angle"); stack.angle = nbt.getInt("Angle");
stack.insertedFrom = Direction.byIndex(nbt.getInt("InDirection")); stack.insertedFrom = Direction.byIndex(nbt.getInt("InDirection"));
stack.locked = nbt.getBoolean("Locked"); stack.locked = nbt.getBoolean("Locked");
stack.lockedExternally = nbt.getBoolean("LockedExternally");
return stack; return stack;
} }

View file

@ -25,103 +25,114 @@ import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class CogWheelBlock extends AbstractShaftBlock { public class CogWheelBlock extends AbstractShaftBlock {
boolean isLarge;
boolean isLarge; private CogWheelBlock(boolean large, Properties properties) {
super(properties);
isLarge = large;
}
private CogWheelBlock(boolean large, Properties properties) { public static CogWheelBlock small(Properties properties) {
super(properties); return new CogWheelBlock(false, properties);
isLarge = large; }
}
public static CogWheelBlock small(Properties properties) { public static CogWheelBlock large(Properties properties) {
return new CogWheelBlock(false, properties); return new CogWheelBlock(true, properties);
} }
public static CogWheelBlock large(Properties properties) { public static boolean isSmallCog(BlockState state) {
return new CogWheelBlock(true, properties); return AllBlocks.COGWHEEL.has(state);
} }
public static boolean isSmallCog(BlockState state) { public static boolean isLargeCog(BlockState state) {
return AllBlocks.COGWHEEL.has(state); return AllBlocks.LARGE_COGWHEEL.has(state);
} }
public static boolean isLargeCog(BlockState state) { @Override
return AllBlocks.LARGE_COGWHEEL.has(state); public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
} return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.get(AXIS));
}
@Override @Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.get(AXIS)); for (Direction facing : Iterate.directions) {
} if (facing.getAxis() == state.get(AXIS))
continue;
@Override BlockPos offsetPos = pos.offset(facing);
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { BlockState blockState = worldIn.getBlockState(offsetPos);
for (Direction facing : Iterate.directions) { if (blockState.contains(AXIS) && facing.getAxis() == blockState.get(AXIS))
if (facing.getAxis() == state.get(AXIS)) continue;
continue;
BlockState blockState = worldIn.getBlockState(pos.offset(facing)); boolean smallCog = isSmallCog(blockState);
if (blockState.contains(AXIS) && facing.getAxis() == blockState.get(AXIS)) if (!smallCog && blockState.getBlock() instanceof IRotate)
continue; smallCog = ((IRotate) blockState.getBlock()).hasIntegratedCogwheel(worldIn, offsetPos, blockState);
if (isLargeCog(blockState) || isLarge && isSmallCog(blockState))
return false;
}
return true;
}
@Override if (isLargeCog(blockState) || isLarge && smallCog)
public BlockState getStateForPlacement(BlockItemUseContext context) { return false;
BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite()); }
World world = context.getWorld(); return true;
BlockState placedAgainst = world.getBlockState(placedOnPos); }
Block block = placedAgainst.getBlock();
if (context.getPlayer() != null && context.getPlayer().isSneaking()) @Override
return this.getDefaultState().with(AXIS, context.getFace().getAxis()); public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockPos placedOnPos = context.getPos()
BlockState stateBelow = world.getBlockState(context.getPos() .offset(context.getFace()
.down()); .getOpposite());
FluidState FluidState = context.getWorld().getFluidState(context.getPos()); World world = context.getWorld();
if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLarge) { BlockState placedAgainst = world.getBlockState(placedOnPos);
return this.getDefaultState() Block block = placedAgainst.getBlock();
.with(BlockStateProperties.WATERLOGGED, FluidState.getFluid() == Fluids.WATER)
.with(AXIS, stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X);
}
if (!(block instanceof IRotate) if (context.getPlayer() != null && context.getPlayer()
|| !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) { .isSneaking())
Axis preferredAxis = getPreferredAxis(context); return this.getDefaultState()
if (preferredAxis != null) .with(AXIS, context.getFace()
return this.getDefaultState() .getAxis());
.with(AXIS, preferredAxis)
.with(BlockStateProperties.WATERLOGGED, FluidState.getFluid() == Fluids.WATER);
return this.getDefaultState()
.with(AXIS, context.getFace().getAxis())
.with(BlockStateProperties.WATERLOGGED, FluidState.getFluid() == Fluids.WATER);
}
return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst)); BlockState stateBelow = world.getBlockState(context.getPos()
} .down());
FluidState ifluidstate = context.getWorld()
.getFluidState(context.getPos());
if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLarge) {
return this.getDefaultState()
.with(BlockStateProperties.WATERLOGGED, ifluidstate.getFluid() == Fluids.WATER)
.with(AXIS, stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X);
}
@Override if (!(block instanceof IRotate)
public float getParticleTargetRadius() { || !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) {
return isLarge ? 1.125f : .65f; Axis preferredAxis = getPreferredAxis(context);
} if (preferredAxis != null)
return this.getDefaultState()
.with(AXIS, preferredAxis)
.with(BlockStateProperties.WATERLOGGED, ifluidstate.getFluid() == Fluids.WATER);
return this.getDefaultState()
.with(AXIS, context.getFace()
.getAxis())
.with(BlockStateProperties.WATERLOGGED, ifluidstate.getFluid() == Fluids.WATER);
}
@Override return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst));
public float getParticleInitialRadius() { }
return isLarge ? 1f : .75f;
}
public void fillItemGroup(ItemGroup group, NonNullList<ItemStack> items) { @Override
items.add(new ItemStack(this)); public float getParticleTargetRadius() {
} return isLarge ? 1.125f : .65f;
}
// IRotate @Override
public float getParticleInitialRadius() {
return isLarge ? 1f : .75f;
}
@Override public void fillItemGroup(ItemGroup group, NonNullList<ItemStack> items) {
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) { items.add(new ItemStack(this));
return !isLarge; }
}
// IRotate
@Override
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return !isLarge;
}
} }

View file

@ -16,24 +16,21 @@ import java.util.ArrayList;
public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity> { public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity> {
protected ArrayList<InstanceKey<RotatingData>> keys; protected final ArrayList<InstanceKey<RotatingData>> keys;
public SplitShaftInstance(InstancedTileRenderer<?> modelManager, SplitShaftTileEntity tile) { public SplitShaftInstance(InstancedTileRenderer<?> modelManager, SplitShaftTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override
protected void init() {
keys = new ArrayList<>(2); keys = new ArrayList<>(2);
Block block = lastState.getBlock(); Block block = blockState.getBlock();
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(lastState); final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(blockState);
float speed = tile.getSpeed(); float speed = tile.getSpeed();
for (Direction dir : Iterate.directionsInAxis(boxAxis)) { for (Direction dir : Iterate.directionsInAxis(boxAxis)) {
InstancedModel<RotatingData> half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, dir); InstancedModel<RotatingData> half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir);
float splitSpeed = speed * tile.getRotationSpeedModifier(dir); float splitSpeed = speed * tile.getRotationSpeedModifier(dir);
@ -42,9 +39,9 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
} }
@Override @Override
public void onUpdate() { public void update() {
Block block = lastState.getBlock(); Block block = blockState.getBlock();
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(lastState); final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(blockState);
Direction[] directions = Iterate.directionsInAxis(boxAxis); Direction[] directions = Iterate.directionsInAxis(boxAxis);
@ -55,7 +52,7 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
@Override @Override
public void updateLight() { public void updateLight() {
keys.forEach(key -> relight(pos, ((InstanceKey<? extends KineticData<?>>) key).getInstance())); keys.forEach(key -> relight(pos, ((InstanceKey<? extends KineticData>) key).getInstance()));
} }
@Override @Override
@ -68,9 +65,9 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
Direction.Axis axis = dir.getAxis(); Direction.Axis axis = dir.getAxis();
key.getInstance() key.getInstance()
.setColor(tile.network) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir)) .setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir))
.setRotationOffset(getRotationOffset(axis)) .setRotationOffset(getRotationOffset(axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); .setColor(tile.network);
} }
} }

View file

@ -5,7 +5,7 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
@ -19,26 +19,21 @@ import net.minecraft.util.math.MathHelper;
import java.util.ArrayList; import java.util.ArrayList;
public abstract class GaugeInstance extends ShaftInstance implements ITickableInstance { public abstract class GaugeInstance extends ShaftInstance implements IDynamicInstance {
protected ArrayList<DialFace> faces; protected final ArrayList<DialFace> faces;
protected MatrixStack ms; protected MatrixStack ms;
protected GaugeInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { protected GaugeInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
}
@Override
protected void init() {
super.init();
faces = new ArrayList<>(2); faces = new ArrayList<>(2);
GaugeTileEntity gaugeTile = (GaugeTileEntity) tile; GaugeTileEntity gaugeTile = (GaugeTileEntity) tile;
GaugeBlock gaugeBlock = (GaugeBlock) lastState.getBlock(); GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock();
InstancedModel<ModelData> dialModel = modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.GAUGE_DIAL, lastState); InstancedModel<ModelData> dialModel = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_DIAL, blockState);
InstancedModel<ModelData> headModel = getHeadModel(); InstancedModel<ModelData> headModel = getHeadModel();
ms = new MatrixStack(); ms = new MatrixStack();
@ -48,7 +43,7 @@ public abstract class GaugeInstance extends ShaftInstance implements ITickableIn
float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState); float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState);
for (Direction facing : Iterate.directions) { for (Direction facing : Iterate.directions) {
if (!gaugeBlock.shouldRenderHeadOnFace(world, pos, lastState, facing)) if (!gaugeBlock.shouldRenderHeadOnFace(world, pos, blockState, facing))
continue; continue;
DialFace face = makeFace(facing, dialModel, headModel); DialFace face = makeFace(facing, dialModel, headModel);
@ -66,7 +61,7 @@ public abstract class GaugeInstance extends ShaftInstance implements ITickableIn
} }
@Override @Override
public void tick() { public void beginFrame() {
GaugeTileEntity gaugeTile = (GaugeTileEntity) tile; GaugeTileEntity gaugeTile = (GaugeTileEntity) tile;
if (MathHelper.epsilonEquals(gaugeTile.prevDialState, gaugeTile.dialState)) if (MathHelper.epsilonEquals(gaugeTile.prevDialState, gaugeTile.dialState))
@ -159,7 +154,7 @@ public abstract class GaugeInstance extends ShaftInstance implements ITickableIn
@Override @Override
protected InstancedModel<ModelData> getHeadModel() { protected InstancedModel<ModelData> getHeadModel() {
return modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.GAUGE_HEAD_SPEED, lastState); return modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_HEAD_SPEED, blockState);
} }
} }
@ -170,7 +165,7 @@ public abstract class GaugeInstance extends ShaftInstance implements ITickableIn
@Override @Override
protected InstancedModel<ModelData> getHeadModel() { protected InstancedModel<ModelData> getHeadModel() {
return modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.GAUGE_HEAD_STRESS, lastState); return modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_HEAD_STRESS, blockState);
} }
} }
} }

View file

@ -17,18 +17,15 @@ import java.util.Map;
public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> { public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
protected EnumMap<Direction, InstanceKey<RotatingData>> keys; protected final EnumMap<Direction, InstanceKey<RotatingData>> keys;
protected Direction sourceFacing; protected Direction sourceFacing;
public GearboxInstance(InstancedTileRenderer<?> modelManager, GearboxTileEntity tile) { public GearboxInstance(InstancedTileRenderer<?> modelManager, GearboxTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override
protected void init() {
keys = new EnumMap<>(Direction.class); keys = new EnumMap<>(Direction.class);
final Direction.Axis boxAxis = lastState.get(BlockStateProperties.AXIS); final Direction.Axis boxAxis = blockState.get(BlockStateProperties.AXIS);
int blockLight = world.getLightLevel(LightType.BLOCK, pos); int blockLight = world.getLightLevel(LightType.BLOCK, pos);
int skyLight = world.getLightLevel(LightType.SKY, pos); int skyLight = world.getLightLevel(LightType.SKY, pos);
@ -39,17 +36,17 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
if (boxAxis == axis) if (boxAxis == axis)
continue; continue;
InstancedModel<RotatingData> shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, direction); InstancedModel<RotatingData> shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction);
InstanceKey<RotatingData> key = shaft.createInstance(); InstanceKey<RotatingData> key = shaft.createInstance();
key.getInstance() key.getInstance()
.setBlockLight(blockLight) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setSkyLight(skyLight) .setRotationalSpeed(getSpeed(direction))
.setRotationalSpeed(getSpeed(direction)) .setRotationOffset(getRotationOffset(axis))
.setRotationOffset(getRotationOffset(axis)) .setTileEntity(tile)
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .setBlockLight(blockLight)
.setTileEntity(tile); .setSkyLight(skyLight);
keys.put(direction, key); keys.put(direction, key);
} }
@ -77,18 +74,18 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
} }
@Override @Override
public void onUpdate() { public void update() {
updateSourceFacing(); updateSourceFacing();
for (Map.Entry<Direction, InstanceKey<RotatingData>> key : keys.entrySet()) { for (Map.Entry<Direction, InstanceKey<RotatingData>> key : keys.entrySet()) {
Direction direction = key.getKey(); Direction direction = key.getKey();
Direction.Axis axis = direction.getAxis(); Direction.Axis axis = direction.getAxis();
key.getValue() key.getValue()
.getInstance() .getInstance()
.setColor(tile.network) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setRotationalSpeed(getSpeed(direction)) .setRotationalSpeed(getSpeed(direction))
.setRotationOffset(getRotationOffset(axis)) .setRotationOffset(getRotationOffset(axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); .setColor(tile.network);
} }
} }

View file

@ -5,7 +5,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec;
public enum FlapVertexAttributes implements IVertexAttrib { public enum FlapAttributes implements IVertexAttrib {
INSTANCE_POSITION("aInstancePos",CommonAttributes.VEC3), INSTANCE_POSITION("aInstancePos",CommonAttributes.VEC3),
LIGHT("aLight", CommonAttributes.LIGHT), LIGHT("aLight", CommonAttributes.LIGHT),
SEGMENT_OFFSET("aSegmentOffset", CommonAttributes.VEC3), SEGMENT_OFFSET("aSegmentOffset", CommonAttributes.VEC3),
@ -19,7 +19,7 @@ public enum FlapVertexAttributes implements IVertexAttrib {
private final String name; private final String name;
private final VertexAttribSpec spec; private final VertexAttribSpec spec;
FlapVertexAttributes(String name, VertexAttribSpec spec) { FlapAttributes(String name, VertexAttribSpec spec) {
this.name = name; this.name = name;
this.spec = spec; this.spec = spec;
} }

View file

@ -1,122 +1,120 @@
package com.simibubi.create.content.logistics.block; package com.simibubi.create.content.logistics.block;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstanceData;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.impl.IFlatLight;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3f; import net.minecraft.util.math.vector.Vector3f;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
public class FlapData extends InstanceData { public class FlapData extends InstanceData implements IFlatLight<FlapData> {
public static VertexFormat FORMAT = VertexFormat.builder() private float x;
.addAttributes(FlapVertexAttributes.class) private float y;
.build(); private float z;
private byte blockLight;
private byte skyLight;
private float x; private float segmentOffsetX;
private float y; private float segmentOffsetY;
private float z; private float segmentOffsetZ;
private byte blockLight;
private byte skyLight;
private float segmentOffsetX; private float pivotX;
private float segmentOffsetY; private float pivotY;
private float segmentOffsetZ; private float pivotZ;
private float pivotX; private float horizontalAngle;
private float pivotY; private float intensity;
private float pivotZ; private float flapScale;
private float horizontalAngle; private float flapness;
private float intensity;
private float flapScale;
private float flapness; public FlapData(InstancedModel<?> owner) {
super(owner);
}
public FlapData(InstancedModel<?> owner) { public FlapData setPosition(BlockPos pos) {
super(owner); return setPosition(pos.getX(), pos.getY(), pos.getZ());
} }
public FlapData setPosition(BlockPos pos) { public FlapData setPosition(Vector3f pos) {
return setPosition(pos.getX(), pos.getY(), pos.getZ()); return setPosition(pos.getX(), pos.getY(), pos.getZ());
} }
public FlapData setPosition(Vector3f pos) { public FlapData setPosition(int x, int y, int z) {
return setPosition(pos.getX(), pos.getY(), pos.getZ()); BlockPos origin = owner.renderer.getOriginCoordinate();
}
public FlapData setPosition(int x, int y, int z) { return setPosition((float) (x - origin.getX()),
BlockPos origin = owner.renderer.getOriginCoordinate(); (float) (y - origin.getY()),
(float) (z - origin.getZ()));
}
return setPosition((float) (x - origin.getX()), public FlapData setPosition(float x, float y, float z) {
(float) (y - origin.getY()), this.x = x;
(float) (z - origin.getZ())); this.y = y;
} this.z = z;
return this;
}
public FlapData setPosition(float x, float y, float z) { @Override
this.x = x; public FlapData setBlockLight(int blockLight) {
this.y = y; this.blockLight = (byte) ((blockLight & 0xF) << 4);
this.z = z; return this;
return this; }
}
public FlapData setBlockLight(int blockLight) { @Override
this.blockLight = (byte) ((blockLight & 0xF) << 4); public FlapData setSkyLight(int skyLight) {
return this; this.skyLight = (byte) ((skyLight & 0xF) << 4);
} return this;
}
public FlapData setSkyLight(int skyLight) { public FlapData setSegmentOffset(float x, float y, float z) {
this.skyLight = (byte) ((skyLight & 0xF) << 4); this.segmentOffsetX = x;
return this; this.segmentOffsetY = y;
} this.segmentOffsetZ = z;
return this;
}
public FlapData setSegmentOffset(float x, float y, float z) { public FlapData setIntensity(float intensity) {
this.segmentOffsetX = x; this.intensity = intensity;
this.segmentOffsetY = y; return this;
this.segmentOffsetZ = z; }
return this;
}
public FlapData setIntensity(float intensity) { public FlapData setHorizontalAngle(float horizontalAngle) {
this.intensity = intensity; this.horizontalAngle = horizontalAngle;
return this; return this;
} }
public FlapData setHorizontalAngle(float horizontalAngle) { public FlapData setFlapScale(float flapScale) {
this.horizontalAngle = horizontalAngle; this.flapScale = flapScale;
return this; return this;
} }
public FlapData setFlapScale(float flapScale) { public FlapData setFlapness(float flapness) {
this.flapScale = flapScale; this.flapness = flapness;
return this; return this;
} }
public FlapData setFlapness(float flapness) { public FlapData setPivotVoxelSpace(float x, float y, float z) {
this.flapness = flapness; pivotX = x / 16f;
return this; pivotY = y / 16f;
} pivotZ = z / 16f;
return this;
}
public FlapData setPivotVoxelSpace(float x, float y, float z) { @Override
pivotX = x / 16f; public void write(ByteBuffer buf) {
pivotY = y / 16f; putVec3(buf, x, y, z);
pivotZ = z / 16f; putVec2(buf, blockLight, skyLight);
return this;
}
@Override putVec3(buf, segmentOffsetX, segmentOffsetY, segmentOffsetZ);
public void write(ByteBuffer buf) { putVec3(buf, pivotX, pivotY, pivotZ);
putVec3(buf, x, y, z);
putVec2(buf, blockLight, skyLight);
putVec3(buf, segmentOffsetX, segmentOffsetY, segmentOffsetZ); put(buf, horizontalAngle);
putVec3(buf, pivotX, pivotY, pivotZ); put(buf, intensity);
put(buf, flapScale);
put(buf, horizontalAngle); put(buf, flapness);
put(buf, intensity); }
put(buf, flapScale);
put(buf, flapness);
}
} }

View file

@ -1,22 +0,0 @@
package com.simibubi.create.content.logistics.block;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import net.minecraft.client.renderer.BufferBuilder;
public class FlapInstancedModel extends InstancedModel<FlapData> {
public FlapInstancedModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
super(renderer, buf);
}
@Override
protected FlapData newInstance() {
return new FlapData(this);
}
@Override
protected VertexFormat getInstanceFormat() {
return FlapData.FORMAT;
}
}

View file

@ -0,0 +1,26 @@
package com.simibubi.create.content.logistics.block;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import net.minecraft.client.renderer.BufferBuilder;
public class FlapModel extends InstancedModel<FlapData> {
public static VertexFormat FORMAT = VertexFormat.builder()
.addAttributes(FlapAttributes.class)
.build();
public FlapModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
super(renderer, buf);
}
@Override
protected FlapData newInstance() {
return new FlapData(this);
}
@Override
protected VertexFormat getInstanceFormat() {
return FORMAT;
}
}

View file

@ -14,21 +14,17 @@ import java.util.Collection;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Map; import java.util.Map;
public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity> implements ITickableInstance { public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity> implements IDynamicInstance {
private final Map<Direction, ArrayList<InstanceKey<FlapData>>> tunnelFlaps;
private Map<Direction, ArrayList<InstanceKey<FlapData>>> tunnelFlaps;
public BeltTunnelInstance(InstancedTileRenderer<?> modelManager, BeltTunnelTileEntity tile) { public BeltTunnelInstance(InstancedTileRenderer<?> modelManager, BeltTunnelTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override
protected void init() {
tunnelFlaps = new EnumMap<>(Direction.class); tunnelFlaps = new EnumMap<>(Direction.class);
InstancedModel<FlapData> model = modelManager.getMaterial(KineticRenderMaterials.FLAPS) InstancedModel<FlapData> model = modelManager.getMaterial(KineticRenderMaterials.FLAPS)
.getModel(AllBlockPartials.BELT_TUNNEL_FLAP, lastState); .getModel(AllBlockPartials.BELT_TUNNEL_FLAP, blockState);
int blockLight = world.getLightLevel(LightType.BLOCK, pos); int blockLight = world.getLightLevel(LightType.BLOCK, pos);
int skyLight = world.getLightLevel(LightType.SKY, pos); int skyLight = world.getLightLevel(LightType.SKY, pos);
@ -68,7 +64,7 @@ public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity>
} }
@Override @Override
public void tick() { public void beginFrame() {
tunnelFlaps.forEach((direction, keys) -> { tunnelFlaps.forEach((direction, keys) -> {
InterpolatedValue flapValue = tile.flaps.get(direction); InterpolatedValue flapValue = tile.flaps.get(direction);
if (flapValue == null) { if (flapValue == null) {
@ -82,9 +78,6 @@ public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity>
}); });
} }
@Override
protected void onUpdate() { }
@Override @Override
public void updateLight() { public void updateLight() {
int blockLight = world.getLightLevel(LightType.BLOCK, pos); int blockLight = world.getLightLevel(LightType.BLOCK, pos);

View file

@ -1,5 +1,14 @@
package com.simibubi.create.content.logistics.block.belts.tunnel; package com.simibubi.create.content.logistics.block.belts.tunnel;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
@ -29,9 +38,6 @@ import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import org.apache.commons.lang3.tuple.Pair;
import java.util.*;
public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRendered { public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRendered {
@ -98,7 +104,7 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe
super.fromTag(state, compound, clientPacket); super.fromTag(state, compound, clientPacket);
if (clientPacket) if (clientPacket)
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this));
} }
public void updateTunnelConnections() { public void updateTunnelConnections() {
@ -170,6 +176,11 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe
flapsToSend.clear(); flapsToSend.clear();
} }
@Override
public boolean shouldRenderAsTE() {
return true;
}
@Override @Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {} public void addBehaviours(List<TileEntityBehaviour> behaviours) {}

View file

@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock;
import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity; import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.content.contraptions.particle.AirParticleData;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
@ -154,7 +155,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
if (!handleDownwardOutput(true)) if (!handleDownwardOutput(true))
nextOffset = .5f; nextOffset = .5f;
else if (nextOffset < 0) { else if (nextOffset < 0) {
handleDownwardOutput(world.isRemote); handleDownwardOutput(world.isRemote && !isVirtual());
return; return;
} }
} }
@ -165,7 +166,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
if (!handleUpwardOutput(true)) if (!handleUpwardOutput(true))
nextOffset = .5f; nextOffset = .5f;
else if (nextOffset > 1) { else if (nextOffset > 1) {
handleUpwardOutput(world.isRemote); handleUpwardOutput(world.isRemote && !isVirtual());
return; return;
} }
} }
@ -379,6 +380,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
.isHorizontal()) .isHorizontal())
return false; return false;
if (FunnelBlock.getFunnelFacing(world.getBlockState(pos.down())) == Direction.DOWN)
return false;
if (Block.hasSolidSideOnTop(world, pos.down())) if (Block.hasSolidSideOnTop(world, pos.down()))
return false; return false;
@ -433,6 +436,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
return true; return true;
} }
if (FunnelBlock.getFunnelFacing(world.getBlockState(pos.up())) == Direction.UP)
return false;
if (BlockHelper.hasBlockSolidSide(stateAbove, world, pos.up(), Direction.DOWN)) if (BlockHelper.hasBlockSolidSide(stateAbove, world, pos.up(), Direction.DOWN))
return false; return false;
if (!inputChutes.isEmpty()) if (!inputChutes.isEmpty())

View file

@ -99,6 +99,8 @@ public class DepotTileEntity extends SmartTileEntity {
continue; continue;
ItemStack afterInsert = ItemStack afterInsert =
getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null); getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null);
if (afterInsert == null)
return false;
if (previousItem.getCount() != afterInsert.getCount()) { if (previousItem.getCount() != afterInsert.getCount()) {
processingOutputBuffer.setStackInSlot(slot, afterInsert); processingOutputBuffer.setStackInSlot(slot, afterInsert);
notifyUpdate(); notifyUpdate();
@ -109,6 +111,8 @@ public class DepotTileEntity extends SmartTileEntity {
ItemStack previousItem = heldItem.stack; ItemStack previousItem = heldItem.stack;
ItemStack afterInsert = ItemStack afterInsert =
getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null); getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null);
if (afterInsert == null)
return false;
if (previousItem.getCount() != afterInsert.getCount()) { if (previousItem.getCount() != afterInsert.getCount()) {
if (afterInsert.isEmpty()) if (afterInsert.isEmpty())
heldItem = null; heldItem = null;

View file

@ -0,0 +1,55 @@
package com.simibubi.create.content.logistics.block.diodes;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.MatrixStacker;
public class AdjustableRepeaterInstance extends TileEntityInstance<AdjustableRepeaterTileEntity> implements ITickableInstance {
protected final InstanceKey<ModelData> indicator;
protected int previousState;
public AdjustableRepeaterInstance(InstancedTileRenderer<?> modelManager, AdjustableRepeaterTileEntity tile) {
super(modelManager, tile);
indicator = modelManager.transformMaterial().getModel(AllBlockPartials.FLEXPEATER_INDICATOR, blockState).createInstance();
MatrixStack ms = new MatrixStack();
MatrixStacker.of(ms).translate(getFloatingPos());
indicator.getInstance()
.setTransform(ms)
.setColor(getColor());
previousState = tile.state;
updateLight();
}
@Override
public void tick() {
if (previousState == tile.state) return;
indicator.getInstance().setColor(getColor());
previousState = tile.state;
}
@Override
public void updateLight() {
relight(pos, indicator.getInstance());
}
@Override
public void remove() {
indicator.delete();
}
protected int getColor() {
return ColorHelper.mixColors(0x2C0300, 0xCD0000, tile.state / (float) tile.maxState.getValue());
}
}

View file

@ -5,6 +5,7 @@ import static net.minecraft.block.RedstoneDiodeBlock.POWERED;
import java.util.List; import java.util.List;
import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour;
@ -17,7 +18,7 @@ import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
public class AdjustableRepeaterTileEntity extends SmartTileEntity { public class AdjustableRepeaterTileEntity extends SmartTileEntity implements IInstanceRendered {
public int state; public int state;
public boolean charging; public boolean charging;
@ -116,5 +117,4 @@ public class AdjustableRepeaterTileEntity extends SmartTileEntity {
state += charging ? 1 : -1; state += charging ? 1 : -1;
} }
} }

View file

@ -10,29 +10,26 @@ import net.minecraft.world.LightType;
import java.util.ArrayList; import java.util.ArrayList;
public class FunnelInstance extends TileEntityInstance<FunnelTileEntity> implements ITickableInstance { public class FunnelInstance extends TileEntityInstance<FunnelTileEntity> implements IDynamicInstance {
private ArrayList<InstanceKey<FlapData>> flaps; private final ArrayList<InstanceKey<FlapData>> flaps;
public FunnelInstance(InstancedTileRenderer<?> modelManager, FunnelTileEntity tile) { public FunnelInstance(InstancedTileRenderer<?> modelManager, FunnelTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override
protected void init() {
flaps = new ArrayList<>(4); flaps = new ArrayList<>(4);
if (!tile.hasFlap()) return; if (!tile.hasFlap()) return;
AllBlockPartials flapPartial = (lastState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP AllBlockPartials flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP
: AllBlockPartials.BELT_FUNNEL_FLAP); : AllBlockPartials.BELT_FUNNEL_FLAP);
InstancedModel<FlapData> model = modelManager.getMaterial(KineticRenderMaterials.FLAPS) InstancedModel<FlapData> model = modelManager.getMaterial(KineticRenderMaterials.FLAPS)
.getModel(flapPartial, lastState); .getModel(flapPartial, blockState);
int blockLight = world.getLightLevel(LightType.BLOCK, pos); int blockLight = world.getLightLevel(LightType.BLOCK, pos);
int skyLight = world.getLightLevel(LightType.SKY, pos); int skyLight = world.getLightLevel(LightType.SKY, pos);
Direction direction = FunnelBlock.getFunnelFacing(lastState); Direction direction = FunnelBlock.getFunnelFacing(blockState);
float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks()); float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks());
float horizontalAngle = direction.getOpposite().getHorizontalAngle(); float horizontalAngle = direction.getOpposite().getHorizontalAngle();
@ -59,7 +56,7 @@ public class FunnelInstance extends TileEntityInstance<FunnelTileEntity> impleme
} }
@Override @Override
public void tick() { public void beginFrame() {
if (flaps == null) return; if (flaps == null) return;
float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks()); float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks());
@ -71,16 +68,8 @@ public class FunnelInstance extends TileEntityInstance<FunnelTileEntity> impleme
@Override @Override
public void updateLight() { public void updateLight() {
if (flaps == null) return; if (flaps != null)
relight(pos, flaps.stream().map(InstanceKey::getInstance));
int blockLight = world.getLightLevel(LightType.BLOCK, pos);
int skyLight = world.getLightLevel(LightType.SKY, pos);
for (InstanceKey<FlapData> it : flaps) {
it.getInstance()
.setBlockLight(blockLight)
.setSkyLight(skyLight);
}
} }
@Override @Override

View file

@ -263,6 +263,8 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn
return false; return false;
if (!(blockState.getBlock() instanceof FunnelBlock)) if (!(blockState.getBlock() instanceof FunnelBlock))
return false; return false;
if (blockState.get(FunnelBlock.EXTRACTING))
return false;
return FunnelBlock.getFunnelFacing(blockState) == Direction.UP; return FunnelBlock.getFunnelFacing(blockState) == Direction.UP;
} }

View file

@ -21,144 +21,137 @@ import net.minecraft.util.math.MathHelper;
import java.util.ArrayList; import java.util.ArrayList;
public class ArmInstance extends SingleRotatingInstance implements ITickableInstance { public class ArmInstance extends SingleRotatingInstance implements IDynamicInstance {
private InstanceKey<ModelData> base; final InstanceKey<ModelData> base;
private InstanceKey<ModelData> lowerBody; final InstanceKey<ModelData> lowerBody;
private InstanceKey<ModelData> upperBody; final InstanceKey<ModelData> upperBody;
private InstanceKey<ModelData> head; final InstanceKey<ModelData> head;
private InstanceKey<ModelData> claw; final InstanceKey<ModelData> claw;
private ArrayList<InstanceKey<ModelData>> clawGrips; private final ArrayList<InstanceKey<ModelData>> clawGrips;
private ArrayList<InstanceKey<ModelData>> models; private final ArrayList<InstanceKey<ModelData>> models;
private boolean firstTick = true; private boolean firstTick = true;
public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) { public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
protected void init() {
super.init();
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.MODELS); base = mat.getModel(AllBlockPartials.ARM_BASE, blockState).createInstance();
lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, blockState).createInstance();
upperBody = mat.getModel(AllBlockPartials.ARM_UPPER_BODY, blockState).createInstance();
head = mat.getModel(AllBlockPartials.ARM_HEAD, blockState).createInstance();
claw = mat.getModel(AllBlockPartials.ARM_CLAW_BASE, blockState).createInstance();
base = mat.getModel(AllBlockPartials.ARM_BASE, lastState).createInstance(); InstancedModel<ModelData> clawHalfModel = mat.getModel(AllBlockPartials.ARM_CLAW_GRIP, blockState);
lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, lastState).createInstance(); InstanceKey<ModelData> clawGrip1 = clawHalfModel.createInstance();
upperBody = mat.getModel(AllBlockPartials.ARM_UPPER_BODY, lastState).createInstance(); InstanceKey<ModelData> clawGrip2 = clawHalfModel.createInstance();
head = mat.getModel(AllBlockPartials.ARM_HEAD, lastState).createInstance();
claw = mat.getModel(AllBlockPartials.ARM_CLAW_BASE, lastState).createInstance();
InstancedModel<ModelData> clawHalfModel = mat.getModel(AllBlockPartials.ARM_CLAW_GRIP, lastState); clawGrips = Lists.newArrayList(clawGrip1, clawGrip2);
InstanceKey<ModelData> clawGrip1 = clawHalfModel.createInstance(); models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2);
InstanceKey<ModelData> clawGrip2 = clawHalfModel.createInstance();
clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); updateLight();
models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2); }
firstTick = true; @Override
tick(); public void beginFrame() {
updateLight(); ArmTileEntity arm = (ArmTileEntity) tile;
}
@Override boolean settled = arm.baseAngle.settled() && arm.lowerArmAngle.settled() && arm.upperArmAngle.settled() && arm.headAngle.settled();
public void tick() { boolean rave = arm.phase == ArmTileEntity.Phase.DANCING;
ArmTileEntity arm = (ArmTileEntity) tile;
boolean settled = arm.baseAngle.settled() && arm.lowerArmAngle.settled() && arm.upperArmAngle.settled() && arm.headAngle.settled(); if (!settled || rave || firstTick)
boolean rave = arm.phase == ArmTileEntity.Phase.DANCING; transformModels(arm, rave);
if (!settled || rave || firstTick) if (settled)
transformModels(arm, rave); firstTick = false;
}
if (settled) private void transformModels(ArmTileEntity arm, boolean rave) {
firstTick = false; float pt = AnimationTickHolder.getPartialTicks();
} int color = 0xFFFFFF;
private void transformModels(ArmTileEntity arm, boolean rave) { float baseAngle = arm.baseAngle.get(pt);
float pt = AnimationTickHolder.getPartialTicks(); float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135;
int color = 0xFFFFFF; float upperArmAngle = arm.upperArmAngle.get(pt) - 90;
float headAngle = arm.headAngle.get(pt);
float baseAngle = arm.baseAngle.get(pt); if (rave) {
float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135; float renderTick = AnimationTickHolder.getRenderTime(arm.getWorld()) + (tile.hashCode() % 64);
float upperArmAngle = arm.upperArmAngle.get(pt) - 90; baseAngle = (renderTick * 10) % 360;
float headAngle = arm.headAngle.get(pt); lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15);
upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95);
if (rave) { headAngle = -lowerArmAngle;
float renderTick = AnimationTickHolder.getRenderTime(arm.getWorld()) + (tile.hashCode() % 64); color = ColorHelper.rainbowColor(AnimationTickHolder.getTicks() * 100);
baseAngle = (renderTick * 10) % 360; }
lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15);
upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95);
headAngle = -lowerArmAngle;
color = ColorHelper.rainbowColor(AnimationTickHolder.getTicks() * 100);
}
MatrixStack msLocal = new MatrixStack(); MatrixStack msLocal = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(msLocal); MatrixStacker msr = MatrixStacker.of(msLocal);
msr.translate(getFloatingPos()); msr.translate(getFloatingPos());
msr.centre(); msr.centre();
if (lastState.get(ArmBlock.CEILING)) if (blockState.get(ArmBlock.CEILING))
msr.rotateX(180); msr.rotateX(180);
ArmRenderer.transformBase(msr, baseAngle); ArmRenderer.transformBase(msr, baseAngle);
base.getInstance() base.getInstance()
.setTransform(msLocal); .setTransform(msLocal);
ArmRenderer.transformLowerArm(msr, lowerArmAngle); ArmRenderer.transformLowerArm(msr, lowerArmAngle);
lowerBody.getInstance() lowerBody.getInstance()
.setColor(color) .setTransform(msLocal)
.setTransform(msLocal); .setColor(color);
ArmRenderer.transformUpperArm(msr, upperArmAngle); ArmRenderer.transformUpperArm(msr, upperArmAngle);
upperBody.getInstance() upperBody.getInstance()
.setColor(color) .setTransform(msLocal)
.setTransform(msLocal); .setColor(color);
ArmRenderer.transformHead(msr, headAngle); ArmRenderer.transformHead(msr, headAngle);
head.getInstance() head.getInstance()
.setTransform(msLocal); .setTransform(msLocal);
ArmRenderer.transformClaw(msr); ArmRenderer.transformClaw(msr);
claw.getInstance() claw.getInstance()
.setTransform(msLocal); .setTransform(msLocal);
ItemStack item = arm.heldItem; ItemStack item = arm.heldItem;
ItemRenderer itemRenderer = Minecraft.getInstance() ItemRenderer itemRenderer = Minecraft.getInstance()
.getItemRenderer(); .getItemRenderer();
boolean hasItem = !item.isEmpty(); boolean hasItem = !item.isEmpty();
boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem)
&& itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null) && itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null)
.isGui3d(); .isGui3d();
for (int index : Iterate.zeroAndOne) { for (int index : Iterate.zeroAndOne) {
msLocal.push(); msLocal.push();
int flip = index * 2 - 1; int flip = index * 2 - 1;
ArmRenderer.transformClawHalf(msr, hasItem, isBlockItem, flip); ArmRenderer.transformClawHalf(msr, hasItem, isBlockItem, flip);
clawGrips.get(index) clawGrips.get(index)
.getInstance() .getInstance()
.setTransform(msLocal); .setTransform(msLocal);
msLocal.pop(); msLocal.pop();
} }
} }
@Override @Override
public void updateLight() { public void updateLight() {
super.updateLight(); super.updateLight();
relight(pos, models.stream().map(InstanceKey::getInstance)); relight(pos, models.stream().map(InstanceKey::getInstance));
} }
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState()); return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState());
} }
@Override @Override
public void remove() { public void remove() {
super.remove(); super.remove();
models.forEach(InstanceKey::delete); models.forEach(InstanceKey::delete);
} }
} }

View file

@ -1,5 +1,11 @@
package com.simibubi.create.content.logistics.block.mechanicalArm; package com.simibubi.create.content.logistics.block.mechanicalArm;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import org.apache.commons.lang3.mutable.MutableBoolean;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
@ -10,17 +16,25 @@ import com.simibubi.create.content.contraptions.components.crafter.MechanicalCra
import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock; import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock;
import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.components.saw.SawBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock; import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock;
import com.simibubi.create.content.logistics.block.funnel.AbstractFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.ComposterBlock; import net.minecraft.block.ComposterBlock;
@ -39,6 +53,7 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@ -48,9 +63,6 @@ import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.wrapper.InvWrapper; import net.minecraftforge.items.wrapper.InvWrapper;
import javax.annotation.Nullable;
import java.util.function.Supplier;
public abstract class ArmInteractionPoint { public abstract class ArmInteractionPoint {
enum Mode { enum Mode {
@ -65,21 +77,21 @@ public abstract class ArmInteractionPoint {
private ArmAngleTarget cachedAngles; private ArmAngleTarget cachedAngles;
private static ImmutableMap<ArmInteractionPoint, Supplier<ArmInteractionPoint>> POINTS = private static ImmutableMap<ArmInteractionPoint, Supplier<ArmInteractionPoint>> POINTS =
ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder() ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder()
.put(new Saw(), Saw::new) .put(new Saw(), Saw::new)
.put(new Belt(), Belt::new) .put(new Belt(), Belt::new)
.put(new Depot(), Depot::new) .put(new Depot(), Depot::new)
.put(new Chute(), Chute::new) .put(new Chute(), Chute::new)
.put(new Basin(), Basin::new) .put(new Basin(), Basin::new)
.put(new Funnel(), Funnel::new) .put(new Funnel(), Funnel::new)
.put(new Jukebox(), Jukebox::new) .put(new Jukebox(), Jukebox::new)
.put(new Crafter(), Crafter::new) .put(new Crafter(), Crafter::new)
.put(new Deployer(), Deployer::new) .put(new Deployer(), Deployer::new)
.put(new Composter(), Composter::new) .put(new Composter(), Composter::new)
.put(new Millstone(), Millstone::new) .put(new Millstone(), Millstone::new)
.put(new BlazeBurner(), BlazeBurner::new) .put(new BlazeBurner(), BlazeBurner::new)
.put(new CrushingWheels(), CrushingWheels::new) .put(new CrushingWheels(), CrushingWheels::new)
.build(); .build();
public ArmInteractionPoint() { public ArmInteractionPoint() {
cachedHandler = LazyOptional.empty(); cachedHandler = LazyOptional.empty();
@ -108,6 +120,8 @@ public abstract class ArmInteractionPoint {
return isValid(reader, pos, reader.getBlockState(pos)); return isValid(reader, pos, reader.getBlockState(pos));
} }
void keepAlive(IWorld world) {}
abstract boolean isValid(IBlockReader reader, BlockPos pos, BlockState state); abstract boolean isValid(IBlockReader reader, BlockPos pos, BlockState state);
static boolean isInteractable(IBlockReader reader, BlockPos pos, BlockState state) { static boolean isInteractable(IBlockReader reader, BlockPos pos, BlockState state) {
@ -119,7 +133,8 @@ public abstract class ArmInteractionPoint {
ArmAngleTarget getTargetAngles(BlockPos armPos, boolean ceiling) { ArmAngleTarget getTargetAngles(BlockPos armPos, boolean ceiling) {
if (cachedAngles == null) if (cachedAngles == null)
cachedAngles = new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling); cachedAngles =
new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling);
return cachedAngles; return cachedAngles;
} }
@ -167,7 +182,8 @@ public abstract class ArmInteractionPoint {
for (ArmInteractionPoint armInteractionPoint : POINTS.keySet()) for (ArmInteractionPoint armInteractionPoint : POINTS.keySet())
if (armInteractionPoint.isValid(world, pos, state)) if (armInteractionPoint.isValid(world, pos, state))
point = POINTS.get(armInteractionPoint).get(); point = POINTS.get(armInteractionPoint)
.get();
if (point != null) { if (point != null) {
point.state = state; point.state = state;
@ -222,7 +238,7 @@ public abstract class ArmInteractionPoint {
@Override @Override
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.FACING) == Direction.UP return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.FACING) == Direction.UP
&& ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0; && ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0;
} }
} }
@ -260,7 +276,8 @@ public abstract class ArmInteractionPoint {
@Nullable @Nullable
@Override @Override
IItemHandler getHandler(World world) { IItemHandler getHandler(World world) {
return new InvWrapper(((ComposterBlock) Blocks.COMPOSTER).createInventory(world.getBlockState(pos), world, pos)); return new InvWrapper(
((ComposterBlock) Blocks.COMPOSTER).createInventory(world.getBlockState(pos), world, pos));
} }
} }
@ -273,7 +290,8 @@ public abstract class ArmInteractionPoint {
@Override @Override
Direction getInteractionDirection() { Direction getInteractionDirection() {
return state.get(DeployerBlock.FACING).getOpposite(); return state.get(DeployerBlock.FACING)
.getOpposite();
} }
@Override @Override
@ -299,13 +317,15 @@ public abstract class ArmInteractionPoint {
@Override @Override
ItemStack insert(World world, ItemStack stack, boolean simulate) { ItemStack insert(World world, ItemStack stack, boolean simulate) {
ItemStack input = stack.copy(); ItemStack input = stack.copy();
if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true).getResult().isEmpty()) { if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true)
.getResult()
.isEmpty()) {
return stack; return stack;
} }
ActionResult<ItemStack> res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, simulate); ActionResult<ItemStack> res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, simulate);
return res.getType() == ActionResultType.SUCCESS return res.getType() == ActionResultType.SUCCESS
? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1) ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1)
: stack; : stack;
} }
@Override @Override
@ -322,7 +342,8 @@ public abstract class ArmInteractionPoint {
@Override @Override
Direction getInteractionDirection() { Direction getInteractionDirection() {
return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING).getOpposite(); return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING)
.getOpposite();
} }
@Override @Override
@ -376,7 +397,8 @@ public abstract class ArmInteractionPoint {
return stack; return stack;
JukeboxBlock jukeboxBlock = (JukeboxBlock) state.getBlock(); JukeboxBlock jukeboxBlock = (JukeboxBlock) state.getBlock();
JukeboxTileEntity jukeboxTE = (JukeboxTileEntity) tileEntity; JukeboxTileEntity jukeboxTE = (JukeboxTileEntity) tileEntity;
if (!jukeboxTE.getRecord().isEmpty()) if (!jukeboxTE.getRecord()
.isEmpty())
return stack; return stack;
if (!(stack.getItem() instanceof MusicDiscItem)) if (!(stack.getItem() instanceof MusicDiscItem))
return stack; return stack;
@ -415,8 +437,30 @@ public abstract class ArmInteractionPoint {
@Override @Override
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up()).getBlock() instanceof BeltTunnelBlock); return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up())
.getBlock() instanceof BeltTunnelBlock);
} }
@Override
void keepAlive(IWorld world) {
super.keepAlive(world);
BeltTileEntity beltTE = BeltHelper.getSegmentTE(world, pos);
if (beltTE == null)
return;
TransportedItemStackHandlerBehaviour transport =
beltTE.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE);
if (transport == null)
return;
MutableBoolean found = new MutableBoolean(false);
transport.handleProcessingOnAllItems(tis -> {
if (found.isTrue())
return TransportedResult.doNothing();
tis.lockedExternally = true;
found.setTrue();
return TransportedResult.doNothing();
});
}
} }
static class Chute extends TopFaceArmInteractionPoint { static class Chute extends TopFaceArmInteractionPoint {
@ -448,7 +492,8 @@ public abstract class ArmInteractionPoint {
@Override @Override
Direction getInteractionDirection() { Direction getInteractionDirection() {
return FunnelBlock.getFunnelFacing(state).getOpposite(); return FunnelBlock.getFunnelFacing(state)
.getOpposite();
} }
@Override @Override
@ -479,7 +524,9 @@ public abstract class ArmInteractionPoint {
@Override @Override
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
return state.getBlock() instanceof FunnelBlock && !state.get(FunnelBlock.EXTRACTING); return state.getBlock() instanceof AbstractFunnelBlock
&& !(state.contains(FunnelBlock.EXTRACTING) && state.get(FunnelBlock.EXTRACTING))
&& !(state.contains(BeltFunnelBlock.SHAPE) && state.get(BeltFunnelBlock.SHAPE) == Shape.PUSHING);
} }
@Override @Override

View file

@ -65,7 +65,7 @@ public class ArmTileEntity extends KineticTileEntity {
protected int lastOutputIndex = -1; protected int lastOutputIndex = -1;
protected boolean redstoneLocked; protected boolean redstoneLocked;
enum Phase { public enum Phase {
SEARCH_INPUTS, MOVE_TO_INPUT, SEARCH_OUTPUTS, MOVE_TO_OUTPUT, DANCING SEARCH_INPUTS, MOVE_TO_INPUT, SEARCH_OUTPUTS, MOVE_TO_OUTPUT, DANCING
} }
@ -107,9 +107,15 @@ public class ArmTileEntity extends KineticTileEntity {
initInteractionPoints(); initInteractionPoints();
boolean targetReached = tickMovementProgress(); boolean targetReached = tickMovementProgress();
if (world.isRemote) if (chasedPointProgress < 1) {
if (phase == Phase.MOVE_TO_INPUT) {
ArmInteractionPoint point = getTargetedInteractionPoint();
if (point != null)
point.keepAlive(world);
}
return; return;
if (chasedPointProgress < 1) }
if (world.isRemote)
return; return;
if (phase == Phase.MOVE_TO_INPUT) if (phase == Phase.MOVE_TO_INPUT)
@ -491,7 +497,7 @@ public class ArmTileEntity extends KineticTileEntity {
@Override @Override
protected Vector3d getLocalOffset(BlockState state) { protected Vector3d getLocalOffset(BlockState state) {
int yPos = state.get(ArmBlock.CEILING) ? 16 - 3 : 3; int yPos = state.get(ArmBlock.CEILING) ? 16 - 3 : 3;
Vector3d location = VecHelper.voxelSpace(8, yPos, 14.5); Vector3d location = VecHelper.voxelSpace(8, yPos, 15.95);
location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y);
return location; return location;
} }

View file

@ -12,35 +12,32 @@ import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.state.properties.AttachFace; import net.minecraft.state.properties.AttachFace;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntity> implements ITickableInstance { public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntity> implements IDynamicInstance {
protected InstanceKey<ModelData> handle; protected final InstanceKey<ModelData> handle;
protected InstanceKey<ModelData> indicator; protected final InstanceKey<ModelData> indicator;
private float rX; final float rX;
private float rY; final float rY;
public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity tile) { public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
}
@Override RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
protected void init() {
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.MODELS);
handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, lastState).createInstance(); handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, blockState).createInstance();
indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, lastState).createInstance(); indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, blockState).createInstance();
AttachFace face = lastState.get(AnalogLeverBlock.FACE); AttachFace face = blockState.get(AnalogLeverBlock.FACE);
rX = face == AttachFace.FLOOR ? 0 : face == AttachFace.WALL ? 90 : 180; rX = face == AttachFace.FLOOR ? 0 : face == AttachFace.WALL ? 90 : 180;
rY = AngleHelper.horizontalAngle(lastState.get(AnalogLeverBlock.HORIZONTAL_FACING)); rY = AngleHelper.horizontalAngle(blockState.get(AnalogLeverBlock.HORIZONTAL_FACING));
setupModel(); setupModel();
updateLight(); updateLight();
} }
@Override @Override
public void tick() { public void beginFrame() {
if (!tile.clientState.settled()) if (!tile.clientState.settled())
setupModel(); setupModel();
} }
@ -65,7 +62,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
.translate(-1 / 2f, -1 / 16f, -1 / 2f); .translate(-1 / 2f, -1 / 16f, -1 / 2f);
handle.getInstance() handle.getInstance()
.setTransformNoCopy(ms); .setTransform(ms);
} }
@Override @Override

View file

@ -87,7 +87,7 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld {
try { try {
TileEntity tileEntity = blockState.createTileEntity(this); TileEntity tileEntity = blockState.createTileEntity(this);
if (tileEntity != null) { if (tileEntity != null) {
tileEntity.setLocation(this, pos); onTEadded(tileEntity, pos);
tileEntities.put(pos, tileEntity); tileEntities.put(pos, tileEntity);
renderedTileEntities.add(tileEntity); renderedTileEntities.add(tileEntity);
} }
@ -98,6 +98,10 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld {
} }
return null; return null;
} }
protected void onTEadded(TileEntity tileEntity, BlockPos pos) {
tileEntity.setLocation(this, pos);
}
@Override @Override
public BlockState getBlockState(BlockPos globalPos) { public BlockState getBlockState(BlockPos globalPos) {

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