mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-11-10 20:11:35 +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
|
||||
fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json
|
||||
b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json
|
||||
<<<<<<< HEAD
|
||||
8e532856c3c2b4e4e59c65a2a81a694e35d14658 assets/create/blockstates/fancy_weathered_limestone_bricks_wall.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
|
||||
5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json
|
||||
e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json
|
||||
|
@ -339,7 +344,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
|
|||
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
|
||||
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
|
||||
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
|
||||
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json
|
||||
8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json
|
||||
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
|
||||
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
|
||||
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
|
||||
|
@ -405,6 +410,7 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
|
|||
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
|
||||
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
|
||||
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
|
||||
<<<<<<< HEAD
|
||||
ff55f756f4bf71c142540d1a415a8dbbae86850e assets/create/lang/en_ud.json
|
||||
eb8e279de2f546a4e285605f2040b4d69a973567 assets/create/lang/en_us.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
|
||||
bd33b944ec6ad89850a1d275b3d2843fe6f831cc assets/create/models/block/acacia_window_pane_side.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
|
||||
5d3d8b3989b087a5e9177951e9246f27a1838e84 assets/create/models/block/adjustable_chain_gearshift_end_horizontal_powered.json
|
||||
0ae6c67468b448f2f05c06f41bb162fafd86846a assets/create/models/block/adjustable_chain_gearshift_end_vertical.json
|
||||
|
|
|
@ -181,9 +181,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "true",
|
||||
"west": "true",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
<<<<<<< HEAD
|
||||
"east": "false",
|
||||
=======
|
||||
"south": "true",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "false"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -192,9 +196,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "true",
|
||||
"west": "false",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
<<<<<<< HEAD
|
||||
"east": "true",
|
||||
=======
|
||||
"south": "true",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "false"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -203,9 +211,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "false",
|
||||
"west": "true",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
<<<<<<< HEAD
|
||||
"east": "false",
|
||||
=======
|
||||
"south": "false",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "true"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -214,9 +226,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "false",
|
||||
"west": "false",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
<<<<<<< HEAD
|
||||
"east": "true",
|
||||
=======
|
||||
"south": "false",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "true"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -225,9 +241,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "true",
|
||||
"west": "false",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
<<<<<<< HEAD
|
||||
"east": "false",
|
||||
=======
|
||||
"south": "true",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "true"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -236,9 +256,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "true",
|
||||
"west": "false",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
<<<<<<< HEAD
|
||||
"east": "false",
|
||||
=======
|
||||
"south": "true",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "false"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -247,9 +271,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "false",
|
||||
"west": "false",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
<<<<<<< HEAD
|
||||
"east": "false",
|
||||
=======
|
||||
"south": "false",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "true"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -258,31 +286,13 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "false",
|
||||
"west": "true",
|
||||
"east": "true",
|
||||
"north": "false"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/lr_y"
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "false",
|
||||
"west": "true",
|
||||
"east": "false",
|
||||
"north": "false"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/lr_y"
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "false",
|
||||
"west": "false",
|
||||
<<<<<<< HEAD
|
||||
"east": "true",
|
||||
=======
|
||||
"south": "false",
|
||||
>>>>>>> mc1.15/dev
|
||||
"north": "false"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -291,9 +301,43 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"south": "false",
|
||||
"west": "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"
|
||||
},
|
||||
"apply": {
|
||||
|
@ -302,10 +346,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "true",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
"down": "false"
|
||||
=======
|
||||
"down": "false",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
"up": "true"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/lu_z"
|
||||
|
@ -313,10 +364,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "true",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
"down": "false"
|
||||
=======
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
"up": "true"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/ru_z"
|
||||
|
@ -324,10 +382,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "false",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
"down": "true"
|
||||
=======
|
||||
"down": "true",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
"up": "false"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/ld_z"
|
||||
|
@ -335,10 +400,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "false",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
"down": "true"
|
||||
=======
|
||||
"down": "true",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
"up": "false"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/rd_z"
|
||||
|
@ -346,10 +418,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "true",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"down": "true"
|
||||
=======
|
||||
"down": "true",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"up": "true"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/ud_z"
|
||||
|
@ -357,10 +436,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "true",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"down": "false"
|
||||
=======
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"up": "true"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/ud_z"
|
||||
|
@ -368,10 +454,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "false",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"down": "true"
|
||||
=======
|
||||
"down": "true",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"up": "false"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/ud_z"
|
||||
|
@ -379,10 +472,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "false",
|
||||
"east": "true",
|
||||
"west": "true",
|
||||
"down": "false"
|
||||
=======
|
||||
"down": "false",
|
||||
"east": "true",
|
||||
"west": "true",
|
||||
"up": "false"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/lr_z"
|
||||
|
@ -390,10 +490,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "false",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
"down": "false"
|
||||
=======
|
||||
"down": "false",
|
||||
"east": "true",
|
||||
"west": "false",
|
||||
"up": "false"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/lr_z"
|
||||
|
@ -401,10 +508,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "false",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
"down": "false"
|
||||
=======
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"west": "true",
|
||||
"up": "false"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/lr_z"
|
||||
|
@ -412,10 +526,17 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
<<<<<<< HEAD
|
||||
"up": "false",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"down": "false"
|
||||
=======
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"west": "false",
|
||||
"up": "false"
|
||||
>>>>>>> mc1.15/dev
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/fluid_pipe/none_z"
|
||||
|
|
|
@ -29,8 +29,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_south": "true"
|
||||
"sticky_south": "true",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x_sticky",
|
||||
|
@ -39,8 +39,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_south": "true"
|
||||
"sticky_south": "true",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y_sticky"
|
||||
|
@ -48,8 +48,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_south": "true"
|
||||
"sticky_south": "true",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x_sticky",
|
||||
|
@ -59,8 +59,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_south": "false"
|
||||
"sticky_south": "false",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x",
|
||||
|
@ -69,8 +69,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_south": "false"
|
||||
"sticky_south": "false",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y"
|
||||
|
@ -78,8 +78,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_south": "false"
|
||||
"sticky_south": "false",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x",
|
||||
|
@ -89,8 +89,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_west": "true"
|
||||
"sticky_west": "true",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x_sticky",
|
||||
|
@ -99,8 +99,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_west": "true"
|
||||
"sticky_west": "true",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y_sticky",
|
||||
|
@ -109,8 +109,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_west": "true"
|
||||
"sticky_west": "true",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_z_sticky",
|
||||
|
@ -119,8 +119,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_west": "false"
|
||||
"sticky_west": "false",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x",
|
||||
|
@ -129,8 +129,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_west": "false"
|
||||
"sticky_west": "false",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y",
|
||||
|
@ -139,8 +139,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_west": "false"
|
||||
"sticky_west": "false",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_z",
|
||||
|
@ -149,8 +149,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_north": "true"
|
||||
"sticky_north": "true",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x_sticky"
|
||||
|
@ -158,8 +158,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_north": "true"
|
||||
"sticky_north": "true",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y_sticky",
|
||||
|
@ -168,8 +168,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_north": "true"
|
||||
"sticky_north": "true",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x_sticky",
|
||||
|
@ -178,8 +178,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_north": "false"
|
||||
"sticky_north": "false",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x"
|
||||
|
@ -187,8 +187,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_north": "false"
|
||||
"sticky_north": "false",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y",
|
||||
|
@ -197,8 +197,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_north": "false"
|
||||
"sticky_north": "false",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x",
|
||||
|
@ -207,8 +207,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_east": "true"
|
||||
"sticky_east": "true",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x_sticky",
|
||||
|
@ -217,8 +217,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_east": "true"
|
||||
"sticky_east": "true",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y_sticky",
|
||||
|
@ -227,8 +227,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_east": "true"
|
||||
"sticky_east": "true",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_z_sticky"
|
||||
|
@ -236,8 +236,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "x",
|
||||
"sticky_east": "false"
|
||||
"sticky_east": "false",
|
||||
"axis": "x"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_x",
|
||||
|
@ -246,8 +246,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "y",
|
||||
"sticky_east": "false"
|
||||
"sticky_east": "false",
|
||||
"axis": "y"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_y",
|
||||
|
@ -256,8 +256,8 @@
|
|||
},
|
||||
{
|
||||
"when": {
|
||||
"axis": "z",
|
||||
"sticky_east": "false"
|
||||
"sticky_east": "false",
|
||||
"axis": "z"
|
||||
},
|
||||
"apply": {
|
||||
"model": "create:block/radial_chassis_side_z"
|
||||
|
|
|
@ -1877,6 +1877,17 @@
|
|||
"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.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.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",
|
||||
|
@ -1899,12 +1910,18 @@
|
|||
"create.ponder.belt_directions.text_3": "2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2002,6 +2035,19 @@
|
|||
"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.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.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",
|
||||
|
@ -2042,7 +2088,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2143,6 +2195,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2243,6 +2314,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 1374",
|
||||
=======
|
||||
"_": "Missing Localizations: 1443",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 405",
|
||||
=======
|
||||
"_": "Missing Localizations: 474",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1300",
|
||||
"_": "Missing Localizations: 1373",
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1911,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2089,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2196,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2315,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 1086",
|
||||
=======
|
||||
"_": "Missing Localizations: 1155",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 422",
|
||||
=======
|
||||
"_": "Missing Localizations: 491",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 429",
|
||||
=======
|
||||
"_": "Missing Localizations: 498",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 475",
|
||||
=======
|
||||
"_": "Missing Localizations: 544",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 1573",
|
||||
=======
|
||||
"_": "Missing Localizations: 1642",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
<<<<<<< HEAD
|
||||
"_": "Missing Localizations: 1639",
|
||||
=======
|
||||
"_": "Missing Localizations: 1708",
|
||||
>>>>>>> mc1.15/dev
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1915,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2093,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2200,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2319,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 421",
|
||||
"_": "Missing Localizations: 494",
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1911,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2089,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2196,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2315,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 419",
|
||||
"_": "Missing Localizations: 492",
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1911,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2089,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2196,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2315,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 424",
|
||||
"_": "Missing Localizations: 497",
|
||||
|
||||
"_": "->------------------------] 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_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.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",
|
||||
|
@ -1900,12 +1911,18 @@
|
|||
"create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally",
|
||||
"create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically",
|
||||
"create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally",
|
||||
"create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks",
|
||||
"create.ponder.belt_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.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.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.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.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2043,7 +2089,7 @@
|
|||
"create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
|
||||
|
||||
"create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.",
|
||||
"create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting",
|
||||
|
||||
"create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer",
|
||||
"create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2144,6 +2196,18 @@
|
|||
"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_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.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",
|
||||
|
@ -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_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.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",
|
||||
|
@ -2244,6 +2315,17 @@
|
|||
"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.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.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",
|
||||
|
@ -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_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.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",
|
||||
|
|
|
@ -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.instancing.InstancedModel;
|
||||
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.utility.AngleHelper;
|
||||
import com.simibubi.create.foundation.utility.Iterate;
|
||||
|
@ -277,7 +276,7 @@ public class AllBlockPartials {
|
|||
.unCentre();
|
||||
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)
|
||||
.add(3, 12, 3, 13, 16, 13)
|
||||
.forDirectional(Direction.UP),
|
||||
CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16)
|
||||
.forDirectional(Direction.DOWN)
|
||||
|
||||
CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16).forDirectional(Direction.DOWN)
|
||||
|
||||
;
|
||||
|
||||
|
@ -144,12 +142,12 @@ public class AllShapes {
|
|||
.add(2, 0, 2, 14, 2, 14)
|
||||
.build(),
|
||||
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)
|
||||
.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),
|
||||
SEAT = cuboid(0, 0, 0, 16, 8, 16),
|
||||
CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 16, 16), SEAT = cuboid(0, 0, 0, 16, 8, 16),
|
||||
SEAT_COLLISION = cuboid(0, 0, 0, 16, 6, 16),
|
||||
MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.fullCube()).erase(4, 0, 4, 12, 16, 12)
|
||||
.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)
|
||||
.build(),
|
||||
MECHANICAL_ARM = shape(2, 0, 2, 14, 10, 14).add(3, 0, 3, 13, 14, 13)
|
||||
.add(0, 0, 0, 16, 6, 16)
|
||||
.build(),
|
||||
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(),
|
||||
CHUTE = shape(1, 8, 1, 15, 16, 15).add(2, 0, 2, 14, 8, 14)
|
||||
.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.DepotTileEntity;
|
||||
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.AdjustableRepeaterTileEntity;
|
||||
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.foundation.tileEntity.renderer.SmartTileEntityRenderer;
|
||||
import com.tterrag.registrate.util.entry.TileEntityEntry;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
|
||||
public class AllTileEntities {
|
||||
|
||||
|
@ -595,6 +594,7 @@ public class AllTileEntities {
|
|||
|
||||
public static final TileEntityEntry<AdjustableRepeaterTileEntity> ADJUSTABLE_REPEATER = Create.registrate()
|
||||
.tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new)
|
||||
.instance(() -> AdjustableRepeaterInstance::new)
|
||||
.validBlocks(AllBlocks.ADJUSTABLE_REPEATER)
|
||||
.renderer(() -> AdjustableRepeaterRenderer::new)
|
||||
.register();
|
||||
|
@ -602,6 +602,7 @@ public class AllTileEntities {
|
|||
public static final TileEntityEntry<AdjustablePulseRepeaterTileEntity> ADJUSTABLE_PULSE_REPEATER =
|
||||
Create.registrate()
|
||||
.tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new)
|
||||
.instance(() -> AdjustableRepeaterInstance::new)
|
||||
.validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER)
|
||||
.renderer(() -> AdjustableRepeaterRenderer::new)
|
||||
.register();
|
||||
|
|
|
@ -14,10 +14,10 @@ public class HalfShaftInstance extends SingleRotatingInstance {
|
|||
@Override
|
||||
protected InstancedModel<RotatingData> getModel() {
|
||||
Direction dir = getShaftDirection();
|
||||
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, dir);
|
||||
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir);
|
||||
}
|
||||
|
||||
protected Direction getShaftDirection() {
|
||||
return lastState.get(BlockStateProperties.FACING);
|
||||
return blockState.get(BlockStateProperties.FACING);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,6 @@ public class HorizontalHalfShaftInstance extends HalfShaftInstance {
|
|||
|
||||
@Override
|
||||
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.VertexAttribSpec;
|
||||
|
||||
public enum KineticVertexAttributes implements IVertexAttrib {
|
||||
public enum KineticAttributes implements IVertexAttrib {
|
||||
INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3),
|
||||
LIGHT("aLight", CommonAttributes.LIGHT),
|
||||
NETWORK_COLOR("aNetworkTint", CommonAttributes.RGB),
|
||||
SPEED("aSpeed", CommonAttributes.FLOAT),
|
||||
OFFSET("aOffset", CommonAttributes.FLOAT),
|
||||
;
|
||||
|
@ -16,7 +14,7 @@ public enum KineticVertexAttributes implements IVertexAttrib {
|
|||
private final String name;
|
||||
private final VertexAttribSpec spec;
|
||||
|
||||
KineticVertexAttributes(String name, VertexAttribSpec spec) {
|
||||
KineticAttributes(String name, VertexAttribSpec spec) {
|
||||
this.name = name;
|
||||
this.spec = spec;
|
||||
}
|
|
@ -1,23 +1,17 @@
|
|||
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.impl.IFlatLight;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.impl.BasicData;
|
||||
import com.simibubi.create.foundation.utility.ColorHelper;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.vector.Vector3f;
|
||||
|
||||
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 y;
|
||||
private float z;
|
||||
private byte blockLight;
|
||||
private byte skyLight;
|
||||
private byte r;
|
||||
private byte g;
|
||||
private byte b;
|
||||
private float rotationalSpeed;
|
||||
private float rotationOffset;
|
||||
|
||||
|
@ -25,25 +19,25 @@ public class KineticData<D extends KineticData<D>> extends InstanceData implemen
|
|||
super(owner);
|
||||
}
|
||||
|
||||
public D setTileEntity(KineticTileEntity te) {
|
||||
public KineticData setTileEntity(KineticTileEntity te) {
|
||||
setPosition(te.getPos());
|
||||
if (te.hasSource()) {
|
||||
setColor(te.network);
|
||||
}else {
|
||||
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());
|
||||
}
|
||||
|
||||
public D setPosition(Vector3f pos) {
|
||||
public KineticData setPosition(Vector3f pos) {
|
||||
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();
|
||||
|
||||
return setPosition((float) (x - origin.getX()),
|
||||
|
@ -51,75 +45,62 @@ public class KineticData<D extends KineticData<D>> extends InstanceData implemen
|
|||
(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.y = y;
|
||||
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.y += y;
|
||||
this.z += z;
|
||||
return (D) this;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
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) {
|
||||
public KineticData setColor(Long l) {
|
||||
if (l != null)
|
||||
return setColor(l.longValue());
|
||||
else
|
||||
return setColor(0xFF, 0xFF, 0xFF);
|
||||
else {
|
||||
setColor(0xFF, 0xFF, 0xFF);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
private D setColor(long l) {
|
||||
private KineticData setColor(long l) {
|
||||
int color = ColorHelper.colorFromLong(l);
|
||||
byte r = (byte) ((color >> 16) & 0xFF);
|
||||
byte g = (byte) ((color >> 8) & 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) {
|
||||
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) {
|
||||
public KineticData setRotationalSpeed(float rotationalSpeed) {
|
||||
this.rotationalSpeed = rotationalSpeed;
|
||||
return (D) this;
|
||||
return this;
|
||||
}
|
||||
|
||||
public D setRotationOffset(float rotationOffset) {
|
||||
public KineticData setRotationOffset(float rotationOffset) {
|
||||
this.rotationOffset = rotationOffset;
|
||||
return (D) this;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void write(ByteBuffer buf) {
|
||||
putVec3(buf, x, y, z);
|
||||
putVec2(buf, blockLight, skyLight);
|
||||
putVec3(buf, r, g, b);
|
||||
put(buf, rotationalSpeed);
|
||||
put(buf, rotationOffset);
|
||||
super.write(buf);
|
||||
|
||||
buf.asFloatBuffer().put(new float[] {
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
rotationalSpeed,
|
||||
rotationOffset
|
||||
});
|
||||
|
||||
buf.position(buf.position() + 5 * 4);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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.logistics.block.FlapData;
|
||||
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<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<>();
|
||||
}
|
||||
|
|
|
@ -15,27 +15,38 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
|
|||
}
|
||||
|
||||
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis) {
|
||||
key.getInstance()
|
||||
.setColor(tile.network)
|
||||
.setRotationalSpeed(tile.getSpeed())
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(axis);
|
||||
updateRotation(key, axis, tile.getSpeed());
|
||||
}
|
||||
|
||||
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis, float speed) {
|
||||
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) {
|
||||
key.getInstance()
|
||||
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
|
||||
.setSkyLight(world.getLightLevel(LightType.SKY, pos))
|
||||
.setTileEntity(tile)
|
||||
.setRotationalSpeed(speed)
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(axis);
|
||||
.setRotationAxis(axis)
|
||||
.setRotationalSpeed(speed)
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setTileEntity(tile)
|
||||
.setSkyLight(world.getLightLevel(LightType.SKY, pos))
|
||||
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos));
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
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())
|
||||
+ ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2;
|
||||
if (d == 0) {
|
||||
|
@ -50,7 +61,7 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
|
|||
}
|
||||
|
||||
public Direction.Axis getRotationAxis() {
|
||||
return ((IRotate) lastState.getBlock()).getRotationAxis(lastState);
|
||||
return ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
||||
}
|
||||
|
||||
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.VertexAttribSpec;
|
||||
|
||||
public enum RotatingVertexAttributes implements IVertexAttrib {
|
||||
public enum RotatingAttributes implements IVertexAttrib {
|
||||
AXIS("aAxis", CommonAttributes.NORMAL),
|
||||
;
|
||||
|
||||
private final String name;
|
||||
private final VertexAttribSpec spec;
|
||||
|
||||
RotatingVertexAttributes(String name, VertexAttribSpec spec) {
|
||||
RotatingAttributes(String name, VertexAttribSpec spec) {
|
||||
this.name = name;
|
||||
this.spec = spec;
|
||||
}
|
|
@ -2,18 +2,12 @@ package com.simibubi.create.content.contraptions.base;
|
|||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
||||
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.vector.Vector3f;
|
||||
|
||||
public class RotatingData extends KineticData<RotatingData> {
|
||||
public static VertexFormat FORMAT = VertexFormat.builder()
|
||||
.addAttributes(KineticVertexAttributes.class)
|
||||
.addAttributes(RotatingVertexAttributes.class)
|
||||
.build();
|
||||
|
||||
public class RotatingData extends KineticData {
|
||||
private byte rotationAxisX;
|
||||
private byte rotationAxisY;
|
||||
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.instancing.InstancedModel;
|
||||
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;
|
||||
|
||||
public class RotatingInstancedModel extends InstancedModel<RotatingData> {
|
||||
public RotatingInstancedModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
|
||||
public class RotatingModel extends InstancedModel<RotatingData> {
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -18,7 +25,7 @@ public class RotatingInstancedModel extends InstancedModel<RotatingData> {
|
|||
|
||||
@Override
|
||||
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> {
|
||||
|
||||
protected InstanceKey<RotatingData> rotatingModelKey;
|
||||
protected final InstanceKey<RotatingData> rotatingModelKey;
|
||||
|
||||
public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState);
|
||||
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
||||
rotatingModelKey = setup(getModel().createInstance(), tile.getSpeed(), axis);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState);
|
||||
public void update() {
|
||||
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
||||
updateRotation(rotatingModelKey, axis);
|
||||
}
|
||||
|
||||
|
@ -39,7 +36,7 @@ public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntit
|
|||
}
|
||||
|
||||
protected BlockState getRenderedBlockState() {
|
||||
return lastState;
|
||||
return blockState;
|
||||
}
|
||||
|
||||
protected InstancedModel<RotatingData> getModel() {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
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.InstancedModel;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -9,11 +8,7 @@ import net.minecraft.util.math.vector.Vector3f;
|
|||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public class ContraptionActorData extends InstanceData {
|
||||
public static VertexFormat FORMAT = VertexFormat.builder()
|
||||
.addAttributes(ActorVertexAttributes.class)
|
||||
.build();
|
||||
|
||||
public class ActorData extends InstanceData {
|
||||
private float x;
|
||||
private float y;
|
||||
private float z;
|
||||
|
@ -33,63 +28,63 @@ public class ContraptionActorData extends InstanceData {
|
|||
|
||||
private float speed;
|
||||
|
||||
protected ContraptionActorData(InstancedModel<?> owner) {
|
||||
protected ActorData(InstancedModel<?> owner) {
|
||||
super(owner);
|
||||
}
|
||||
|
||||
|
||||
public ContraptionActorData setPosition(BlockPos pos) {
|
||||
public ActorData setPosition(BlockPos pos) {
|
||||
this.x = pos.getX();
|
||||
this.y = pos.getY();
|
||||
this.z = pos.getZ();
|
||||
return this;
|
||||
}
|
||||
|
||||
public ContraptionActorData setBlockLight(int blockLight) {
|
||||
public ActorData setBlockLight(int blockLight) {
|
||||
this.blockLight = (byte) ((blockLight & 0xF) << 4);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ContraptionActorData setSkyLight(int skyLight) {
|
||||
public ActorData setSkyLight(int skyLight) {
|
||||
this.skyLight = (byte) ((skyLight & 0xF) << 4);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ContraptionActorData setRotationOffset(float rotationOffset) {
|
||||
public ActorData setRotationOffset(float rotationOffset) {
|
||||
this.rotationOffset = rotationOffset;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ContraptionActorData setSpeed(float speed) {
|
||||
public ActorData setSpeed(float speed) {
|
||||
this.speed = speed;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ContraptionActorData setRotationAxis(Vector3f axis) {
|
||||
public ActorData setRotationAxis(Vector3f axis) {
|
||||
setRotationAxis(axis.getX(), axis.getY(), axis.getZ());
|
||||
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.rotationAxisY = (byte) (rotationAxisY * 127);
|
||||
this.rotationAxisZ = (byte) (rotationAxisZ * 127);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ContraptionActorData setRotationCenter(Vector3f axis) {
|
||||
public ActorData setRotationCenter(Vector3f axis) {
|
||||
setRotationCenter(axis.getX(), axis.getY(), axis.getZ());
|
||||
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.rotationCenterY = (byte) (rotationCenterY * 127);
|
||||
this.rotationCenterZ = (byte) (rotationCenterZ * 127);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ContraptionActorData setLocalRotation(Quaternion q) {
|
||||
public ActorData setLocalRotation(Quaternion q) {
|
||||
this.qX = q.getX();
|
||||
this.qY = q.getY();
|
||||
this.qZ = q.getZ();
|
|
@ -6,18 +6,22 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRen
|
|||
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
|
||||
public class RotatingActorModel extends InstancedModel<ContraptionActorData> {
|
||||
public RotatingActorModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
|
||||
public class ActorModel extends InstancedModel<ActorData> {
|
||||
public static VertexFormat FORMAT = VertexFormat.builder()
|
||||
.addAttributes(ActorVertexAttributes.class)
|
||||
.build();
|
||||
|
||||
public ActorModel(InstancedTileRenderer<?> renderer, BufferBuilder buf) {
|
||||
super(renderer, buf);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VertexFormat getInstanceFormat() {
|
||||
return ContraptionActorData.FORMAT;
|
||||
return FORMAT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ContraptionActorData newInstance() {
|
||||
return new ContraptionActorData(this);
|
||||
protected ActorData newInstance() {
|
||||
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.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.foundation.render.backend.instancing.InstanceKey;
|
||||
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.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;
|
||||
|
||||
public DrillActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
|
||||
super(modelManager, context);
|
||||
|
||||
RenderMaterial<?, InstancedModel<ContraptionActorData>> renderMaterial = modelManager.getActorMaterial();
|
||||
RenderMaterial<?, InstancedModel<ActorData>> renderMaterial = modelManager.getActorMaterial();
|
||||
|
||||
BlockState state = context.state;
|
||||
|
||||
|
@ -48,11 +47,10 @@ public class DrillActorInstance extends ActorInstance {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void tick() {
|
||||
public void beginFrame() {
|
||||
drillHead.getInstance().setSpeed(getSpeed(facing));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getSpeed(Direction facing) {
|
||||
if (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()))
|
||||
return context.getAnimationSpeed();
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.simibubi.create.content.contraptions.components.actors;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
|
||||
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.InstancedModel;
|
||||
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.util.Direction;
|
||||
import net.minecraft.util.math.vector.Quaternion;
|
||||
import net.minecraft.util.math.vector.Vector3f;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
|
||||
import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING;
|
||||
|
||||
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 float horizontalAngle;
|
||||
|
||||
private double rotation;
|
||||
private double previousRotation;
|
||||
|
||||
public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
|
||||
super(modelManager, context);
|
||||
|
||||
RenderMaterial<?, InstancedModel<ContraptionActorData>> renderMaterial = modelManager.getActorMaterial();
|
||||
RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.transformMaterial();
|
||||
|
||||
BlockState state = context.state;
|
||||
|
||||
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();
|
||||
|
||||
float horizontalAngle = facing.getHorizontalAngle() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0);
|
||||
horizontalAngle = facing.getHorizontalAngle() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0);
|
||||
|
||||
harvester.getInstance()
|
||||
.setPosition(context.localPos)
|
||||
.setBlockLight(localBlockLight())
|
||||
.setRotationOffset(0)
|
||||
.setRotationCenter(rotOffset)
|
||||
.setRotationAxis(-1, 0, 0)
|
||||
.setLocalRotation(new Quaternion(Vector3f.POSITIVE_Y, horizontalAngle, true))
|
||||
.setSpeed(getSpeed(facing));
|
||||
.setBlockLight(localBlockLight());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tick() {
|
||||
harvester.getInstance().setSpeed(getSpeed(facing));
|
||||
public void tick() {
|
||||
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
|
||||
protected InstancedModel<RotatingData> getModel() {
|
||||
Direction facing = lastState.get(MechanicalCrafterBlock.HORIZONTAL_FACING);
|
||||
Direction facing = blockState.get(MechanicalCrafterBlock.HORIZONTAL_FACING);
|
||||
|
||||
Supplier<MatrixStack> ms = () -> {
|
||||
MatrixStack stack = new MatrixStack();
|
||||
|
@ -34,6 +34,6 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance {
|
|||
stacker.unCentre();
|
||||
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.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
||||
|
@ -46,7 +45,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
IDLE, ACCEPTING, ASSEMBLING, EXPORTING, WAITING, CRAFTING, INSERTING;
|
||||
}
|
||||
|
||||
static class Inventory extends SmartInventory {
|
||||
public static class Inventory extends SmartInventory {
|
||||
|
||||
private MechanicalCrafterTileEntity te;
|
||||
|
||||
|
@ -57,11 +56,11 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
whenContentsChanged(slot -> {
|
||||
if (getStackInSlot(slot).isEmpty())
|
||||
return;
|
||||
if(te.phase == Phase.IDLE)
|
||||
if (te.phase == Phase.IDLE)
|
||||
te.checkCompletedRecipe(false);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
|
||||
if (te.phase != Phase.IDLE)
|
||||
|
@ -70,9 +69,9 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
return stack;
|
||||
return super.insertItem(slot, stack, simulate);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected Inventory inventory;
|
||||
protected GroupedItems groupedItems = new GroupedItems();
|
||||
protected ConnectedInput input = new ConnectedInput();
|
||||
|
@ -87,13 +86,15 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
private InvManipulationBehaviour inserting;
|
||||
private EdgeInteractionBehaviour connectivity;
|
||||
|
||||
private ItemStack scriptedResult = ItemStack.EMPTY;
|
||||
|
||||
public MechanicalCrafterTileEntity(TileEntityType<? extends MechanicalCrafterTileEntity> type) {
|
||||
super(type);
|
||||
setLazyTickRate(20);
|
||||
phase = Phase.IDLE;
|
||||
groupedItemsBeforeCraft = new GroupedItems();
|
||||
inventory = new Inventory(this);
|
||||
|
||||
|
||||
// Does not get serialized due to active checking in tick
|
||||
wasPoweredBefore = true;
|
||||
}
|
||||
|
@ -118,7 +119,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
public BlockFace getTargetFace(World world, BlockPos pos, BlockState state) {
|
||||
return new BlockFace(pos, MechanicalCrafterBlock.getTargetDirection(state));
|
||||
}
|
||||
|
||||
|
||||
public Direction getTargetDirection() {
|
||||
return MechanicalCrafterBlock.getTargetDirection(getBlockState());
|
||||
}
|
||||
|
@ -140,7 +141,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
compound.putBoolean("Cover", covered);
|
||||
|
||||
super.write(compound, clientPacket);
|
||||
|
||||
|
||||
if (clientPacket && reRender) {
|
||||
compound.putBoolean("Redraw", true);
|
||||
reRender = false;
|
||||
|
@ -151,7 +152,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) {
|
||||
Phase phaseBefore = phase;
|
||||
GroupedItems before = this.groupedItems;
|
||||
|
||||
|
||||
inventory.deserializeNBT(compound.getCompound("Inventory"));
|
||||
input.read(compound.getCompound("ConnectedInput"));
|
||||
groupedItems = GroupedItems.read(compound.getCompound("GroupedItems"));
|
||||
|
@ -164,7 +165,6 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
countDown = compound.getInt("CountDown");
|
||||
covered = compound.getBoolean("Cover");
|
||||
super.fromTag(state, compound, clientPacket);
|
||||
|
||||
if (!clientPacket)
|
||||
return;
|
||||
if (compound.contains("Redraw"))
|
||||
|
@ -200,10 +200,13 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
if (phase == Phase.ACCEPTING)
|
||||
return;
|
||||
|
||||
boolean onClient = world.isRemote;
|
||||
boolean runLogic = !onClient || isVirtual();
|
||||
|
||||
if (wasPoweredBefore != world.isBlockPowered(pos)) {
|
||||
wasPoweredBefore = world.isBlockPowered(pos);
|
||||
if (wasPoweredBefore) {
|
||||
if (world.isRemote)
|
||||
if (!runLogic)
|
||||
return;
|
||||
checkCompletedRecipe(true);
|
||||
}
|
||||
|
@ -213,7 +216,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
countDown -= getCountDownSpeed();
|
||||
if (countDown < 0) {
|
||||
countDown = 0;
|
||||
if (world.isRemote)
|
||||
if (!runLogic)
|
||||
return;
|
||||
if (RecipeGridHandler.getTargetingCrafter(this) != null) {
|
||||
phase = Phase.EXPORTING;
|
||||
|
@ -221,9 +224,11 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
sendData();
|
||||
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<>();
|
||||
groupedItems.grid.values()
|
||||
.forEach(stack -> {
|
||||
|
@ -232,6 +237,9 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
.copy());
|
||||
});
|
||||
|
||||
if (isVirtual())
|
||||
groupedItemsBeforeCraft = groupedItems;
|
||||
|
||||
groupedItems = new GroupedItems(result);
|
||||
for (int i = 0; i < containers.size(); i++) {
|
||||
ItemStack stack = containers.get(i);
|
||||
|
@ -255,7 +263,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
|
||||
if (countDown < 0) {
|
||||
countDown = 0;
|
||||
if (world.isRemote)
|
||||
if (!runLogic)
|
||||
return;
|
||||
|
||||
MechanicalCrafterTileEntity targetingCrafter = RecipeGridHandler.getTargetingCrafter(this);
|
||||
|
@ -278,7 +286,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
|
||||
if (phase == Phase.CRAFTING) {
|
||||
|
||||
if (world.isRemote) {
|
||||
if (onClient) {
|
||||
Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING);
|
||||
float progress = countDown / 2000f;
|
||||
Vector3d facingVec = Vector3d.of(facing.getDirectionVec());
|
||||
|
@ -314,7 +322,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
countDown -= getCountDownSpeed();
|
||||
if (countDown < 0) {
|
||||
countDown = 0;
|
||||
if (world.isRemote)
|
||||
if (!runLogic)
|
||||
return;
|
||||
tryInsert();
|
||||
return;
|
||||
|
@ -322,7 +330,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
}
|
||||
|
||||
if (phase == Phase.INSERTING) {
|
||||
if (!world.isRemote && isTargetingBelt())
|
||||
if (runLogic && isTargetingBelt())
|
||||
tryInsert();
|
||||
return;
|
||||
}
|
||||
|
@ -359,7 +367,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
stack.setCount(remainder.getCount());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
inserted.add(pair);
|
||||
}
|
||||
|
||||
|
@ -405,7 +413,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
@Override
|
||||
public void lazyTick() {
|
||||
super.lazyTick();
|
||||
if (world.isRemote)
|
||||
if (world.isRemote && !isVirtual())
|
||||
return;
|
||||
if (phase == Phase.IDLE && craftingItemPresent())
|
||||
checkCompletedRecipe(false);
|
||||
|
@ -426,7 +434,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
protected void checkCompletedRecipe(boolean poweredStart) {
|
||||
if (getSpeed() == 0)
|
||||
return;
|
||||
if (world.isRemote)
|
||||
if (world.isRemote && !isVirtual())
|
||||
return;
|
||||
List<MechanicalCrafterTileEntity> chain = RecipeGridHandler.getAllCraftersOfChainIf(this,
|
||||
poweredStart ? MechanicalCrafterTileEntity::craftingItemPresent
|
||||
|
@ -466,11 +474,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
|
||||
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
|
||||
if (getBlockState().get(HORIZONTAL_FACING) == side)
|
||||
return LazyOptional.empty();
|
||||
if (isItemHandlerCap(cap))
|
||||
return invSupplier.cast();
|
||||
}
|
||||
return super.getCapability(cap, side);
|
||||
}
|
||||
|
||||
|
@ -490,4 +495,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
|
|||
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.content.contraptions.base.KineticTileEntity;
|
||||
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.InstancedModel;
|
||||
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.utility.AnimationTickHolder;
|
||||
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.util.Direction;
|
||||
|
||||
public class HandCrankInstance extends SingleRotatingInstance implements ITickableInstance {
|
||||
public class HandCrankInstance extends SingleRotatingInstance implements IDynamicInstance {
|
||||
|
||||
private InstanceKey<ModelData> crank;
|
||||
private Direction facing;
|
||||
|
||||
public HandCrankInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
Block block = lastState.getBlock();
|
||||
Block block = blockState.getBlock();
|
||||
AllBlockPartials renderedHandle = null;
|
||||
if (block instanceof HandCrankBlock)
|
||||
renderedHandle = ((HandCrankBlock) block).getRenderedHandle();
|
||||
if (renderedHandle == null)
|
||||
return;
|
||||
|
||||
facing = lastState.get(BlockStateProperties.FACING);
|
||||
InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, lastState, facing.getOpposite());
|
||||
facing = blockState.get(BlockStateProperties.FACING);
|
||||
InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, blockState, facing.getOpposite());
|
||||
crank = model.createInstance();
|
||||
|
||||
updateLight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
if (crank == null) return;
|
||||
|
||||
HandCrankTileEntity crankTile = (HandCrankTileEntity) tile;
|
||||
|
@ -58,7 +53,7 @@ public class HandCrankInstance extends SingleRotatingInstance implements ITickab
|
|||
.rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle)
|
||||
.unCentre();
|
||||
|
||||
crank.getInstance().setTransformNoCopy(ms);
|
||||
crank.getInstance().setTransform(ms);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -37,7 +37,7 @@ public class DeployerActorInstance extends ActorInstance {
|
|||
public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
|
||||
super(modelManager, context);
|
||||
|
||||
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.basicMaterial();
|
||||
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.transformMaterial();
|
||||
|
||||
BlockState state = context.state;
|
||||
DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class);
|
||||
|
@ -62,16 +62,16 @@ public class DeployerActorInstance extends ActorInstance {
|
|||
int blockLight = localBlockLight();
|
||||
|
||||
shaft.getInstance()
|
||||
.setBlockLight(blockLight)
|
||||
.setRotationAxis(axis)
|
||||
.setPosition(context.localPos);
|
||||
.setRotationAxis(axis)
|
||||
.setPosition(context.localPos)
|
||||
.setBlockLight(blockLight);
|
||||
|
||||
pole.getInstance().setBlockLight(blockLight);
|
||||
hand.getInstance().setBlockLight(blockLight);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tick() {
|
||||
public void beginFrame() {
|
||||
double factor;
|
||||
if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) {
|
||||
factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f;
|
||||
|
@ -91,6 +91,23 @@ public class DeployerActorInstance extends ActorInstance {
|
|||
msr.translate(context.localPos)
|
||||
.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;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||
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.InstanceKey;
|
||||
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.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.utility.MatrixStacker;
|
||||
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
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.Vector3i;
|
||||
|
||||
import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE;
|
||||
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;
|
||||
InstanceKey<ModelData> hand;
|
||||
|
||||
float yRot;
|
||||
float zRot;
|
||||
float zRotPole;
|
||||
|
||||
float progress = Float.NaN;
|
||||
private boolean newHand = false;
|
||||
|
||||
public DeployerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
||||
super(dispatcher, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
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);
|
||||
zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 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();
|
||||
relight(pos, pole.getInstance());
|
||||
|
||||
updateRotation(pole, hand, yRot, zRot, zRotPole);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
newHand = updateHandPose();
|
||||
}
|
||||
|
||||
boolean newHand = updateHandPose();
|
||||
@Override
|
||||
public void beginFrame() {
|
||||
|
||||
float newProgress = getProgress(AnimationTickHolder.getPartialTicks());
|
||||
|
||||
if (!newHand && MathHelper.epsilonEquals(newProgress, progress)) return;
|
||||
|
||||
progress = newProgress;
|
||||
newHand = false;
|
||||
|
||||
MatrixStack ms = new MatrixStack();
|
||||
MatrixStacker msr = MatrixStacker.of(ms);
|
||||
float handLength = currentHand == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0
|
||||
: 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())
|
||||
.translate(getHandOffset());
|
||||
float x = blockPos.getX() + ((float) facingVec.getX()) * distance;
|
||||
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();
|
||||
|
||||
hand = modelManager.basicMaterial().getModel(currentHand, lastState).createInstance();
|
||||
hand = RenderMaterials.ORIENTED.get(modelManager).getModel(currentHand, blockState).createInstance();
|
||||
|
||||
relight(pos, hand.getInstance());
|
||||
updateRotation(pole, hand, yRot, zRot, zRotPole);
|
||||
|
||||
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) {
|
||||
if (tile.state == DeployerTileEntity.State.EXPANDING)
|
||||
return 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f;
|
||||
|
@ -124,20 +127,15 @@ public class DeployerInstance extends ShaftInstance implements ITickableInstance
|
|||
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();
|
||||
msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI));
|
||||
msr.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI));
|
||||
Quaternion q = Direction.SOUTH.getUnitVector().getDegreesQuaternion(zRot);
|
||||
q.multiply(Direction.UP.getUnitVector().getDegreesQuaternion(yRot));
|
||||
|
||||
msr.push();
|
||||
msr.rotate(Direction.SOUTH, (float) ((zRotPole) / 180 * Math.PI));
|
||||
msr.unCentre();
|
||||
pole.getInstance().setTransform(msr.unwrap());
|
||||
msr.pop();
|
||||
hand.getInstance().setRotation(q);
|
||||
|
||||
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.RotatingData;
|
||||
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 net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -15,37 +14,27 @@ import static net.minecraft.state.properties.BlockStateProperties.FACING;
|
|||
|
||||
public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
|
||||
|
||||
protected InstanceKey<RotatingData> shaft;
|
||||
protected InstanceKey<RotatingData> fan;
|
||||
protected final InstanceKey<RotatingData> shaft;
|
||||
protected final InstanceKey<RotatingData> fan;
|
||||
final Direction.Axis axis;
|
||||
final Direction direction;
|
||||
|
||||
public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
final Direction direction = lastState.get(FACING);
|
||||
final Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState);
|
||||
direction = blockState.get(FACING);
|
||||
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
||||
|
||||
InstancedModel<RotatingData> shaftHalf =
|
||||
AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite());
|
||||
InstancedModel<RotatingData> fanInner =
|
||||
AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite());
|
||||
shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
|
||||
fan = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
|
||||
|
||||
shaft = shaftHalf.createInstance();
|
||||
shaft.getInstance()
|
||||
.setRotationalSpeed(tile.getSpeed())
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
||||
.setTileEntity(tile);
|
||||
RotatingData shaftInstance = shaft.getInstance();
|
||||
shaftInstance.setTileEntity(tile);
|
||||
updateRotation(shaftInstance, axis);
|
||||
|
||||
|
||||
fan = fanInner.createInstance();
|
||||
fan.getInstance()
|
||||
.setRotationalSpeed(getFanSpeed())
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
||||
.setTileEntity(tile);
|
||||
RotatingData fanInstance = fan.getInstance();
|
||||
fanInstance.setTileEntity(tile);
|
||||
updateRotation(fanInstance, axis, getFanSpeed());
|
||||
|
||||
updateLight();
|
||||
}
|
||||
|
@ -60,21 +49,13 @@ public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void onUpdate() {
|
||||
Direction.Axis axis = lastState.get(FACING).getAxis();
|
||||
protected void update() {
|
||||
updateRotation(shaft, axis);
|
||||
|
||||
fan.getInstance()
|
||||
.setColor(tile.network)
|
||||
.setRotationalSpeed(getFanSpeed())
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector());
|
||||
updateRotation(fan, axis, getFanSpeed());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLight() {
|
||||
final Direction direction = lastState.get(FACING);
|
||||
|
||||
BlockPos behind = pos.offset(direction.getOpposite());
|
||||
relight(behind, shaft.getInstance());
|
||||
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package com.simibubi.create.content.contraptions.components.flywheel;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
|
@ -17,26 +20,24 @@ import net.minecraft.util.Direction;
|
|||
import net.minecraft.util.Rotation;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> implements IDynamicInstance {
|
||||
|
||||
public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> implements ITickableInstance {
|
||||
protected final Direction facing;
|
||||
protected final Direction connection;
|
||||
|
||||
protected Direction facing;
|
||||
protected boolean connectedLeft;
|
||||
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> lowerRotating;
|
||||
protected InstanceKey<ModelData> upperSliding;
|
||||
protected InstanceKey<ModelData> lowerSliding;
|
||||
|
||||
protected List<InstanceKey<ModelData>> connectors;
|
||||
|
||||
protected float lastAngle = Float.NaN;
|
||||
|
||||
|
@ -44,31 +45,28 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
|||
|
||||
public FlyWheelInstance(InstancedTileRenderer<?> modelManager, FlywheelTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
facing = lastState.get(BlockStateProperties.HORIZONTAL_FACING);
|
||||
facing = blockState.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);
|
||||
|
||||
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) {
|
||||
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;
|
||||
|
||||
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();
|
||||
lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, lastState).createInstance();
|
||||
upperSliding = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_SLIDING, lastState).createInstance();
|
||||
lowerSliding = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_SLIDING, lastState).createInstance();
|
||||
upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance();
|
||||
lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance();
|
||||
upperSliding = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_SLIDING, blockState).createInstance();
|
||||
lowerSliding = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_SLIDING, blockState).createInstance();
|
||||
|
||||
connectors = Lists.newArrayList(upperRotating, lowerRotating, upperSliding, lowerSliding);
|
||||
} else {
|
||||
|
@ -76,11 +74,10 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
|||
}
|
||||
|
||||
updateLight();
|
||||
firstFrame = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
|
||||
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))
|
||||
.unCentre();
|
||||
|
||||
wheel.getInstance().setTransformNoCopy(ms);
|
||||
wheel.getInstance().setTransform(ms);
|
||||
|
||||
lastAngle = angle;
|
||||
firstFrame = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onUpdate() {
|
||||
Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState);
|
||||
protected void update() {
|
||||
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
||||
updateRotation(shaft, axis);
|
||||
}
|
||||
|
||||
|
@ -158,7 +155,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
|||
}
|
||||
|
||||
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) {
|
||||
|
|
|
@ -19,21 +19,18 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
|
|||
|
||||
public EngineInstance(InstancedTileRenderer<?> modelManager, EngineTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
Block block = lastState
|
||||
.getBlock();
|
||||
Block block = blockState
|
||||
.getBlock();
|
||||
if (!(block instanceof EngineBlock))
|
||||
return;
|
||||
|
||||
EngineBlock engineBlock = (EngineBlock) block;
|
||||
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));
|
||||
|
||||
|
@ -48,7 +45,7 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
|
|||
.translate(0, 0, -1);
|
||||
|
||||
this.frame.getInstance()
|
||||
.setTransformNoCopy(ms);
|
||||
.setTransform(ms);
|
||||
|
||||
updateLight();
|
||||
}
|
||||
|
|
|
@ -117,7 +117,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
|
|||
if (world.isRemote && runningTicks == 20)
|
||||
renderParticles();
|
||||
|
||||
if (!world.isRemote && runningTicks == 20) {
|
||||
if ((!world.isRemote || isVirtual()) && runningTicks == 20) {
|
||||
if (processingTicks < 0) {
|
||||
processingTicks = MathHelper.clamp((MathHelper.log2((int) (512 / speed))) * 15 + 1, 1, 512);
|
||||
} 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.ShaftlessCogInstance;
|
||||
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.InstancedTileRenderer;
|
||||
|
@ -14,27 +15,22 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
|||
import com.simibubi.create.foundation.utility.MatrixStacker;
|
||||
import net.minecraft.util.Direction;
|
||||
|
||||
public class MixerInstance extends ShaftlessCogInstance implements ITickableInstance {
|
||||
public class MixerInstance extends ShaftlessCogInstance implements IDynamicInstance {
|
||||
|
||||
private InstanceKey<RotatingData> mixerHead;
|
||||
private InstanceKey<ModelData> mixerPole;
|
||||
private final InstanceKey<RotatingData> mixerHead;
|
||||
private final InstanceKey<ModelData> mixerPole;
|
||||
|
||||
public MixerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
||||
super(dispatcher, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
mixerHead = rotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, lastState)
|
||||
mixerHead = rotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState)
|
||||
.createInstance();
|
||||
|
||||
mixerHead.getInstance()
|
||||
.setRotationAxis(Direction.Axis.Y);
|
||||
|
||||
mixerPole = modelManager.getMaterial(RenderMaterials.MODELS)
|
||||
.getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, lastState)
|
||||
mixerPole = modelManager.getMaterial(RenderMaterials.TRANSFORMED)
|
||||
.getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState)
|
||||
.createInstance();
|
||||
|
||||
|
||||
|
@ -47,7 +43,7 @@ public class MixerInstance extends ShaftlessCogInstance implements ITickableInst
|
|||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tile;
|
||||
|
||||
float renderedHeadOffset = getRenderedHeadOffset(mixer);
|
||||
|
@ -75,7 +71,7 @@ public class MixerInstance extends ShaftlessCogInstance implements ITickableInst
|
|||
msr.translate(getFloatingPos());
|
||||
msr.translate(0, -renderedHeadOffset, 0);
|
||||
|
||||
mixerPole.getInstance().setTransformNoCopy(ms);
|
||||
mixerPole.getInstance().setTransform(ms);
|
||||
}
|
||||
|
||||
private float getRenderedHeadOffset(MechanicalMixerTileEntity mixer) {
|
||||
|
|
|
@ -121,6 +121,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
|
|||
public void start(Mode mode) {
|
||||
this.mode = mode;
|
||||
running = true;
|
||||
prevRunningTicks = 0;
|
||||
runningTicks = 0;
|
||||
pressedItems.clear();
|
||||
sendData();
|
||||
|
@ -204,7 +205,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
|
|||
if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2) {
|
||||
runningTicks = CYCLE / 2;
|
||||
// Pause the ticks until a packet is received
|
||||
if (world.isRemote)
|
||||
if (world.isRemote && !isVirtual())
|
||||
runningTicks = -(CYCLE / 2);
|
||||
}
|
||||
}
|
||||
|
@ -343,7 +344,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
|
|||
return Optional.of(AllTriggers.PRESS_COMPACT);
|
||||
}
|
||||
|
||||
enum Mode {
|
||||
public enum Mode {
|
||||
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.content.contraptions.base.KineticTileEntity;
|
||||
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.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.InstancedTileRenderer;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
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) {
|
||||
super(dispatcher, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
pressHead = modelManager.getMaterial(RenderMaterials.MODELS)
|
||||
.getModel(AllBlockPartials.MECHANICAL_PRESS_HEAD, lastState)
|
||||
.createInstance();
|
||||
pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance();
|
||||
|
||||
updateLight();
|
||||
transformModels((MechanicalPressTileEntity) tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
MechanicalPressTileEntity press = (MechanicalPressTileEntity) tile;
|
||||
if (!press.running)
|
||||
return;
|
||||
|
@ -51,7 +43,7 @@ public class PressInstance extends ShaftInstance implements ITickableInstance {
|
|||
msr.translate(0, -renderedHeadOffset, 0);
|
||||
|
||||
pressHead.getInstance()
|
||||
.setTransformNoCopy(ms);
|
||||
.setTransform(ms);
|
||||
}
|
||||
|
||||
private float getRenderedHeadOffset(MechanicalPressTileEntity press) {
|
||||
|
|
|
@ -19,8 +19,8 @@ public class SawInstance extends SingleRotatingInstance {
|
|||
|
||||
@Override
|
||||
protected InstancedModel<RotatingData> getModel() {
|
||||
if (lastState.get(FACING).getAxis().isHorizontal())
|
||||
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180));
|
||||
if (blockState.get(FACING).getAxis().isHorizontal())
|
||||
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180));
|
||||
else
|
||||
return rotatingMaterial().getModel(KineticTileEntityRenderer.KINETIC_TILE, shaft(getRotationAxis()));
|
||||
}
|
||||
|
|
|
@ -1,5 +1,14 @@
|
|||
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.AllTags;
|
||||
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.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
|
||||
@MethodsReturnNonnullByDefault
|
||||
public class SawTileEntity extends BlockBreakingKineticTileEntity {
|
||||
|
||||
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;
|
||||
private int recipeIndex;
|
||||
|
@ -137,10 +138,14 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
|
|||
continue;
|
||||
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
|
||||
.tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite());
|
||||
if (tryExportingToBeltFunnel.getCount() != stack.getCount()) {
|
||||
inventory.setStackInSlot(slot, tryExportingToBeltFunnel);
|
||||
notifyUpdate();
|
||||
return;
|
||||
if (tryExportingToBeltFunnel != null) {
|
||||
if (tryExportingToBeltFunnel.getCount() != stack.getCount()) {
|
||||
inventory.setStackInSlot(slot, tryExportingToBeltFunnel);
|
||||
notifyUpdate();
|
||||
return;
|
||||
}
|
||||
if (!tryExportingToBeltFunnel.isEmpty())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -263,19 +268,19 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
|
|||
|
||||
private List<? extends IRecipe<?>> getRecipes() {
|
||||
/*
|
||||
Predicate<IRecipe<?>> types = AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get()
|
||||
? RecipeConditions.isOfType(IRecipeType.STONECUTTING, AllRecipeTypes.CUTTING.getType())
|
||||
: RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType());
|
||||
|
||||
* Predicate<IRecipe<?>> types =
|
||||
* AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() ?
|
||||
* RecipeConditions.isOfType(IRecipeType.STONECUTTING,
|
||||
* AllRecipeTypes.CUTTING.getType()) :
|
||||
* RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType());
|
||||
*
|
||||
*/
|
||||
|
||||
Predicate<IRecipe<?>> types = RecipeConditions.isOfType(
|
||||
AllRecipeTypes.CUTTING.getType(),
|
||||
Predicate<IRecipe<?>> types = RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType(),
|
||||
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()
|
||||
.filter(RecipeConditions.outputMatchesFilter(filtering))
|
||||
.filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0)))
|
||||
|
|
|
@ -110,6 +110,8 @@ public abstract class Contraption {
|
|||
public List<TileEntity> maybeInstancedTileEntities;
|
||||
public List<TileEntity> specialRenderedTileEntities;
|
||||
|
||||
protected ContraptionWorld world;
|
||||
|
||||
public Contraption() {
|
||||
blocks = new HashMap<>();
|
||||
storage = new HashMap<>();
|
||||
|
@ -127,6 +129,14 @@ public abstract class Contraption {
|
|||
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 canBeStabilized(Direction facing, BlockPos localPos);
|
||||
|
@ -1062,7 +1072,7 @@ public abstract class Contraption {
|
|||
|
||||
GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius);
|
||||
|
||||
GridAlignedBB contraptionBounds = GridAlignedBB.fromAABB(bounds);
|
||||
GridAlignedBB contraptionBounds = GridAlignedBB.from(bounds);
|
||||
if (axis == Direction.Axis.X) {
|
||||
betterBounds.maxX = contraptionBounds.maxX;
|
||||
betterBounds.minX = contraptionBounds.minX;
|
||||
|
|
|
@ -69,7 +69,6 @@ public class ContraptionCollider {
|
|||
Vector3d contraptionPosition = contraptionEntity.getPositionVec();
|
||||
Vector3d contraptionMotion = contraptionPosition.subtract(contraptionEntity.getPrevPositionVec());
|
||||
Vector3d anchorVec = contraptionEntity.getAnchorVec();
|
||||
Vector3d centerOfBlock = VecHelper.CENTER_OF_ORIGIN;
|
||||
ContraptionRotationState rotation = null;
|
||||
|
||||
// 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
|
||||
Vector3d entityPosition = entity.getPositionVec();
|
||||
AxisAlignedBB entityBounds = entity.getBoundingBox();
|
||||
Vector3d centerY = new Vector3d(0, entityBounds.getYSize() / 2, 0);
|
||||
Vector3d motion = entity.getMotion();
|
||||
float yawOffset = rotation.getYawOffset();
|
||||
|
||||
Vector3d position = entityPosition;
|
||||
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);
|
||||
Vector3d position = getWorldToLocalTranslation(entity, anchorVec, rotationMatrix, yawOffset);
|
||||
|
||||
// Find all potential block shapes to collide with
|
||||
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 **/
|
||||
static Vector3d getAllowedMovement(Vector3d movement, Entity e) {
|
||||
AxisAlignedBB bb = e.getBoundingBox();
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
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.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;
|
||||
|
||||
public abstract class ContraptionLighter<C extends Contraption> {
|
||||
public abstract class ContraptionLighter<C extends Contraption> implements LightUpdateListener {
|
||||
protected final C contraption;
|
||||
public final LightVolume lightVolume;
|
||||
|
||||
|
@ -21,14 +26,8 @@ public abstract class ContraptionLighter<C extends Contraption> {
|
|||
|
||||
lightVolume.initialize(contraption.entity.world);
|
||||
scheduleRebuild = true;
|
||||
}
|
||||
|
||||
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;
|
||||
startListening();
|
||||
}
|
||||
|
||||
public void tick(RenderedContraption owner) {
|
||||
|
@ -39,4 +38,28 @@ public abstract class ContraptionLighter<C extends Contraption> {
|
|||
}
|
||||
|
||||
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)) {
|
||||
lightVolume.move(contraption.entity.world, contraptionBoundsToVolume(contraptionBounds));
|
||||
bounds = contraptionBounds;
|
||||
|
||||
startListening();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public GridAlignedBB getContraptionBounds() {
|
||||
GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds);
|
||||
GridAlignedBB bb = GridAlignedBB.from(contraption.bounds);
|
||||
|
||||
bb.translate(contraption.entity.getBlockPos());
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ public class AnchoredLighter extends ContraptionLighter<Contraption> {
|
|||
|
||||
@Override
|
||||
public GridAlignedBB getContraptionBounds() {
|
||||
GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds);
|
||||
GridAlignedBB bb = GridAlignedBB.from(contraption.bounds);
|
||||
bb.translate(contraption.anchor);
|
||||
return bb;
|
||||
}
|
||||
|
|
|
@ -114,10 +114,10 @@ public class StickerBlock extends ProperDirectionalBlock implements ITE<StickerT
|
|||
}
|
||||
|
||||
private void func_226946_a_(Entity p_226946_1_) {
|
||||
Vector3d vec3d = p_226946_1_.getMotion();
|
||||
if (vec3d.y < 0.0D) {
|
||||
Vector3d Vector3d = p_226946_1_.getMotion();
|
||||
if (Vector3d.y < 0.0D) {
|
||||
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
|
||||
public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) {
|
||||
if (state.get(FACING) == Direction.UP) {
|
||||
Vector3d vec3d = entity.getMotion();
|
||||
Vector3d Vector3d = entity.getMotion();
|
||||
world.addParticle(
|
||||
new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()).setPos(pos),
|
||||
entity.getX() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(),
|
||||
entity.getY() + 0.1D,
|
||||
entity.getZ() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), vec3d.x * -4.0D,
|
||||
1.5D, vec3d.z * -4.0D);
|
||||
entity.getZ() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), Vector3d.x * -4.0D,
|
||||
1.5D, Vector3d.z * -4.0D);
|
||||
return true;
|
||||
}
|
||||
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.simibubi.create.AllBlockPartials;
|
||||
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.InstancedTileRenderer;
|
||||
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 net.minecraft.client.Minecraft;
|
||||
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;
|
||||
final Direction facing;
|
||||
final boolean fakeWorld;
|
||||
final int offset;
|
||||
|
||||
private InstanceKey<ModelData> head;
|
||||
private final InstanceKey<ModelData> head;
|
||||
|
||||
public StickerInstance(InstancedTileRenderer<?> modelManager, StickerTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
head = modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.STICKER_HEAD, lastState).createInstance();
|
||||
head = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.STICKER_HEAD, blockState).createInstance();
|
||||
|
||||
fakeWorld = tile.getWorld() != Minecraft.getInstance().world;
|
||||
facing = blockState.get(StickerBlock.FACING);
|
||||
offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0;
|
||||
|
||||
updateLight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
lastState = world.getBlockState(pos);
|
||||
|
||||
public void beginFrame() {
|
||||
float offset = tile.piston.getValue(AnimationTickHolder.getPartialTicks());
|
||||
|
||||
if (tile.getWorld() != Minecraft.getInstance().world)
|
||||
offset = lastState.get(StickerBlock.EXTENDED) ? 1 : 0;
|
||||
if (fakeWorld)
|
||||
offset = this.offset;
|
||||
|
||||
if (Math.abs(offset - lastOffset) < 1e-4)
|
||||
if (MathHelper.epsilonEquals(offset, lastOffset))
|
||||
return;
|
||||
|
||||
Direction facing = lastState.get(StickerBlock.FACING);
|
||||
MatrixStack stack = new MatrixStack();
|
||||
MatrixStacker.of(stack)
|
||||
.translate(getFloatingPos())
|
||||
|
@ -55,7 +57,7 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> imple
|
|||
.translate(0, (offset * offset) * 4 / 16f, 0);
|
||||
|
||||
head.getInstance()
|
||||
.setTransformNoCopy(stack);
|
||||
.setTransform(stack);
|
||||
|
||||
lastOffset = offset;
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks;
|
|||
import com.simibubi.create.AllSoundEvents;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity;
|
||||
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.tileEntity.SmartTileEntity;
|
||||
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)
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(false));
|
||||
piston.chase(target, .4f, Chaser.LINEAR);
|
||||
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this));
|
||||
}
|
||||
|
||||
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.relays.encased.ShaftInstance;
|
||||
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.InstancedTileRenderer;
|
||||
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.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) {
|
||||
super(dispatcher, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
gantryCogs = modelManager.getMaterial(RenderMaterials.MODELS)
|
||||
.getModel(AllBlockPartials.GANTRY_COGS, lastState)
|
||||
gantryCogs = modelManager.getMaterial(RenderMaterials.TRANSFORMED)
|
||||
.getModel(AllBlockPartials.GANTRY_COGS, blockState)
|
||||
.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();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
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());
|
||||
public void beginFrame() {
|
||||
float angleForTe = GantryCarriageRenderer.getAngleForTe(tile, visualPos, rotationAxis);
|
||||
|
||||
Direction.Axis gantryAxis = Direction.Axis.X;
|
||||
|
@ -71,7 +72,7 @@ public class GantryCarriageInstance extends ShaftInstance implements ITickableIn
|
|||
.translate(0, 9 / 16f, 0)
|
||||
.unCentre();
|
||||
|
||||
gantryCogs.getInstance().setTransformNoCopy(ms);
|
||||
gantryCogs.getInstance().setTransform(ms);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -12,7 +12,7 @@ public class PistonLighter extends ContraptionLighter<PistonContraption> {
|
|||
|
||||
@Override
|
||||
public GridAlignedBB getContraptionBounds() {
|
||||
GridAlignedBB bounds = GridAlignedBB.fromAABB(contraption.bounds);
|
||||
GridAlignedBB bounds = GridAlignedBB.from(contraption.bounds);
|
||||
bounds.translate(contraption.anchor);
|
||||
|
||||
int length = contraption.extensionLength;
|
||||
|
|
|
@ -15,7 +15,7 @@ public class PulleyLighter extends ContraptionLighter<PulleyContraption> {
|
|||
@Override
|
||||
public GridAlignedBB getContraptionBounds() {
|
||||
|
||||
GridAlignedBB bounds = GridAlignedBB.fromAABB(contraption.bounds);
|
||||
GridAlignedBB bounds = GridAlignedBB.from(contraption.bounds);
|
||||
|
||||
World world = contraption.entity.world;
|
||||
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
package com.simibubi.create.content.contraptions.components.structureMovement.render;
|
||||
|
||||
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;
|
||||
|
||||
public abstract class ActorInstance {
|
||||
|
@ -14,16 +12,11 @@ public abstract class ActorInstance {
|
|||
this.context = context;
|
||||
}
|
||||
|
||||
protected void tick() { }
|
||||
public void tick() { }
|
||||
|
||||
protected float getSpeed(Direction facing) {
|
||||
if (context.contraption.stalled)
|
||||
return 0;
|
||||
|
||||
return !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()) ? context.getAnimationSpeed() : 0;
|
||||
}
|
||||
public void beginFrame() { }
|
||||
|
||||
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.VertexAttribSpec;
|
||||
|
||||
public enum ContraptionVertexAttributes implements IVertexAttrib {
|
||||
public enum ContraptionAttributes implements IVertexAttrib {
|
||||
VERTEX_POSITION("aPos", CommonAttributes.VEC3),
|
||||
NORMAL("aNormal", CommonAttributes.NORMAL),
|
||||
TEXTURE("aTexCoords", CommonAttributes.UV),
|
||||
|
@ -16,7 +16,7 @@ public enum ContraptionVertexAttributes implements IVertexAttrib {
|
|||
private final String name;
|
||||
private final VertexAttribSpec spec;
|
||||
|
||||
ContraptionVertexAttributes(String name, VertexAttribSpec spec) {
|
||||
ContraptionAttributes(String name, VertexAttribSpec spec) {
|
||||
this.name = name;
|
||||
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.content.contraptions.base.KineticRenderMaterials;
|
||||
import com.simibubi.create.content.contraptions.base.RotatingInstancedModel;
|
||||
import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData;
|
||||
import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel;
|
||||
import com.simibubi.create.content.contraptions.base.RotatingModel;
|
||||
import com.simibubi.create.content.contraptions.components.actors.ActorData;
|
||||
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.MovementContext;
|
||||
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.backend.RenderMaterials;
|
||||
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.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.world.gen.feature.template.Template;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
|
||||
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) {
|
||||
this.contraption = contraption;
|
||||
this.contraption = new WeakReference<>(contraption);
|
||||
}
|
||||
|
||||
@Override
|
||||
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.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.C_ROTATING, RotatingInstancedModel::new));
|
||||
materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.C_FLAPS, FlapInstancedModel::new));
|
||||
materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(this, AllProgramSpecs.C_ACTOR, RotatingActorModel::new));
|
||||
materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.C_ROTATING, RotatingModel::new));
|
||||
materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.C_FLAPS, FlapModel::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
|
||||
public void beginFrame(double cameraX, double cameraY, double cameraZ) {
|
||||
super.beginFrame(cameraX, cameraY, cameraZ);
|
||||
|
||||
actors.forEach(ActorInstance::tick);
|
||||
actors.forEach(com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance::beginFrame);
|
||||
}
|
||||
|
||||
@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();
|
||||
MovementContext context = actor.getRight();
|
||||
|
||||
MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state);
|
||||
|
||||
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);
|
||||
|
||||
|
@ -68,10 +76,14 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer<Contraptio
|
|||
return null;
|
||||
}
|
||||
|
||||
public RenderMaterial<?, InstancedModel<ContraptionActorData>> getActorMaterial() {
|
||||
public RenderMaterial<?, InstancedModel<ActorData>> getActorMaterial() {
|
||||
return getMaterial(KineticRenderMaterials.ACTORS);
|
||||
}
|
||||
|
||||
public RenderedContraption getContraption() {
|
||||
return contraption.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockPos getOriginCoordinate() {
|
||||
return BlockPos.ZERO;
|
||||
|
|
|
@ -13,7 +13,7 @@ import java.nio.ByteBuffer;
|
|||
|
||||
public class ContraptionModel extends BufferedModel {
|
||||
public static final VertexFormat FORMAT = VertexFormat.builder()
|
||||
.addAttributes(ContraptionVertexAttributes.class)
|
||||
.addAttributes(ContraptionAttributes.class)
|
||||
.build();
|
||||
|
||||
protected GlPrimitiveType eboIndexType;
|
||||
|
|
|
@ -1,5 +1,13 @@
|
|||
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.simibubi.create.AllMovementBehaviours;
|
||||
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.MovementBehaviour;
|
||||
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.FastRenderDispatcher;
|
||||
import com.simibubi.create.foundation.utility.MatrixStacker;
|
||||
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import net.minecraft.block.BlockRenderType;
|
||||
import net.minecraft.block.BlockState;
|
||||
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.texture.OverlayTexture;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
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.World;
|
||||
import net.minecraft.world.gen.feature.template.Template;
|
||||
import net.minecraftforge.client.ForgeHooksClient;
|
||||
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 static final Int2ObjectMap<RenderedContraption> renderers = new Int2ObjectOpenHashMap<>();
|
||||
public static final Compartment<Pair<Contraption, Integer>> CONTRAPTION = new Compartment<>();
|
||||
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) {
|
||||
for (RenderedContraption renderer : renderers.values()) {
|
||||
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,
|
||||
IRenderTypeBuffer buffer) {
|
||||
IRenderTypeBuffer buffer) {
|
||||
PlacementSimulationWorld renderWorld = null;
|
||||
if (Backend.canUseVBOs()) {
|
||||
RenderedContraption renderer = getRenderer(world, c);
|
||||
|
@ -68,8 +72,12 @@ public class ContraptionRenderDispatcher {
|
|||
}
|
||||
|
||||
public static void tick() {
|
||||
if (Minecraft.getInstance().isGamePaused()) return;
|
||||
|
||||
for (RenderedContraption contraption : renderers.values()) {
|
||||
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,
|
||||
IRenderTypeBuffer buffer) {
|
||||
IRenderTypeBuffer buffer) {
|
||||
SuperByteBufferCache bufferCache = CreateClient.bufferCache;
|
||||
List<RenderType> blockLayers = RenderType.getBlockLayers();
|
||||
|
||||
|
@ -187,17 +195,19 @@ public class ContraptionRenderDispatcher {
|
|||
ForgeHooksClient.setRenderLayer(layer);
|
||||
MatrixStack ms = new MatrixStack();
|
||||
BlockRendererDispatcher dispatcher = Minecraft.getInstance()
|
||||
.getBlockRendererDispatcher();
|
||||
.getBlockRendererDispatcher();
|
||||
BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer();
|
||||
Random random = new Random();
|
||||
BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize());
|
||||
builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
|
||||
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);
|
||||
|
||||
for (Template.BlockInfo info : c.getBlocks().values()) {
|
||||
for (Template.BlockInfo info : c.getBlocks()
|
||||
.values()) {
|
||||
BlockState state = info.state;
|
||||
|
||||
if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED)
|
||||
|
@ -209,7 +219,7 @@ public class ContraptionRenderDispatcher {
|
|||
ms.push();
|
||||
ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ());
|
||||
blockRenderer.renderModel(renderWorld, originalModel, state, info.pos, ms, builder, true, random, 42,
|
||||
OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE);
|
||||
OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE);
|
||||
ms.pop();
|
||||
}
|
||||
|
||||
|
@ -232,7 +242,7 @@ public class ContraptionRenderDispatcher {
|
|||
for (MatrixStack m : matrixStacks) {
|
||||
m.push();
|
||||
MatrixStacker.of(m)
|
||||
.translate(blockInfo.pos);
|
||||
.translate(blockInfo.pos);
|
||||
}
|
||||
|
||||
MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state);
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
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.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
||||
|
|
|
@ -106,10 +106,10 @@ public class MinecartSim2020 {
|
|||
}
|
||||
|
||||
Pair<Vector3i, Vector3i> pair = MATRIX.get(railshape);
|
||||
Vector3i vec3i = pair.getFirst();
|
||||
Vector3i vec3i1 = pair.getSecond();
|
||||
double d4 = (double) (vec3i1.getX() - vec3i.getX());
|
||||
double d5 = (double) (vec3i1.getZ() - vec3i.getZ());
|
||||
Vector3i Vector3i = pair.getFirst();
|
||||
Vector3i Vector3i1 = pair.getSecond();
|
||||
double d4 = (double) (Vector3i1.getX() - Vector3i.getX());
|
||||
double d5 = (double) (Vector3i1.getZ() - Vector3i.getZ());
|
||||
// double d6 = Math.sqrt(d4 * d4 + d5 * d5);
|
||||
double d7 = forcedMovement.x * d4 + forcedMovement.z * d5;
|
||||
if (d7 < 0.0D) {
|
||||
|
@ -117,10 +117,10 @@ public class MinecartSim2020 {
|
|||
d5 = -d5;
|
||||
}
|
||||
|
||||
double d23 = (double) cartPos.getX() + 0.5D + (double) vec3i.getX() * 0.5D;
|
||||
double d10 = (double) cartPos.getZ() + 0.5D + (double) vec3i.getZ() * 0.5D;
|
||||
double d12 = (double) cartPos.getX() + 0.5D + (double) vec3i1.getX() * 0.5D;
|
||||
double d13 = (double) cartPos.getZ() + 0.5D + (double) vec3i1.getZ() * 0.5D;
|
||||
double d23 = (double) cartPos.getX() + 0.5D + (double) Vector3i.getX() * 0.5D;
|
||||
double d10 = (double) cartPos.getZ() + 0.5D + (double) Vector3i.getZ() * 0.5D;
|
||||
double d12 = (double) cartPos.getX() + 0.5D + (double) Vector3i1.getX() * 0.5D;
|
||||
double d13 = (double) cartPos.getZ() + 0.5D + (double) Vector3i1.getZ() * 0.5D;
|
||||
d4 = d12 - d23;
|
||||
d5 = d13 - d10;
|
||||
double d14;
|
||||
|
@ -145,12 +145,12 @@ public class MinecartSim2020 {
|
|||
y = cart.getY();
|
||||
z = cart.getZ();
|
||||
|
||||
if (vec3i.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == vec3i.getX()
|
||||
&& MathHelper.floor(z) - cartPos.getZ() == vec3i.getZ()) {
|
||||
cart.setPosition(x, y + (double) vec3i.getY(), z);
|
||||
} else if (vec3i1.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == vec3i1.getX()
|
||||
&& MathHelper.floor(z) - cartPos.getZ() == vec3i1.getZ()) {
|
||||
cart.setPosition(x, y + (double) vec3i1.getY(), z);
|
||||
if (Vector3i.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == Vector3i.getX()
|
||||
&& MathHelper.floor(z) - cartPos.getZ() == Vector3i.getZ()) {
|
||||
cart.setPosition(x, y + (double) Vector3i.getY(), z);
|
||||
} else if (Vector3i1.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == Vector3i1.getX()
|
||||
&& MathHelper.floor(z) - cartPos.getZ() == Vector3i1.getZ()) {
|
||||
cart.setPosition(x, y + (double) Vector3i1.getY(), z);
|
||||
}
|
||||
|
||||
x = cart.getX();
|
||||
|
|
|
@ -100,7 +100,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
|
|||
}
|
||||
|
||||
boolean onClient = world.isRemote && !isVirtual();
|
||||
|
||||
|
||||
if (processingTicks > 0) {
|
||||
heldItem.prevBeltPosition = .5f;
|
||||
boolean wasAtBeginning = processingTicks == FILLING_TIME;
|
||||
|
@ -130,13 +130,17 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
|
|||
|
||||
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
|
||||
.tryExportingToBeltFunnel(heldItem.stack, side.getOpposite());
|
||||
if (tryExportingToBeltFunnel.getCount() != heldItem.stack.getCount()) {
|
||||
if (tryExportingToBeltFunnel.isEmpty())
|
||||
heldItem = null;
|
||||
else
|
||||
heldItem.stack = tryExportingToBeltFunnel;
|
||||
notifyUpdate();
|
||||
return;
|
||||
if (tryExportingToBeltFunnel != null) {
|
||||
if (tryExportingToBeltFunnel.getCount() != heldItem.stack.getCount()) {
|
||||
if (tryExportingToBeltFunnel.isEmpty())
|
||||
heldItem = null;
|
||||
else
|
||||
heldItem.stack = tryExportingToBeltFunnel;
|
||||
notifyUpdate();
|
||||
return;
|
||||
}
|
||||
if (!tryExportingToBeltFunnel.isEmpty())
|
||||
return;
|
||||
}
|
||||
|
||||
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.KineticTileEntityRenderer;
|
||||
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.InstancedTileRenderer;
|
||||
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.math.MathHelper;
|
||||
|
||||
public class FluidValveInstance extends ShaftInstance implements ITickableInstance {
|
||||
public class FluidValveInstance extends ShaftInstance implements IDynamicInstance {
|
||||
|
||||
protected InstanceKey<ModelData> pointer;
|
||||
|
||||
protected double xRot;
|
||||
protected double yRot;
|
||||
protected int pointerRotationOffset;
|
||||
protected final double xRot;
|
||||
protected final double yRot;
|
||||
protected final int pointerRotationOffset;
|
||||
|
||||
public FluidValveInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
||||
super(dispatcher, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
Direction facing = lastState.get(FluidValveBlock.FACING);
|
||||
Direction facing = blockState.get(FluidValveBlock.FACING);
|
||||
|
||||
yRot = AngleHelper.horizontalAngle(facing);
|
||||
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);
|
||||
|
||||
pointerRotationOffset = 0;
|
||||
if (pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical())
|
||||
pointerRotationOffset = 90;
|
||||
boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical();
|
||||
pointerRotationOffset = twist ? 90 : 0;
|
||||
|
||||
pointer = modelManager.basicMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, lastState).createInstance();
|
||||
pointer = modelManager.transformMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance();
|
||||
|
||||
updateLight();
|
||||
transformPointer((FluidValveTileEntity) tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
|
||||
FluidValveTileEntity valve = (FluidValveTileEntity) tile;
|
||||
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
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 net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
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.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
|
||||
* */
|
||||
|
@ -36,7 +37,8 @@ public interface IHaveGoggleInformation {
|
|||
}
|
||||
|
||||
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) {
|
||||
|
@ -73,7 +75,13 @@ public interface IHaveGoggleInformation {
|
|||
isEmpty = false;
|
||||
}
|
||||
|
||||
if (tank.getTanks() > 1 || !isEmpty)
|
||||
if (tank.getTanks() > 1) {
|
||||
if (isEmpty)
|
||||
tooltip.remove(tooltip.size() - 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!isEmpty)
|
||||
return true;
|
||||
|
||||
ITextComponent capacity = Lang.translate("gui.goggles.fluid_container.capacity").formatted(TextFormatting.GRAY);
|
||||
|
@ -96,7 +104,10 @@ public interface IHaveGoggleInformation {
|
|||
}
|
||||
|
||||
public void update() {
|
||||
format = NumberFormat.getInstance(Minecraft.getInstance().getLanguageManager().getCurrentLanguage().getJavaLocale());
|
||||
format = NumberFormat.getInstance(Minecraft.getInstance()
|
||||
.getLanguageManager()
|
||||
.getCurrentLanguage()
|
||||
.getJavaLocale());
|
||||
format.setMaximumFractionDigits(2);
|
||||
format.setMinimumFractionDigits(0);
|
||||
format.setGroupingUsed(true);
|
||||
|
|
|
@ -21,6 +21,7 @@ import net.minecraft.entity.item.ItemEntity;
|
|||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.state.DirectionProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
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.IWorldReader;
|
||||
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.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
|
@ -94,6 +99,11 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
|
|||
if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem)
|
||||
|| GenericItemFilling.canItemBeFilled(worldIn, heldItem))
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -75,8 +75,14 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
|
|||
ClientPlayerEntity player = Minecraft.getInstance().player;
|
||||
float target = 0;
|
||||
if (player != null) {
|
||||
double dx = player.getX() - (getPos().getX() + 0.5);
|
||||
double dz = player.getZ() - (getPos().getZ() + 0.5);
|
||||
double x = player.getX();
|
||||
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 = 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.VertexAttribSpec;
|
||||
|
||||
public enum BeltVertexAttributes implements IVertexAttrib {
|
||||
public enum BeltAttributes implements IVertexAttrib {
|
||||
INSTANCE_ROTATION("aInstanceRot", CommonAttributes.QUATERNION),
|
||||
SOURCE_TEX("aSourceTexture", CommonAttributes.UV),
|
||||
SCROLL_TEX("aScrollTexture", CommonAttributes.VEC4),
|
||||
|
@ -15,7 +15,7 @@ public enum BeltVertexAttributes implements IVertexAttrib {
|
|||
private final String name;
|
||||
private final VertexAttribSpec spec;
|
||||
|
||||
BeltVertexAttributes(String name, VertexAttribSpec spec) {
|
||||
BeltAttributes(String name, VertexAttribSpec spec) {
|
||||
this.name = name;
|
||||
this.spec = spec;
|
||||
}
|
|
@ -1,21 +1,14 @@
|
|||
package com.simibubi.create.content.contraptions.relays.belt;
|
||||
|
||||
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.render.backend.gl.attrib.VertexFormat;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.util.math.vector.Quaternion;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public class BeltData extends KineticData<BeltData> {
|
||||
public static VertexFormat FORMAT = VertexFormat.builder()
|
||||
.addAttributes(KineticVertexAttributes.class)
|
||||
.addAttributes(BeltVertexAttributes.class)
|
||||
.build();
|
||||
|
||||
public class BeltData extends KineticData {
|
||||
private float qX;
|
||||
private float qY;
|
||||
private float qZ;
|
||||
|
|
|
@ -21,30 +21,27 @@ import java.util.function.Supplier;
|
|||
|
||||
public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
||||
|
||||
private boolean upward;
|
||||
private boolean diagonal;
|
||||
private boolean sideways;
|
||||
private boolean vertical;
|
||||
private boolean alongX;
|
||||
private boolean alongZ;
|
||||
private BeltSlope beltSlope;
|
||||
private Direction facing;
|
||||
boolean upward;
|
||||
boolean diagonal;
|
||||
boolean sideways;
|
||||
boolean vertical;
|
||||
boolean alongX;
|
||||
boolean alongZ;
|
||||
BeltSlope beltSlope;
|
||||
Direction facing;
|
||||
protected ArrayList<InstanceKey<BeltData>> keys;
|
||||
protected InstanceKey<RotatingData> pulleyKey;
|
||||
|
||||
public BeltInstance(InstancedTileRenderer<?> modelManager, BeltTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
if (!AllBlocks.BELT.has(lastState))
|
||||
if (!AllBlocks.BELT.has(blockState))
|
||||
return;
|
||||
|
||||
keys = new ArrayList<>(2);
|
||||
|
||||
beltSlope = lastState.get(BeltBlock.SLOPE);
|
||||
facing = lastState.get(BeltBlock.HORIZONTAL_FACING);
|
||||
beltSlope = blockState.get(BeltBlock.SLOPE);
|
||||
facing = blockState.get(BeltBlock.HORIZONTAL_FACING);
|
||||
upward = beltSlope == BeltSlope.UPWARD;
|
||||
diagonal = beltSlope.isDiagonal();
|
||||
sideways = beltSlope == BeltSlope.SIDEWAYS;
|
||||
|
@ -52,7 +49,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
|||
alongX = facing.getAxis() == Direction.Axis.X;
|
||||
alongZ = facing.getAxis() == Direction.Axis.Z;
|
||||
|
||||
BeltPart part = lastState.get(BeltBlock.PART);
|
||||
BeltPart part = blockState.get(BeltBlock.PART);
|
||||
boolean start = part == BeltPart.START;
|
||||
boolean end = part == BeltPart.END;
|
||||
DyeColor color = tile.color.orElse(null);
|
||||
|
@ -61,7 +58,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
|||
AllBlockPartials beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, 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));
|
||||
|
||||
|
@ -76,7 +73,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
public void update() {
|
||||
DyeColor color = tile.color.orElse(null);
|
||||
|
||||
boolean bottom = true;
|
||||
|
@ -141,11 +138,11 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
|||
return modelTransform;
|
||||
};
|
||||
|
||||
return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, lastState, dir, ms);
|
||||
return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms);
|
||||
}
|
||||
|
||||
private Direction getOrientation() {
|
||||
Direction dir = lastState.get(BeltBlock.HORIZONTAL_FACING)
|
||||
Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING)
|
||||
.rotateY();
|
||||
if (beltSlope == BeltSlope.SIDEWAYS)
|
||||
dir = Direction.UP;
|
||||
|
@ -162,14 +159,14 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
|||
Quaternion q = new Quaternion(rotX, rotY, rotZ, true);
|
||||
|
||||
key.getInstance()
|
||||
.setTileEntity(tile)
|
||||
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
|
||||
.setSkyLight(world.getLightLevel(LightType.SKY, pos))
|
||||
.setRotation(q)
|
||||
.setRotationalSpeed(getScrollSpeed())
|
||||
.setRotationOffset(bottom ? 0.5f : 0f)
|
||||
.setScrollTexture(spriteShift)
|
||||
.setScrollMult(diagonal ? 3f / 8f : 0.5f);
|
||||
.setScrollTexture(spriteShift)
|
||||
.setScrollMult(diagonal ? 3f / 8f : 0.5f)
|
||||
.setRotation(q)
|
||||
.setRotationalSpeed(getScrollSpeed())
|
||||
.setRotationOffset(bottom ? 0.5f : 0f)
|
||||
.setTileEntity(tile)
|
||||
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
|
||||
.setSkyLight(world.getLightLevel(LightType.SKY, pos));
|
||||
|
||||
return key;
|
||||
}
|
||||
|
|
|
@ -1,24 +1,32 @@
|
|||
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.instancing.InstancedModel;
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BeltData newInstance() {
|
||||
@Override
|
||||
protected BeltData newInstance() {
|
||||
return new BeltData(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VertexFormat getInstanceFormat() {
|
||||
return BeltData.FORMAT;
|
||||
protected VertexFormat getInstanceFormat() {
|
||||
return FORMAT;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -294,10 +294,10 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
|
|||
}
|
||||
|
||||
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.logistics.block.belts.tunnel.BrassTunnelTileEntity;
|
||||
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.behaviour.belt.DirectBeltInputBehaviour;
|
||||
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.vector.Vector3d;
|
||||
import net.minecraft.util.math.vector.Vector3i;
|
||||
import net.minecraft.world.IBlockDisplayReader;
|
||||
import net.minecraft.world.LightType;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
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.POSITIVE;
|
||||
|
||||
public class BeltTileEntity extends KineticTileEntity implements ILightListener {
|
||||
|
||||
public class BeltTileEntity extends KineticTileEntity implements LightUpdateListener {
|
||||
|
||||
public Map<Entity, TransportedEntityInfo> passengers;
|
||||
public Optional<DyeColor> color;
|
||||
|
@ -64,8 +68,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
|
|||
public CompoundNBT trackerUpdateTag;
|
||||
|
||||
// client
|
||||
public byte blockLight = -1;
|
||||
public byte skyLight = -1;
|
||||
public byte[] light;
|
||||
|
||||
public static enum CasingType {
|
||||
NONE, ANDESITE, BRASS;
|
||||
|
@ -100,12 +103,15 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
|
|||
|
||||
initializeItemHandler();
|
||||
|
||||
if (blockLight == -1)
|
||||
updateLight();
|
||||
|
||||
// Move Items
|
||||
if (!isController())
|
||||
return;
|
||||
|
||||
if (light == null && world.isRemote) {
|
||||
initializeLight();
|
||||
LightUpdater.getInstance().startListening(getBeltVolume(), this);
|
||||
}
|
||||
|
||||
getInventory().tick();
|
||||
|
||||
if (getSpeed() == 0)
|
||||
|
@ -223,7 +229,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
|
|||
|
||||
if (casingBefore == casing)
|
||||
return;
|
||||
requestModelDataUpdate();
|
||||
if (!isVirtual())
|
||||
requestModelDataUpdate();
|
||||
if (hasWorld())
|
||||
world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16);
|
||||
}
|
||||
|
@ -276,10 +283,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
|
|||
}
|
||||
|
||||
public boolean isController() {
|
||||
return controller != null &&
|
||||
pos.getX() == controller.getX() &&
|
||||
pos.getY() == controller.getY() &&
|
||||
pos.getZ() == controller.getZ();
|
||||
return controller != null && pos.getX() == controller.getX() && pos.getY() == controller.getY()
|
||||
&& pos.getZ() == controller.getZ();
|
||||
}
|
||||
|
||||
public float getBeltMovementSpeed() {
|
||||
|
@ -297,7 +302,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
|
|||
public boolean hasPulley() {
|
||||
if (!AllBlocks.BELT.has(getBlockState()))
|
||||
return false;
|
||||
return getBlockState().get(BeltBlock.PART) != BeltPart.MIDDLE;
|
||||
return getBlockState().get(BeltBlock.PART) != MIDDLE;
|
||||
}
|
||||
|
||||
protected boolean isLastBelt() {
|
||||
|
@ -500,23 +505,77 @@ public class BeltTileEntity extends KineticTileEntity implements ILightListener
|
|||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChunkLightUpdate() {
|
||||
updateLight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldRenderAsTE() {
|
||||
return isController();
|
||||
}
|
||||
|
||||
private void updateLight() {
|
||||
if (world != null) {
|
||||
skyLight = (byte) world.getLightLevel(LightType.SKY, pos);
|
||||
blockLight = (byte) world.getLightLevel(LightType.BLOCK, pos);
|
||||
} else {
|
||||
skyLight = -1;
|
||||
blockLight = -1;
|
||||
@Override
|
||||
public boolean onLightUpdate(IBlockDisplayReader world, LightType type, GridAlignedBB changed) {
|
||||
if (this.removed) {
|
||||
return true;
|
||||
}
|
||||
|
||||
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)
|
||||
if (world.isRemote && currentItem.locked)
|
||||
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
|
||||
float currentPos = currentItem.beltPosition;
|
||||
|
|
|
@ -20,6 +20,7 @@ public class TransportedItemStack implements Comparable<TransportedItemStack> {
|
|||
public int insertedAt;
|
||||
public Direction insertedFrom;
|
||||
public boolean locked;
|
||||
public boolean lockedExternally;
|
||||
|
||||
public float prevBeltPosition;
|
||||
public float prevSideOffset;
|
||||
|
@ -73,7 +74,10 @@ public class TransportedItemStack implements Comparable<TransportedItemStack> {
|
|||
nbt.putInt("InSegment", insertedAt);
|
||||
nbt.putInt("Angle", angle);
|
||||
nbt.putInt("InDirection", insertedFrom.getIndex());
|
||||
nbt.putBoolean("Locked", locked);
|
||||
if (locked)
|
||||
nbt.putBoolean("Locked", locked);
|
||||
if (lockedExternally)
|
||||
nbt.putBoolean("LockedExternally", lockedExternally);
|
||||
return nbt;
|
||||
}
|
||||
|
||||
|
@ -87,6 +91,7 @@ public class TransportedItemStack implements Comparable<TransportedItemStack> {
|
|||
stack.angle = nbt.getInt("Angle");
|
||||
stack.insertedFrom = Direction.byIndex(nbt.getInt("InDirection"));
|
||||
stack.locked = nbt.getBoolean("Locked");
|
||||
stack.lockedExternally = nbt.getBoolean("LockedExternally");
|
||||
return stack;
|
||||
}
|
||||
|
||||
|
|
|
@ -25,103 +25,114 @@ import net.minecraft.world.IWorldReader;
|
|||
import net.minecraft.world.World;
|
||||
|
||||
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) {
|
||||
super(properties);
|
||||
isLarge = large;
|
||||
}
|
||||
public static CogWheelBlock small(Properties properties) {
|
||||
return new CogWheelBlock(false, properties);
|
||||
}
|
||||
|
||||
public static CogWheelBlock small(Properties properties) {
|
||||
return new CogWheelBlock(false, properties);
|
||||
}
|
||||
public static CogWheelBlock large(Properties properties) {
|
||||
return new CogWheelBlock(true, properties);
|
||||
}
|
||||
|
||||
public static CogWheelBlock large(Properties properties) {
|
||||
return new CogWheelBlock(true, properties);
|
||||
}
|
||||
public static boolean isSmallCog(BlockState state) {
|
||||
return AllBlocks.COGWHEEL.has(state);
|
||||
}
|
||||
|
||||
public static boolean isSmallCog(BlockState state) {
|
||||
return AllBlocks.COGWHEEL.has(state);
|
||||
}
|
||||
public static boolean isLargeCog(BlockState state) {
|
||||
return AllBlocks.LARGE_COGWHEEL.has(state);
|
||||
}
|
||||
|
||||
public static boolean isLargeCog(BlockState state) {
|
||||
return AllBlocks.LARGE_COGWHEEL.has(state);
|
||||
}
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.get(AXIS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.get(AXIS));
|
||||
}
|
||||
@Override
|
||||
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
|
||||
for (Direction facing : Iterate.directions) {
|
||||
if (facing.getAxis() == state.get(AXIS))
|
||||
continue;
|
||||
|
||||
@Override
|
||||
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
|
||||
for (Direction facing : Iterate.directions) {
|
||||
if (facing.getAxis() == state.get(AXIS))
|
||||
continue;
|
||||
BlockPos offsetPos = pos.offset(facing);
|
||||
BlockState blockState = worldIn.getBlockState(offsetPos);
|
||||
if (blockState.contains(AXIS) && facing.getAxis() == blockState.get(AXIS))
|
||||
continue;
|
||||
|
||||
BlockState blockState = worldIn.getBlockState(pos.offset(facing));
|
||||
if (blockState.contains(AXIS) && facing.getAxis() == blockState.get(AXIS))
|
||||
continue;
|
||||
|
||||
if (isLargeCog(blockState) || isLarge && isSmallCog(blockState))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
boolean smallCog = isSmallCog(blockState);
|
||||
if (!smallCog && blockState.getBlock() instanceof IRotate)
|
||||
smallCog = ((IRotate) blockState.getBlock()).hasIntegratedCogwheel(worldIn, offsetPos, blockState);
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite());
|
||||
World world = context.getWorld();
|
||||
BlockState placedAgainst = world.getBlockState(placedOnPos);
|
||||
Block block = placedAgainst.getBlock();
|
||||
if (isLargeCog(blockState) || isLarge && smallCog)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (context.getPlayer() != null && context.getPlayer().isSneaking())
|
||||
return this.getDefaultState().with(AXIS, context.getFace().getAxis());
|
||||
|
||||
BlockState stateBelow = world.getBlockState(context.getPos()
|
||||
.down());
|
||||
FluidState FluidState = context.getWorld().getFluidState(context.getPos());
|
||||
if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLarge) {
|
||||
return this.getDefaultState()
|
||||
.with(BlockStateProperties.WATERLOGGED, FluidState.getFluid() == Fluids.WATER)
|
||||
.with(AXIS, stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X);
|
||||
}
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
BlockPos placedOnPos = context.getPos()
|
||||
.offset(context.getFace()
|
||||
.getOpposite());
|
||||
World world = context.getWorld();
|
||||
BlockState placedAgainst = world.getBlockState(placedOnPos);
|
||||
Block block = placedAgainst.getBlock();
|
||||
|
||||
if (!(block instanceof IRotate)
|
||||
|| !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) {
|
||||
Axis preferredAxis = getPreferredAxis(context);
|
||||
if (preferredAxis != null)
|
||||
return this.getDefaultState()
|
||||
.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);
|
||||
}
|
||||
if (context.getPlayer() != null && context.getPlayer()
|
||||
.isSneaking())
|
||||
return this.getDefaultState()
|
||||
.with(AXIS, context.getFace()
|
||||
.getAxis());
|
||||
|
||||
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
|
||||
public float getParticleTargetRadius() {
|
||||
return isLarge ? 1.125f : .65f;
|
||||
}
|
||||
if (!(block instanceof IRotate)
|
||||
|| !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) {
|
||||
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
|
||||
public float getParticleInitialRadius() {
|
||||
return isLarge ? 1f : .75f;
|
||||
}
|
||||
return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst));
|
||||
}
|
||||
|
||||
public void fillItemGroup(ItemGroup group, NonNullList<ItemStack> items) {
|
||||
items.add(new ItemStack(this));
|
||||
}
|
||||
@Override
|
||||
public float getParticleTargetRadius() {
|
||||
return isLarge ? 1.125f : .65f;
|
||||
}
|
||||
|
||||
// IRotate
|
||||
@Override
|
||||
public float getParticleInitialRadius() {
|
||||
return isLarge ? 1f : .75f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
|
||||
return !isLarge;
|
||||
}
|
||||
public void fillItemGroup(ItemGroup group, NonNullList<ItemStack> items) {
|
||||
items.add(new ItemStack(this));
|
||||
}
|
||||
|
||||
// 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> {
|
||||
|
||||
protected ArrayList<InstanceKey<RotatingData>> keys;
|
||||
protected final ArrayList<InstanceKey<RotatingData>> keys;
|
||||
|
||||
public SplitShaftInstance(InstancedTileRenderer<?> modelManager, SplitShaftTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
keys = new ArrayList<>(2);
|
||||
|
||||
Block block = lastState.getBlock();
|
||||
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(lastState);
|
||||
Block block = blockState.getBlock();
|
||||
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(blockState);
|
||||
|
||||
float speed = tile.getSpeed();
|
||||
|
||||
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);
|
||||
|
||||
|
@ -42,9 +39,9 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
Block block = lastState.getBlock();
|
||||
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(lastState);
|
||||
public void update() {
|
||||
Block block = blockState.getBlock();
|
||||
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(blockState);
|
||||
|
||||
Direction[] directions = Iterate.directionsInAxis(boxAxis);
|
||||
|
||||
|
@ -55,7 +52,7 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
|
|||
|
||||
@Override
|
||||
public void updateLight() {
|
||||
keys.forEach(key -> relight(pos, ((InstanceKey<? extends KineticData<?>>) key).getInstance()));
|
||||
keys.forEach(key -> relight(pos, ((InstanceKey<? extends KineticData>) key).getInstance()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -68,9 +65,9 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
|
|||
Direction.Axis axis = dir.getAxis();
|
||||
|
||||
key.getInstance()
|
||||
.setColor(tile.network)
|
||||
.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir))
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector());
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
||||
.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir))
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.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.relays.encased.ShaftInstance;
|
||||
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.InstancedModel;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
||||
|
@ -19,26 +19,21 @@ import net.minecraft.util.math.MathHelper;
|
|||
|
||||
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 GaugeInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
||||
super(dispatcher, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
faces = new ArrayList<>(2);
|
||||
|
||||
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();
|
||||
|
||||
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);
|
||||
|
||||
for (Direction facing : Iterate.directions) {
|
||||
if (!gaugeBlock.shouldRenderHeadOnFace(world, pos, lastState, facing))
|
||||
if (!gaugeBlock.shouldRenderHeadOnFace(world, pos, blockState, facing))
|
||||
continue;
|
||||
|
||||
DialFace face = makeFace(facing, dialModel, headModel);
|
||||
|
@ -66,7 +61,7 @@ public abstract class GaugeInstance extends ShaftInstance implements ITickableIn
|
|||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
GaugeTileEntity gaugeTile = (GaugeTileEntity) tile;
|
||||
|
||||
if (MathHelper.epsilonEquals(gaugeTile.prevDialState, gaugeTile.dialState))
|
||||
|
@ -159,7 +154,7 @@ public abstract class GaugeInstance extends ShaftInstance implements ITickableIn
|
|||
|
||||
@Override
|
||||
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
|
||||
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> {
|
||||
|
||||
protected EnumMap<Direction, InstanceKey<RotatingData>> keys;
|
||||
protected final EnumMap<Direction, InstanceKey<RotatingData>> keys;
|
||||
protected Direction sourceFacing;
|
||||
|
||||
public GearboxInstance(InstancedTileRenderer<?> modelManager, GearboxTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
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 skyLight = world.getLightLevel(LightType.SKY, pos);
|
||||
|
@ -39,17 +36,17 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
|
|||
if (boxAxis == axis)
|
||||
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();
|
||||
|
||||
key.getInstance()
|
||||
.setBlockLight(blockLight)
|
||||
.setSkyLight(skyLight)
|
||||
.setRotationalSpeed(getSpeed(direction))
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
||||
.setTileEntity(tile);
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
||||
.setRotationalSpeed(getSpeed(direction))
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setTileEntity(tile)
|
||||
.setBlockLight(blockLight)
|
||||
.setSkyLight(skyLight);
|
||||
|
||||
keys.put(direction, key);
|
||||
}
|
||||
|
@ -77,18 +74,18 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
public void update() {
|
||||
updateSourceFacing();
|
||||
for (Map.Entry<Direction, InstanceKey<RotatingData>> key : keys.entrySet()) {
|
||||
Direction direction = key.getKey();
|
||||
Direction.Axis axis = direction.getAxis();
|
||||
|
||||
key.getValue()
|
||||
.getInstance()
|
||||
.setColor(tile.network)
|
||||
.setRotationalSpeed(getSpeed(direction))
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector());
|
||||
.getInstance()
|
||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
||||
.setRotationalSpeed(getSpeed(direction))
|
||||
.setRotationOffset(getRotationOffset(axis))
|
||||
.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.VertexAttribSpec;
|
||||
|
||||
public enum FlapVertexAttributes implements IVertexAttrib {
|
||||
public enum FlapAttributes implements IVertexAttrib {
|
||||
INSTANCE_POSITION("aInstancePos",CommonAttributes.VEC3),
|
||||
LIGHT("aLight", CommonAttributes.LIGHT),
|
||||
SEGMENT_OFFSET("aSegmentOffset", CommonAttributes.VEC3),
|
||||
|
@ -19,7 +19,7 @@ public enum FlapVertexAttributes implements IVertexAttrib {
|
|||
private final String name;
|
||||
private final VertexAttribSpec spec;
|
||||
|
||||
FlapVertexAttributes(String name, VertexAttribSpec spec) {
|
||||
FlapAttributes(String name, VertexAttribSpec spec) {
|
||||
this.name = name;
|
||||
this.spec = spec;
|
||||
}
|
|
@ -1,122 +1,120 @@
|
|||
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.InstancedModel;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.impl.IFlatLight;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.vector.Vector3f;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public class FlapData extends InstanceData {
|
||||
public class FlapData extends InstanceData implements IFlatLight<FlapData> {
|
||||
|
||||
public static VertexFormat FORMAT = VertexFormat.builder()
|
||||
.addAttributes(FlapVertexAttributes.class)
|
||||
.build();
|
||||
private float x;
|
||||
private float y;
|
||||
private float z;
|
||||
private byte blockLight;
|
||||
private byte skyLight;
|
||||
|
||||
private float x;
|
||||
private float y;
|
||||
private float z;
|
||||
private byte blockLight;
|
||||
private byte skyLight;
|
||||
private float segmentOffsetX;
|
||||
private float segmentOffsetY;
|
||||
private float segmentOffsetZ;
|
||||
|
||||
private float segmentOffsetX;
|
||||
private float segmentOffsetY;
|
||||
private float segmentOffsetZ;
|
||||
private float pivotX;
|
||||
private float pivotY;
|
||||
private float pivotZ;
|
||||
|
||||
private float pivotX;
|
||||
private float pivotY;
|
||||
private float pivotZ;
|
||||
private float horizontalAngle;
|
||||
private float intensity;
|
||||
private float flapScale;
|
||||
|
||||
private float horizontalAngle;
|
||||
private float intensity;
|
||||
private float flapScale;
|
||||
private float flapness;
|
||||
|
||||
private float flapness;
|
||||
public FlapData(InstancedModel<?> owner) {
|
||||
super(owner);
|
||||
}
|
||||
|
||||
public FlapData(InstancedModel<?> owner) {
|
||||
super(owner);
|
||||
}
|
||||
public FlapData setPosition(BlockPos pos) {
|
||||
return setPosition(pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
|
||||
public FlapData setPosition(BlockPos pos) {
|
||||
return setPosition(pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
public FlapData setPosition(Vector3f pos) {
|
||||
return setPosition(pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
|
||||
public FlapData setPosition(Vector3f pos) {
|
||||
return setPosition(pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
public FlapData setPosition(int x, int y, int z) {
|
||||
BlockPos origin = owner.renderer.getOriginCoordinate();
|
||||
|
||||
public FlapData setPosition(int x, int y, int z) {
|
||||
BlockPos origin = owner.renderer.getOriginCoordinate();
|
||||
return setPosition((float) (x - origin.getX()),
|
||||
(float) (y - origin.getY()),
|
||||
(float) (z - origin.getZ()));
|
||||
}
|
||||
|
||||
return setPosition((float) (x - origin.getX()),
|
||||
(float) (y - origin.getY()),
|
||||
(float) (z - origin.getZ()));
|
||||
}
|
||||
public FlapData setPosition(float x, float y, float z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setPosition(float x, float y, float z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
return this;
|
||||
}
|
||||
@Override
|
||||
public FlapData setBlockLight(int blockLight) {
|
||||
this.blockLight = (byte) ((blockLight & 0xF) << 4);
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setBlockLight(int blockLight) {
|
||||
this.blockLight = (byte) ((blockLight & 0xF) << 4);
|
||||
return this;
|
||||
}
|
||||
@Override
|
||||
public FlapData setSkyLight(int skyLight) {
|
||||
this.skyLight = (byte) ((skyLight & 0xF) << 4);
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setSkyLight(int skyLight) {
|
||||
this.skyLight = (byte) ((skyLight & 0xF) << 4);
|
||||
return this;
|
||||
}
|
||||
public FlapData setSegmentOffset(float x, float y, float z) {
|
||||
this.segmentOffsetX = x;
|
||||
this.segmentOffsetY = y;
|
||||
this.segmentOffsetZ = z;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setSegmentOffset(float x, float y, float z) {
|
||||
this.segmentOffsetX = x;
|
||||
this.segmentOffsetY = y;
|
||||
this.segmentOffsetZ = z;
|
||||
return this;
|
||||
}
|
||||
public FlapData setIntensity(float intensity) {
|
||||
this.intensity = intensity;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setIntensity(float intensity) {
|
||||
this.intensity = intensity;
|
||||
return this;
|
||||
}
|
||||
public FlapData setHorizontalAngle(float horizontalAngle) {
|
||||
this.horizontalAngle = horizontalAngle;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setHorizontalAngle(float horizontalAngle) {
|
||||
this.horizontalAngle = horizontalAngle;
|
||||
return this;
|
||||
}
|
||||
public FlapData setFlapScale(float flapScale) {
|
||||
this.flapScale = flapScale;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setFlapScale(float flapScale) {
|
||||
this.flapScale = flapScale;
|
||||
return this;
|
||||
}
|
||||
public FlapData setFlapness(float flapness) {
|
||||
this.flapness = flapness;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setFlapness(float flapness) {
|
||||
this.flapness = flapness;
|
||||
return this;
|
||||
}
|
||||
public FlapData setPivotVoxelSpace(float x, float y, float z) {
|
||||
pivotX = x / 16f;
|
||||
pivotY = y / 16f;
|
||||
pivotZ = z / 16f;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FlapData setPivotVoxelSpace(float x, float y, float z) {
|
||||
pivotX = x / 16f;
|
||||
pivotY = y / 16f;
|
||||
pivotZ = z / 16f;
|
||||
return this;
|
||||
}
|
||||
@Override
|
||||
public void write(ByteBuffer buf) {
|
||||
putVec3(buf, x, y, z);
|
||||
putVec2(buf, blockLight, skyLight);
|
||||
|
||||
@Override
|
||||
public void write(ByteBuffer buf) {
|
||||
putVec3(buf, x, y, z);
|
||||
putVec2(buf, blockLight, skyLight);
|
||||
putVec3(buf, segmentOffsetX, segmentOffsetY, segmentOffsetZ);
|
||||
putVec3(buf, pivotX, pivotY, pivotZ);
|
||||
|
||||
putVec3(buf, segmentOffsetX, segmentOffsetY, segmentOffsetZ);
|
||||
putVec3(buf, pivotX, pivotY, pivotZ);
|
||||
put(buf, horizontalAngle);
|
||||
put(buf, intensity);
|
||||
put(buf, flapScale);
|
||||
|
||||
put(buf, horizontalAngle);
|
||||
put(buf, intensity);
|
||||
put(buf, flapScale);
|
||||
|
||||
put(buf, flapness);
|
||||
}
|
||||
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.Map;
|
||||
|
||||
public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity> implements ITickableInstance {
|
||||
public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity> implements IDynamicInstance {
|
||||
|
||||
|
||||
private Map<Direction, ArrayList<InstanceKey<FlapData>>> tunnelFlaps;
|
||||
private final Map<Direction, ArrayList<InstanceKey<FlapData>>> tunnelFlaps;
|
||||
|
||||
public BeltTunnelInstance(InstancedTileRenderer<?> modelManager, BeltTunnelTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
tunnelFlaps = new EnumMap<>(Direction.class);
|
||||
|
||||
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 skyLight = world.getLightLevel(LightType.SKY, pos);
|
||||
|
@ -68,7 +64,7 @@ public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity>
|
|||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
tunnelFlaps.forEach((direction, keys) -> {
|
||||
InterpolatedValue flapValue = tile.flaps.get(direction);
|
||||
if (flapValue == null) {
|
||||
|
@ -82,9 +78,6 @@ public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity>
|
|||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onUpdate() { }
|
||||
|
||||
@Override
|
||||
public void updateLight() {
|
||||
int blockLight = world.getLightLevel(LightType.BLOCK, pos);
|
||||
|
|
|
@ -1,5 +1,14 @@
|
|||
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.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
|
||||
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.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRendered {
|
||||
|
||||
|
@ -98,7 +104,7 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe
|
|||
super.fromTag(state, compound, clientPacket);
|
||||
|
||||
if (clientPacket)
|
||||
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this));
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this));
|
||||
}
|
||||
|
||||
public void updateTunnelConnections() {
|
||||
|
@ -170,6 +176,11 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe
|
|||
flapsToSend.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldRenderAsTE() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
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.goggles.IHaveGoggleInformation;
|
||||
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.config.AllConfigs;
|
||||
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
|
||||
|
@ -154,7 +155,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||
if (!handleDownwardOutput(true))
|
||||
nextOffset = .5f;
|
||||
else if (nextOffset < 0) {
|
||||
handleDownwardOutput(world.isRemote);
|
||||
handleDownwardOutput(world.isRemote && !isVirtual());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -165,7 +166,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||
if (!handleUpwardOutput(true))
|
||||
nextOffset = .5f;
|
||||
else if (nextOffset > 1) {
|
||||
handleUpwardOutput(world.isRemote);
|
||||
handleUpwardOutput(world.isRemote && !isVirtual());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -379,6 +380,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||
.isHorizontal())
|
||||
return false;
|
||||
|
||||
if (FunnelBlock.getFunnelFacing(world.getBlockState(pos.down())) == Direction.DOWN)
|
||||
return false;
|
||||
if (Block.hasSolidSideOnTop(world, pos.down()))
|
||||
return false;
|
||||
|
||||
|
@ -433,6 +436,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||
return true;
|
||||
}
|
||||
|
||||
if (FunnelBlock.getFunnelFacing(world.getBlockState(pos.up())) == Direction.UP)
|
||||
return false;
|
||||
if (BlockHelper.hasBlockSolidSide(stateAbove, world, pos.up(), Direction.DOWN))
|
||||
return false;
|
||||
if (!inputChutes.isEmpty())
|
||||
|
|
|
@ -99,6 +99,8 @@ public class DepotTileEntity extends SmartTileEntity {
|
|||
continue;
|
||||
ItemStack afterInsert =
|
||||
getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null);
|
||||
if (afterInsert == null)
|
||||
return false;
|
||||
if (previousItem.getCount() != afterInsert.getCount()) {
|
||||
processingOutputBuffer.setStackInSlot(slot, afterInsert);
|
||||
notifyUpdate();
|
||||
|
@ -109,6 +111,8 @@ public class DepotTileEntity extends SmartTileEntity {
|
|||
ItemStack previousItem = heldItem.stack;
|
||||
ItemStack afterInsert =
|
||||
getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null);
|
||||
if (afterInsert == null)
|
||||
return false;
|
||||
if (previousItem.getCount() != afterInsert.getCount()) {
|
||||
if (afterInsert.isEmpty())
|
||||
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 com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered;
|
||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||
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.text.ITextComponent;
|
||||
|
||||
public class AdjustableRepeaterTileEntity extends SmartTileEntity {
|
||||
public class AdjustableRepeaterTileEntity extends SmartTileEntity implements IInstanceRendered {
|
||||
|
||||
public int state;
|
||||
public boolean charging;
|
||||
|
@ -116,5 +117,4 @@ public class AdjustableRepeaterTileEntity extends SmartTileEntity {
|
|||
|
||||
state += charging ? 1 : -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -10,29 +10,26 @@ import net.minecraft.world.LightType;
|
|||
|
||||
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) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
flaps = new ArrayList<>(4);
|
||||
|
||||
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);
|
||||
InstancedModel<FlapData> model = modelManager.getMaterial(KineticRenderMaterials.FLAPS)
|
||||
.getModel(flapPartial, lastState);
|
||||
.getModel(flapPartial, blockState);
|
||||
|
||||
int blockLight = world.getLightLevel(LightType.BLOCK, 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 horizontalAngle = direction.getOpposite().getHorizontalAngle();
|
||||
|
@ -59,7 +56,7 @@ public class FunnelInstance extends TileEntityInstance<FunnelTileEntity> impleme
|
|||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
if (flaps == null) return;
|
||||
|
||||
float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks());
|
||||
|
@ -71,16 +68,8 @@ public class FunnelInstance extends TileEntityInstance<FunnelTileEntity> impleme
|
|||
|
||||
@Override
|
||||
public void updateLight() {
|
||||
if (flaps == null) return;
|
||||
|
||||
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);
|
||||
}
|
||||
if (flaps != null)
|
||||
relight(pos, flaps.stream().map(InstanceKey::getInstance));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -263,6 +263,8 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn
|
|||
return false;
|
||||
if (!(blockState.getBlock() instanceof FunnelBlock))
|
||||
return false;
|
||||
if (blockState.get(FunnelBlock.EXTRACTING))
|
||||
return false;
|
||||
return FunnelBlock.getFunnelFacing(blockState) == Direction.UP;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,144 +21,137 @@ import net.minecraft.util.math.MathHelper;
|
|||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ArmInstance extends SingleRotatingInstance implements ITickableInstance {
|
||||
public class ArmInstance extends SingleRotatingInstance implements IDynamicInstance {
|
||||
|
||||
private InstanceKey<ModelData> base;
|
||||
private InstanceKey<ModelData> lowerBody;
|
||||
private InstanceKey<ModelData> upperBody;
|
||||
private InstanceKey<ModelData> head;
|
||||
private InstanceKey<ModelData> claw;
|
||||
private ArrayList<InstanceKey<ModelData>> clawGrips;
|
||||
final InstanceKey<ModelData> base;
|
||||
final InstanceKey<ModelData> lowerBody;
|
||||
final InstanceKey<ModelData> upperBody;
|
||||
final InstanceKey<ModelData> head;
|
||||
final InstanceKey<ModelData> claw;
|
||||
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) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
|
||||
|
||||
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();
|
||||
lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, lastState).createInstance();
|
||||
upperBody = mat.getModel(AllBlockPartials.ARM_UPPER_BODY, lastState).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, blockState);
|
||||
InstanceKey<ModelData> clawGrip1 = clawHalfModel.createInstance();
|
||||
InstanceKey<ModelData> clawGrip2 = clawHalfModel.createInstance();
|
||||
|
||||
InstancedModel<ModelData> clawHalfModel = mat.getModel(AllBlockPartials.ARM_CLAW_GRIP, lastState);
|
||||
InstanceKey<ModelData> clawGrip1 = clawHalfModel.createInstance();
|
||||
InstanceKey<ModelData> clawGrip2 = clawHalfModel.createInstance();
|
||||
clawGrips = Lists.newArrayList(clawGrip1, clawGrip2);
|
||||
models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2);
|
||||
|
||||
clawGrips = Lists.newArrayList(clawGrip1, clawGrip2);
|
||||
models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2);
|
||||
updateLight();
|
||||
}
|
||||
|
||||
firstTick = true;
|
||||
tick();
|
||||
updateLight();
|
||||
}
|
||||
@Override
|
||||
public void beginFrame() {
|
||||
ArmTileEntity arm = (ArmTileEntity) tile;
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
ArmTileEntity arm = (ArmTileEntity) tile;
|
||||
boolean settled = arm.baseAngle.settled() && arm.lowerArmAngle.settled() && arm.upperArmAngle.settled() && arm.headAngle.settled();
|
||||
boolean rave = arm.phase == ArmTileEntity.Phase.DANCING;
|
||||
|
||||
boolean settled = arm.baseAngle.settled() && arm.lowerArmAngle.settled() && arm.upperArmAngle.settled() && arm.headAngle.settled();
|
||||
boolean rave = arm.phase == ArmTileEntity.Phase.DANCING;
|
||||
if (!settled || rave || firstTick)
|
||||
transformModels(arm, rave);
|
||||
|
||||
if (!settled || rave || firstTick)
|
||||
transformModels(arm, rave);
|
||||
if (settled)
|
||||
firstTick = false;
|
||||
}
|
||||
|
||||
if (settled)
|
||||
firstTick = false;
|
||||
}
|
||||
private void transformModels(ArmTileEntity arm, boolean rave) {
|
||||
float pt = AnimationTickHolder.getPartialTicks();
|
||||
int color = 0xFFFFFF;
|
||||
|
||||
private void transformModels(ArmTileEntity arm, boolean rave) {
|
||||
float pt = AnimationTickHolder.getPartialTicks();
|
||||
int color = 0xFFFFFF;
|
||||
float baseAngle = arm.baseAngle.get(pt);
|
||||
float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135;
|
||||
float upperArmAngle = arm.upperArmAngle.get(pt) - 90;
|
||||
float headAngle = arm.headAngle.get(pt);
|
||||
|
||||
float baseAngle = arm.baseAngle.get(pt);
|
||||
float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135;
|
||||
float upperArmAngle = arm.upperArmAngle.get(pt) - 90;
|
||||
float headAngle = arm.headAngle.get(pt);
|
||||
|
||||
if (rave) {
|
||||
float renderTick = AnimationTickHolder.getRenderTime(arm.getWorld()) + (tile.hashCode() % 64);
|
||||
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);
|
||||
}
|
||||
if (rave) {
|
||||
float renderTick = AnimationTickHolder.getRenderTime(arm.getWorld()) + (tile.hashCode() % 64);
|
||||
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();
|
||||
MatrixStacker msr = MatrixStacker.of(msLocal);
|
||||
msr.translate(getFloatingPos());
|
||||
msr.centre();
|
||||
MatrixStack msLocal = new MatrixStack();
|
||||
MatrixStacker msr = MatrixStacker.of(msLocal);
|
||||
msr.translate(getFloatingPos());
|
||||
msr.centre();
|
||||
|
||||
if (lastState.get(ArmBlock.CEILING))
|
||||
msr.rotateX(180);
|
||||
if (blockState.get(ArmBlock.CEILING))
|
||||
msr.rotateX(180);
|
||||
|
||||
ArmRenderer.transformBase(msr, baseAngle);
|
||||
base.getInstance()
|
||||
.setTransform(msLocal);
|
||||
ArmRenderer.transformBase(msr, baseAngle);
|
||||
base.getInstance()
|
||||
.setTransform(msLocal);
|
||||
|
||||
ArmRenderer.transformLowerArm(msr, lowerArmAngle);
|
||||
lowerBody.getInstance()
|
||||
.setColor(color)
|
||||
.setTransform(msLocal);
|
||||
ArmRenderer.transformLowerArm(msr, lowerArmAngle);
|
||||
lowerBody.getInstance()
|
||||
.setTransform(msLocal)
|
||||
.setColor(color);
|
||||
|
||||
ArmRenderer.transformUpperArm(msr, upperArmAngle);
|
||||
upperBody.getInstance()
|
||||
.setColor(color)
|
||||
.setTransform(msLocal);
|
||||
ArmRenderer.transformUpperArm(msr, upperArmAngle);
|
||||
upperBody.getInstance()
|
||||
.setTransform(msLocal)
|
||||
.setColor(color);
|
||||
|
||||
ArmRenderer.transformHead(msr, headAngle);
|
||||
head.getInstance()
|
||||
.setTransform(msLocal);
|
||||
ArmRenderer.transformHead(msr, headAngle);
|
||||
head.getInstance()
|
||||
.setTransform(msLocal);
|
||||
|
||||
ArmRenderer.transformClaw(msr);
|
||||
claw.getInstance()
|
||||
.setTransform(msLocal);
|
||||
ArmRenderer.transformClaw(msr);
|
||||
claw.getInstance()
|
||||
.setTransform(msLocal);
|
||||
|
||||
ItemStack item = arm.heldItem;
|
||||
ItemRenderer itemRenderer = Minecraft.getInstance()
|
||||
.getItemRenderer();
|
||||
boolean hasItem = !item.isEmpty();
|
||||
boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem)
|
||||
&& itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null)
|
||||
.isGui3d();
|
||||
ItemStack item = arm.heldItem;
|
||||
ItemRenderer itemRenderer = Minecraft.getInstance()
|
||||
.getItemRenderer();
|
||||
boolean hasItem = !item.isEmpty();
|
||||
boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem)
|
||||
&& itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null)
|
||||
.isGui3d();
|
||||
|
||||
for (int index : Iterate.zeroAndOne) {
|
||||
msLocal.push();
|
||||
int flip = index * 2 - 1;
|
||||
ArmRenderer.transformClawHalf(msr, hasItem, isBlockItem, flip);
|
||||
clawGrips.get(index)
|
||||
.getInstance()
|
||||
.setTransform(msLocal);
|
||||
msLocal.pop();
|
||||
}
|
||||
}
|
||||
for (int index : Iterate.zeroAndOne) {
|
||||
msLocal.push();
|
||||
int flip = index * 2 - 1;
|
||||
ArmRenderer.transformClawHalf(msr, hasItem, isBlockItem, flip);
|
||||
clawGrips.get(index)
|
||||
.getInstance()
|
||||
.setTransform(msLocal);
|
||||
msLocal.pop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLight() {
|
||||
super.updateLight();
|
||||
@Override
|
||||
public void updateLight() {
|
||||
super.updateLight();
|
||||
|
||||
relight(pos, models.stream().map(InstanceKey::getInstance));
|
||||
}
|
||||
relight(pos, models.stream().map(InstanceKey::getInstance));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected InstancedModel<RotatingData> getModel() {
|
||||
return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState());
|
||||
}
|
||||
@Override
|
||||
protected InstancedModel<RotatingData> getModel() {
|
||||
return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
super.remove();
|
||||
models.forEach(InstanceKey::delete);
|
||||
}
|
||||
@Override
|
||||
public void remove() {
|
||||
super.remove();
|
||||
models.forEach(InstanceKey::delete);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
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.mojang.blaze3d.matrix.MatrixStack;
|
||||
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.saw.SawBlock;
|
||||
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.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.FunnelTileEntity;
|
||||
import com.simibubi.create.foundation.advancement.AllTriggers;
|
||||
import com.simibubi.create.foundation.item.SmartInventory;
|
||||
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.inventory.InvManipulationBehaviour;
|
||||
import com.simibubi.create.foundation.utility.NBTHelper;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
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.vector.Vector3d;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
@ -48,9 +63,6 @@ import net.minecraftforge.items.IItemHandler;
|
|||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.wrapper.InvWrapper;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public abstract class ArmInteractionPoint {
|
||||
|
||||
enum Mode {
|
||||
|
@ -65,21 +77,21 @@ public abstract class ArmInteractionPoint {
|
|||
private ArmAngleTarget cachedAngles;
|
||||
|
||||
private static ImmutableMap<ArmInteractionPoint, Supplier<ArmInteractionPoint>> POINTS =
|
||||
ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder()
|
||||
.put(new Saw(), Saw::new)
|
||||
.put(new Belt(), Belt::new)
|
||||
.put(new Depot(), Depot::new)
|
||||
.put(new Chute(), Chute::new)
|
||||
.put(new Basin(), Basin::new)
|
||||
.put(new Funnel(), Funnel::new)
|
||||
.put(new Jukebox(), Jukebox::new)
|
||||
.put(new Crafter(), Crafter::new)
|
||||
.put(new Deployer(), Deployer::new)
|
||||
.put(new Composter(), Composter::new)
|
||||
.put(new Millstone(), Millstone::new)
|
||||
.put(new BlazeBurner(), BlazeBurner::new)
|
||||
.put(new CrushingWheels(), CrushingWheels::new)
|
||||
.build();
|
||||
ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder()
|
||||
.put(new Saw(), Saw::new)
|
||||
.put(new Belt(), Belt::new)
|
||||
.put(new Depot(), Depot::new)
|
||||
.put(new Chute(), Chute::new)
|
||||
.put(new Basin(), Basin::new)
|
||||
.put(new Funnel(), Funnel::new)
|
||||
.put(new Jukebox(), Jukebox::new)
|
||||
.put(new Crafter(), Crafter::new)
|
||||
.put(new Deployer(), Deployer::new)
|
||||
.put(new Composter(), Composter::new)
|
||||
.put(new Millstone(), Millstone::new)
|
||||
.put(new BlazeBurner(), BlazeBurner::new)
|
||||
.put(new CrushingWheels(), CrushingWheels::new)
|
||||
.build();
|
||||
|
||||
public ArmInteractionPoint() {
|
||||
cachedHandler = LazyOptional.empty();
|
||||
|
@ -108,6 +120,8 @@ public abstract class ArmInteractionPoint {
|
|||
return isValid(reader, pos, reader.getBlockState(pos));
|
||||
}
|
||||
|
||||
void keepAlive(IWorld world) {}
|
||||
|
||||
abstract boolean isValid(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) {
|
||||
if (cachedAngles == null)
|
||||
cachedAngles = new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling);
|
||||
cachedAngles =
|
||||
new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling);
|
||||
|
||||
return cachedAngles;
|
||||
}
|
||||
|
@ -167,7 +182,8 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
for (ArmInteractionPoint armInteractionPoint : POINTS.keySet())
|
||||
if (armInteractionPoint.isValid(world, pos, state))
|
||||
point = POINTS.get(armInteractionPoint).get();
|
||||
point = POINTS.get(armInteractionPoint)
|
||||
.get();
|
||||
|
||||
if (point != null) {
|
||||
point.state = state;
|
||||
|
@ -222,7 +238,7 @@ public abstract class ArmInteractionPoint {
|
|||
@Override
|
||||
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
|
||||
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
|
||||
@Override
|
||||
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
|
||||
Direction getInteractionDirection() {
|
||||
return state.get(DeployerBlock.FACING).getOpposite();
|
||||
return state.get(DeployerBlock.FACING)
|
||||
.getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -299,13 +317,15 @@ public abstract class ArmInteractionPoint {
|
|||
@Override
|
||||
ItemStack insert(World world, ItemStack stack, boolean simulate) {
|
||||
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;
|
||||
}
|
||||
ActionResult<ItemStack> res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, simulate);
|
||||
return res.getType() == ActionResultType.SUCCESS
|
||||
? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1)
|
||||
: stack;
|
||||
? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1)
|
||||
: stack;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -322,7 +342,8 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
Direction getInteractionDirection() {
|
||||
return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING).getOpposite();
|
||||
return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING)
|
||||
.getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -376,7 +397,8 @@ public abstract class ArmInteractionPoint {
|
|||
return stack;
|
||||
JukeboxBlock jukeboxBlock = (JukeboxBlock) state.getBlock();
|
||||
JukeboxTileEntity jukeboxTE = (JukeboxTileEntity) tileEntity;
|
||||
if (!jukeboxTE.getRecord().isEmpty())
|
||||
if (!jukeboxTE.getRecord()
|
||||
.isEmpty())
|
||||
return stack;
|
||||
if (!(stack.getItem() instanceof MusicDiscItem))
|
||||
return stack;
|
||||
|
@ -415,8 +437,30 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
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 {
|
||||
|
@ -448,7 +492,8 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
Direction getInteractionDirection() {
|
||||
return FunnelBlock.getFunnelFacing(state).getOpposite();
|
||||
return FunnelBlock.getFunnelFacing(state)
|
||||
.getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -479,7 +524,9 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
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
|
||||
|
|
|
@ -65,7 +65,7 @@ public class ArmTileEntity extends KineticTileEntity {
|
|||
protected int lastOutputIndex = -1;
|
||||
protected boolean redstoneLocked;
|
||||
|
||||
enum Phase {
|
||||
public enum Phase {
|
||||
SEARCH_INPUTS, MOVE_TO_INPUT, SEARCH_OUTPUTS, MOVE_TO_OUTPUT, DANCING
|
||||
}
|
||||
|
||||
|
@ -107,9 +107,15 @@ public class ArmTileEntity extends KineticTileEntity {
|
|||
initInteractionPoints();
|
||||
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;
|
||||
if (chasedPointProgress < 1)
|
||||
}
|
||||
if (world.isRemote)
|
||||
return;
|
||||
|
||||
if (phase == Phase.MOVE_TO_INPUT)
|
||||
|
@ -491,7 +497,7 @@ public class ArmTileEntity extends KineticTileEntity {
|
|||
@Override
|
||||
protected Vector3d getLocalOffset(BlockState state) {
|
||||
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);
|
||||
return location;
|
||||
}
|
||||
|
|
|
@ -12,35 +12,32 @@ import com.simibubi.create.foundation.utility.MatrixStacker;
|
|||
import net.minecraft.state.properties.AttachFace;
|
||||
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 InstanceKey<ModelData> indicator;
|
||||
protected final InstanceKey<ModelData> handle;
|
||||
protected final InstanceKey<ModelData> indicator;
|
||||
|
||||
private float rX;
|
||||
private float rY;
|
||||
final float rX;
|
||||
final float rY;
|
||||
|
||||
public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.MODELS);
|
||||
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
|
||||
|
||||
handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, lastState).createInstance();
|
||||
indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, lastState).createInstance();
|
||||
handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, blockState).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;
|
||||
rY = AngleHelper.horizontalAngle(lastState.get(AnalogLeverBlock.HORIZONTAL_FACING));
|
||||
rY = AngleHelper.horizontalAngle(blockState.get(AnalogLeverBlock.HORIZONTAL_FACING));
|
||||
|
||||
setupModel();
|
||||
updateLight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void beginFrame() {
|
||||
if (!tile.clientState.settled())
|
||||
setupModel();
|
||||
}
|
||||
|
@ -65,7 +62,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
|
|||
.translate(-1 / 2f, -1 / 16f, -1 / 2f);
|
||||
|
||||
handle.getInstance()
|
||||
.setTransformNoCopy(ms);
|
||||
.setTransform(ms);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -87,7 +87,7 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld {
|
|||
try {
|
||||
TileEntity tileEntity = blockState.createTileEntity(this);
|
||||
if (tileEntity != null) {
|
||||
tileEntity.setLocation(this, pos);
|
||||
onTEadded(tileEntity, pos);
|
||||
tileEntities.put(pos, tileEntity);
|
||||
renderedTileEntities.add(tileEntity);
|
||||
}
|
||||
|
@ -98,6 +98,10 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected void onTEadded(TileEntity tileEntity, BlockPos pos) {
|
||||
tileEntity.setLocation(this, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlockState(BlockPos globalPos) {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue