port recent changes

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

View file

@ -141,8 +141,13 @@ fc652317e03b57c76e23a805da16a28d15254029 assets/create/blockstates/fancy_scoria_
5864daf839e54789a0dc8a44505f070bf3e184bc assets/create/blockstates/fancy_weathered_limestone_bricks.json
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

View file

@ -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"

View file

@ -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"

View file

@ -1877,6 +1877,17 @@
"create.ponder.analog_lever.text_2": "Right-click to increase its analog power output",
"create.ponder.analog_lever.text_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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -19,7 +19,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.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);
}
}

View file

@ -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(),

View file

@ -97,6 +97,7 @@ import com.simibubi.create.content.logistics.block.chute.SmartChuteTileEntity;
import com.simibubi.create.content.logistics.block.depot.DepotRenderer;
import com.simibubi.create.content.logistics.block.depot.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();

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -5,10 +5,8 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.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;
}

View file

@ -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);
}
}

View file

@ -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<>();
}

View file

@ -15,27 +15,38 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
}
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis) {
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() {

View file

@ -5,14 +5,14 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.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;
}

View file

@ -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;

View file

@ -3,11 +3,18 @@ package com.simibubi.create.content.contraptions.base;
import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat;
import com.simibubi.create.foundation.render.backend.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;
}
}

View file

@ -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() {

View file

@ -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();

View file

@ -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);
}
}

View file

@ -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();

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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

View file

@ -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());
}
}

View file

@ -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);
}
}

View file

@ -5,7 +5,6 @@ import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileInstance;
import com.simibubi.create.content.contraptions.base.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());

View file

@ -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) {

View file

@ -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();
}

View file

@ -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 {

View file

@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.content.contraptions.base.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) {

View file

@ -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)
;

View file

@ -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) {

View file

@ -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()));
}

View file

@ -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)))

View file

@ -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;

View file

@ -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();

View file

@ -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;
}
}

View file

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

View file

@ -25,12 +25,14 @@ public class NonStationaryLighter<C extends Contraption> extends ContraptionLigh
if (!contraptionBounds.sameAs(bounds)) {
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());

View file

@ -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;
}

View file

@ -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);

View file

@ -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;
}

View file

@ -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() {

View file

@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.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

View file

@ -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;

View file

@ -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;

View file

@ -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);
}
}

View file

@ -5,7 +5,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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();

View file

@ -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);

View file

@ -5,7 +5,7 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.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;

View file

@ -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);

View file

@ -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;
}

View file

@ -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);

View file

@ -5,7 +5,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.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;
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -7,7 +7,9 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.*;
import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo;
import com.simibubi.create.content.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());
}
}
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -5,7 +5,7 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.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);
}
}
}

View file

@ -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);
}
}

View file

@ -5,7 +5,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec;
import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib;
import com.simibubi.create.foundation.render.backend.gl.attrib.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;
}

View file

@ -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);
}
}

View file

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

View file

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

View file

@ -14,21 +14,17 @@ import java.util.Collection;
import java.util.EnumMap;
import java.util.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);

View file

@ -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) {}

View file

@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock;
import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity;
import com.simibubi.create.content.contraptions.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())

View file

@ -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;

View file

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

View file

@ -5,6 +5,7 @@ import static net.minecraft.block.RedstoneDiodeBlock.POWERED;
import java.util.List;
import 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;
}
}

View file

@ -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

View file

@ -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;
}

View file

@ -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);
}
}

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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