mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-03-02 13:44:39 +01:00
port recent changes
This commit is contained in:
commit
cbbf502003
189 changed files with 6885 additions and 1689 deletions
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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() {
|
||||||
|
|
|
@ -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();
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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) {}
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
Loading…
Add table
Reference in a new issue