Faith in your Depot

- Added Weighted Ejectors
- Fixed? some tunnel distribution inconsistencies
This commit is contained in:
simibubi 2021-03-26 00:15:38 +01:00
parent 2e5d7a734f
commit 718142e26f
68 changed files with 3951 additions and 641 deletions

View file

@ -140,7 +140,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_
fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json
b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json
6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json
37bc041b7449dc4d7962225e606125ba1b188974 assets/create/blockstates/fluid_pipe.json
48086bf71a824faf14841b698050cc8544b09a9b assets/create/blockstates/fluid_pipe.json
f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json
5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json
e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json
@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json
4439fc83a8c7370ab44b211a3fd48abde20a4728 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
@ -391,6 +391,7 @@ fd7a9c7095372485081436c91489cadb2b0c514e assets/create/blockstates/weathered_lim
47f8c91ff4c3f5cad782ab469a1fe5f4909dc7f1 assets/create/blockstates/weathered_limestone_cobblestone_stairs.json
c60c3115fd6eeaa3a696428a87a74d184ab7d62d assets/create/blockstates/weathered_limestone_cobblestone_wall.json
c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_limestone_pillar.json
c838c0792511ca2e14493b40032bb1370fac588a assets/create/blockstates/weighted_ejector.json
512bf17c9ea309b1f7da54440f923530d25e467c assets/create/blockstates/white_sail.json
4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json
89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json
@ -401,20 +402,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
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
ce0e5405da381a86625b908c569c5dbe347abdba assets/create/lang/en_ud.json
5383435fbb7d8be0c6cdc8a4ebfae072645e461f assets/create/lang/en_us.json
f67a8ceef1ec2091b53198e5509e80ac9e5b82c1 assets/create/lang/unfinished/de_de.json
174bd2c5b0fe4560030c4b5f92dd795ce7785245 assets/create/lang/unfinished/es_es.json
20783faf769c31e3d8200ebdc78256e6845e4fc6 assets/create/lang/unfinished/es_mx.json
c33171dd6390d80e39beef5c1511e72e7515c390 assets/create/lang/unfinished/fr_fr.json
38bff62b21ff5c241cab0e06cc161cd12162749e assets/create/lang/unfinished/it_it.json
c5a21a9238d491434fac9552c2372b0e2c5a8612 assets/create/lang/unfinished/ja_jp.json
fab3e5b787268d39fa3b1c31d923e9d4f4b66419 assets/create/lang/unfinished/ko_kr.json
62f4a359bf78057eaf9a3ef73766ee5e25833ce6 assets/create/lang/unfinished/nl_nl.json
4fd663de3f40c2e2c569de95cfce4167e8a42cb1 assets/create/lang/unfinished/pt_br.json
d431bca588528894340f8619cfcd82013eb04635 assets/create/lang/unfinished/ru_ru.json
752dee8e473eb96deaa7a6b1f8405a1313c99cec assets/create/lang/unfinished/zh_cn.json
efe100b3543f98a16f4230b7278a66f9bd00166c 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
@ -1570,6 +1571,7 @@ def7382f3216c59d835ab64f534678f3d31ecc51 assets/create/models/item/weathered_lim
3d26cb5616182ba6926d0bf703119ebfbeacbe31 assets/create/models/item/weathered_limestone_cobblestone_stairs.json
62cba55cef305e8fcbc545363919f75d702a617b assets/create/models/item/weathered_limestone_cobblestone_wall.json
40bed7f5e9e97da45c5d9cebc3fcf87b2b13a808 assets/create/models/item/weathered_limestone_pillar.json
c36834070e12d25cd9e818d0d0181e267584b483 assets/create/models/item/weighted_ejector.json
8914910270736f8f15364c623cd08d4638383cc5 assets/create/models/item/wheat_flour.json
0cc80844db689404d4722c93f1002b0bed05edcd assets/create/models/item/whisk.json
c6253e0f8db3c3992d3f78fe5045e276d39d5b22 assets/create/models/item/white_sail.json
@ -1585,7 +1587,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json
5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json
0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json
187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json
0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json
356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json
@ -1825,6 +1827,7 @@ f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create
07ec7b627bdb049f52dddcce021cec0ad44b0049 data/create/advancements/recipes/create.base/crafting/kinetics/turntable.json
89401c0a6dffa62dbffdbb63986f580a4878402e data/create/advancements/recipes/create.base/crafting/kinetics/vertical_gearboxfrom_conversion.json
4ab6ae87b6c3a29c0c2966dad2fa335a39fafe78 data/create/advancements/recipes/create.base/crafting/kinetics/water_wheel.json
e42093eecd00375bf95d562a6e845ab1a30d7991 data/create/advancements/recipes/create.base/crafting/kinetics/weighted_ejector.json
7c146cc51139c2a8e287a60c8d645fa6f6f48cb1 data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json
f876dcbd2877c921613a4af481c89d66664c1ea8 data/create/advancements/recipes/create.base/crafting/kinetics/white_sail.json
37e545b016a7c5cd283168ac71ace6467a5ad3ef data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json
@ -2688,6 +2691,7 @@ c2a62f12680d04ed4f586c501bb026e367243dd2 data/create/loot_tables/blocks/weathere
a89f425c47c3831071b556697169a3124370aed7 data/create/loot_tables/blocks/weathered_limestone_cobblestone_stairs.json
e8f3af61d9a2fd1ff5b32c9bb474ed005e6d70c4 data/create/loot_tables/blocks/weathered_limestone_cobblestone_wall.json
54358a64639957cc66ffa5296ff45723f7adf00e data/create/loot_tables/blocks/weathered_limestone_pillar.json
e3969f1c5966c4992b3280a06e1d6c5000c37df5 data/create/loot_tables/blocks/weighted_ejector.json
28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/white_sail.json
969eda31556feb5a68e350762848d17453275fee data/create/loot_tables/blocks/white_seat.json
79fe374f8e677088f928a3a49ff5eeed6128d165 data/create/loot_tables/blocks/white_valve_handle.json
@ -2887,6 +2891,7 @@ af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/s
8494f5fcd85a740fa0f0384e3522d8cdd905ce49 data/create/recipes/crafting/kinetics/turntable.json
057c889b0a306f44b8835c896663154ccd9ff12f data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json
4fb009b86a51b2e259bd1f73848803f6276dd820 data/create/recipes/crafting/kinetics/water_wheel.json
254265966b3c7c7a307e908c313a15ce92d20c83 data/create/recipes/crafting/kinetics/weighted_ejector.json
f508d510576c93712e7f5265345a32e8818bbf0d data/create/recipes/crafting/kinetics/whisk.json
d80a741d2f0d4f742217b43d7e4d37f003ec9f9d data/create/recipes/crafting/kinetics/white_sail.json
f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_seat.json

View file

@ -181,10 +181,10 @@
},
{
"when": {
"east": "false",
"west": "true",
"south": "true",
"north": "false"
"west": "true",
"north": "false",
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lu_y"
@ -192,10 +192,10 @@
},
{
"when": {
"east": "true",
"west": "false",
"south": "true",
"north": "false"
"west": "false",
"north": "false",
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ru_y"
@ -203,10 +203,10 @@
},
{
"when": {
"east": "false",
"west": "true",
"south": "false",
"north": "true"
"west": "true",
"north": "true",
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ld_y"
@ -214,10 +214,10 @@
},
{
"when": {
"east": "true",
"west": "false",
"south": "false",
"north": "true"
"west": "false",
"north": "true",
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/rd_y"
@ -225,10 +225,10 @@
},
{
"when": {
"east": "false",
"west": "false",
"south": "true",
"north": "true"
"west": "false",
"north": "true",
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_y"
@ -236,10 +236,10 @@
},
{
"when": {
"east": "false",
"west": "false",
"south": "true",
"north": "false"
"west": "false",
"north": "false",
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_y"
@ -247,10 +247,10 @@
},
{
"when": {
"east": "false",
"west": "false",
"south": "false",
"north": "true"
"west": "false",
"north": "true",
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_y"
@ -258,10 +258,10 @@
},
{
"when": {
"east": "true",
"south": "false",
"west": "true",
"south": "false",
"north": "false"
"north": "false",
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
@ -269,10 +269,10 @@
},
{
"when": {
"east": "false",
"south": "false",
"west": "true",
"south": "false",
"north": "false"
"north": "false",
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
@ -280,10 +280,10 @@
},
{
"when": {
"east": "true",
"west": "false",
"south": "false",
"north": "false"
"west": "false",
"north": "false",
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
@ -291,10 +291,10 @@
},
{
"when": {
"east": "false",
"west": "false",
"south": "false",
"north": "false"
"west": "false",
"north": "false",
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/none_y"
@ -303,9 +303,9 @@
{
"when": {
"down": "false",
"east": "true",
"up": "true",
"west": "false",
"up": "true"
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/lu_z"
@ -314,9 +314,9 @@
{
"when": {
"down": "false",
"east": "false",
"up": "true",
"west": "true",
"up": "true"
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ru_z"
@ -325,9 +325,9 @@
{
"when": {
"down": "true",
"east": "true",
"up": "false",
"west": "false",
"up": "false"
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ld_z"
@ -336,9 +336,9 @@
{
"when": {
"down": "true",
"east": "false",
"up": "false",
"west": "true",
"up": "false"
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/rd_z"
@ -347,9 +347,9 @@
{
"when": {
"down": "true",
"east": "false",
"up": "true",
"west": "false",
"up": "true"
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_z"
@ -358,9 +358,9 @@
{
"when": {
"down": "false",
"east": "false",
"up": "true",
"west": "false",
"up": "true"
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_z"
@ -369,9 +369,9 @@
{
"when": {
"down": "true",
"east": "false",
"up": "false",
"west": "false",
"up": "false"
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_z"
@ -380,9 +380,9 @@
{
"when": {
"down": "false",
"east": "true",
"up": "false",
"west": "true",
"up": "false"
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/lr_z"
@ -391,9 +391,9 @@
{
"when": {
"down": "false",
"east": "true",
"up": "false",
"west": "false",
"up": "false"
"east": "true"
},
"apply": {
"model": "create:block/fluid_pipe/lr_z"
@ -402,9 +402,9 @@
{
"when": {
"down": "false",
"east": "false",
"up": "false",
"west": "true",
"up": "false"
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_z"
@ -413,9 +413,9 @@
{
"when": {
"down": "false",
"east": "false",
"up": "false",
"west": "false",
"up": "false"
"east": "false"
},
"apply": {
"model": "create:block/fluid_pipe/none_z"

View file

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

View file

@ -0,0 +1,19 @@
{
"variants": {
"facing=north": {
"model": "create:block/weighted_ejector/block"
},
"facing=south": {
"model": "create:block/weighted_ejector/block",
"y": 180
},
"facing=west": {
"model": "create:block/weighted_ejector/block",
"y": 270
},
"facing=east": {
"model": "create:block/weighted_ejector/block",
"y": 90
}
}
}

View file

@ -392,6 +392,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM",
"block.create.weathered_limestone_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM",
"block.create.weathered_limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM",
"block.create.weighted_ejector": "\u0279o\u0287\u0254\u01DD\u0638\u018E p\u01DD\u0287\u0265b\u0131\u01DDM",
"block.create.white_sail": "\u05DF\u0131\u0250S \u01DD\u0287\u0131\u0265M",
"block.create.white_seat": "\u0287\u0250\u01DDS \u01DD\u0287\u0131\u0265M",
"block.create.white_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u0287\u0131\u0265M",

View file

@ -395,6 +395,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Weathered Limestone Pillar",
"block.create.weighted_ejector": "Weighted Ejector",
"block.create.white_sail": "White Sail",
"block.create.white_seat": "White Seat",
"block.create.white_valve_handle": "White Valve Handle",
@ -1083,6 +1084,12 @@
"create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(s).",
"create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "Target Selected",
"create.weighted_ejector.target_not_valid": "Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "Round Robin",
@ -1837,22 +1844,24 @@
"create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "Item Transportation",
"create.ponder.tag.logistics.description": "Components which help moving items around",
"create.ponder.tag.movement_anchor": "Movement Anchors",
"create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "Creative Mode",
"create.ponder.tag.creative.description": "Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "Aesthetics",
"create.ponder.tag.decoration.description": "Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force",
"create.ponder.tag.redstone": "Logic Components",
"create.ponder.tag.redstone.description": "Components which help with redstone engineering",
"create.ponder.tag.creative": "Creative Mode",
"create.ponder.tag.creative.description": "Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "Fluid Manipulators",
"create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids",
@ -2154,10 +2163,64 @@
"create.ponder.linear_chassis_group.text_2": "When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "Input",
"create.ponder.mechanical_arm_modes.text_2": "Outputs",
"create.ponder.mechanical_arm_modes.text_3": "Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "Its mining speed depends on the Rotational Input",
@ -2297,6 +2360,16 @@
"create.ponder.rotation_speed_controller.text_1": "Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "Assembling Windmills using Sails",
"create.ponder.sail.text_1": "Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1443",
"_": "Missing Localizations: 1506",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).",
"create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 474",
"_": "Missing Localizations: 537",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "Escaleras de adoquín de piedra caliza erosionada",
"block.create.weathered_limestone_cobblestone_wall": "Pared de adoquínes de piedra caliza erosionada",
"block.create.weathered_limestone_pillar": "Pilar de piedra caliza erosionada",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "Vela blanca",
"block.create.white_seat": "Asiento blanco",
"block.create.white_valve_handle": "Asa de válvula blanco",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "El brazo mecánico tiene %1$s entrada(s) y %2$s salida(s)",
"create.mechanical_arm.points_outside_range": "%1$s punto(s) de interacción seleccionado(s) eliminado(s) debido a las limitaciones de rango",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "Cuando hay múltiples salidas disponibles",
"create.mechanical_arm.selection_mode.round_robin": "Round Robin",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1373",
"_": "Missing Localizations: 1436",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "Escaleras de Piedra Labrada de Caliza Meteorizada",
"block.create.weathered_limestone_cobblestone_wall": "Pared de Piedra Labrada de Caliza Meteorizada",
"block.create.weathered_limestone_pillar": "Pilar de Caliza Meteorizada",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "Vela Blanca",
"block.create.white_seat": "Asiento Blanco",
"block.create.white_valve_handle": "Manija de Válvula Blanca",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).",
"create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1155",
"_": "Missing Localizations: 1218",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Pillier de Calcaire altéré",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).",
"create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 491",
"_": "Missing Localizations: 554",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "Scalini di pietrisco di calcare consumato",
"block.create.weathered_limestone_cobblestone_wall": "Muretto di pietrisco di calcare consumato",
"block.create.weathered_limestone_pillar": "Pilastro di calcare consumato",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "Vela bianca",
"block.create.white_seat": "Sedile bianco",
"block.create.white_valve_handle": "Maniglia per valvola bianca",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "Il braccio meccanico ha %1$s input e %2$s output.",
"create.mechanical_arm.points_outside_range": "%1$s punti di interazione selezionati rimossi per limiti di gamma.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "Quando disponibili diversi output",
"create.mechanical_arm.selection_mode.round_robin": "Round Robin",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 498",
"_": "Missing Localizations: 561",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "風化した石灰岩の丸石の階段",
"block.create.weathered_limestone_cobblestone_wall": "風化した石灰岩の丸石の壁",
"block.create.weathered_limestone_pillar": "風化した石灰岩の柱",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "白色の帆",
"block.create.white_seat": "白色のシート",
"block.create.white_valve_handle": "白色のバルブハンドル",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "メカニカルアームは%1$s個の搬入ブロックと%2$s個の搬出ブロックを持っています。",
"create.mechanical_arm.points_outside_range": "%1$s個の選択ブロックが射程限界のため、除外されました。",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "複数の出力が利用可能なとき:",
"create.mechanical_arm.selection_mode.round_robin": "順繰り分配",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 544",
"_": "Missing Localizations: 607",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "풍화된 석회암 조약돌 계단",
"block.create.weathered_limestone_cobblestone_wall": "풍화된 석회암 조약돌 담장",
"block.create.weathered_limestone_pillar": "풍화된 석회암 기둥",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "하얀색 날개",
"block.create.white_seat": "하얀색 좌석",
"block.create.white_valve_handle": "하얀색 밸브 손잡이",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "이 기계 팔은 %1$s개의 입력부와 %2$s개의 출력부를 가졌습니다.",
"create.mechanical_arm.points_outside_range": "%1$s개의 상호작용 포인트가 거리제한으로 인해 삭제되었습니다.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "다수의 입력부가 존재할 때",
"create.mechanical_arm.selection_mode.round_robin": "순서대로 옮김",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1642",
"_": "Missing Localizations: 1705",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Verweerde Kalksteen Pilaar",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).",
"create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1708",
"_": "Missing Localizations: 1771",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Pilar de Calcário Resistido",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).",
"create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 494",
"_": "Missing Localizations: 557",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "Ступени из известняк-булыжника",
"block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника",
"block.create.weathered_limestone_pillar": "Колонна из выветренного известняка",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "Белый парус",
"block.create.white_seat": "Белое сиденье",
"block.create.white_valve_handle": "Белый ручной вентиль",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "Механическая рука имеет %1$s вход(ов) и %2$s выход(ов).",
"create.mechanical_arm.points_outside_range": "%1$s выбранные точки взаимодействия удалены из-за ограничений диапазона.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "Когда доступно несколько выходов",
"create.mechanical_arm.selection_mode.round_robin": "По кругу",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 492",
"_": "Missing Localizations: 555",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "风化石灰岩圆石楼梯",
"block.create.weathered_limestone_cobblestone_wall": "风化石灰岩圆石墙",
"block.create.weathered_limestone_pillar": "竖纹风化石灰岩",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "白色风帆",
"block.create.white_seat": "白色坐垫",
"block.create.white_valve_handle": "白色阀门手轮",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "动力臂的输入为%1$s输出为%2$s。",
"create.mechanical_arm.points_outside_range": "由于距离限制,选定的交互点%1$s已被移除。",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "当多个输出可用时",
"create.mechanical_arm.selection_mode.round_robin": "轮询调度",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 497",
"_": "Missing Localizations: 560",
"_": "->------------------------] Game Elements [------------------------<-",
@ -396,6 +396,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "碎風化石灰岩樓梯",
"block.create.weathered_limestone_cobblestone_wall": "碎風化石灰岩牆",
"block.create.weathered_limestone_pillar": "豎紋風化石灰岩",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "白色風帆",
"block.create.white_seat": "白色坐墊",
"block.create.white_valve_handle": "白色閥門開關",
@ -1084,6 +1085,12 @@
"create.mechanical_arm.summary": "機械手臂有%1$s 輸入以及 %2$s 輸出。",
"create.mechanical_arm.points_outside_range": "%1$s 由於距離限制,選定的交互點被移除。",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "當多個輸出可用時",
"create.mechanical_arm.selection_mode.round_robin": "輪詢調度",
@ -1838,22 +1845,24 @@
"create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption",
"create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms",
"create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation",
"create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around",
"create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors",
"create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings",
"create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.",
"create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility",
"create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption",
"create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics",
"create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes",
"create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances",
"create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force",
"create.ponder.tag.redstone": "UNLOCALIZED: Logic Components",
"create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering",
"create.ponder.tag.creative": "UNLOCALIZED: Creative Mode",
"create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode",
"create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks",
"create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere",
"create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators",
"create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids",
@ -2155,10 +2164,64 @@
"create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it",
"create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach",
"create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms",
"create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed",
"create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets",
"create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)",
"create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection",
"create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously",
"create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range",
"create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly",
"create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap",
"create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm",
"create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs",
"create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter",
"create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering",
"create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm",
"create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute",
"create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm",
"create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input",
"create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs",
"create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free",
"create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm",
"create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone",
"create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate",
"create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles",
"create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle",
"create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing",
"create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them",
"create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption",
"create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters",
"create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe",
"create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged",
"create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side",
"create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit",
"create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate",
"create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually",
"create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin",
"create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse",
"create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters",
"create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically",
"create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined",
"create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location",
"create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters",
"create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path",
"create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement",
"create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters",
"create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill",
"create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it",
"create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input",
@ -2298,6 +2361,16 @@
"create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails",
"create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with",
"create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them",
"create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames",
"create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames",
"create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with",
"create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks",
"create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts",
"create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions",
"create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI",

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/weighted_ejector/item"
}

View file

@ -28,8 +28,8 @@
"trigger": "create:bracket_apply",
"conditions": {
"accepted_entries": [
"create:large_cogwheel",
"create:cogwheel"
"create:cogwheel",
"create:large_cogwheel"
]
}
},

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/weighted_ejector"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "create:andesite_casing"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/weighted_ejector"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "create:weighted_ejector"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,22 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"A",
"D",
"I"
],
"key": {
"A": {
"item": "create:golden_sheet"
},
"D": {
"item": "create:depot"
},
"I": {
"item": "create:cogwheel"
}
},
"result": {
"item": "create:weighted_ejector"
}
}

View file

@ -123,6 +123,8 @@ public class AllBlockPartials {
GOGGLES = get("goggles"),
EJECTOR_TOP = get("weighted_ejector/top"),
COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"),
COUPLING_RING = getEntity("minecart_coupling/ring"),
COUPLING_CONNECTOR = getEntity("minecart_coupling/connector")

View file

@ -1,10 +1,29 @@
package com.simibubi.create;
import static com.simibubi.create.AllMovementBehaviours.addMovementBehaviour;
import static com.simibubi.create.AllTags.tagBlockAndItem;
import static com.simibubi.create.content.AllSections.SCHEMATICS;
import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock;
import static com.simibubi.create.foundation.data.BlockStateGen.oxidizedBlockstate;
import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures;
import static com.simibubi.create.foundation.data.ModelGen.customItemModel;
import static com.simibubi.create.foundation.data.ModelGen.oxidizedItemModel;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.AllTags.AllItemTags;
import com.simibubi.create.content.AllSections;
import com.simibubi.create.content.contraptions.base.CasingBlock;
import com.simibubi.create.content.contraptions.components.actors.*;
import com.simibubi.create.content.contraptions.components.actors.DrillBlock;
import com.simibubi.create.content.contraptions.components.actors.DrillMovementBehaviour;
import com.simibubi.create.content.contraptions.components.actors.HarvesterBlock;
import com.simibubi.create.content.contraptions.components.actors.HarvesterMovementBehaviour;
import com.simibubi.create.content.contraptions.components.actors.PloughBlock;
import com.simibubi.create.content.contraptions.components.actors.PloughMovementBehaviour;
import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock;
import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceMovement;
import com.simibubi.create.content.contraptions.components.actors.SawMovementBehaviour;
import com.simibubi.create.content.contraptions.components.actors.SeatBlock;
import com.simibubi.create.content.contraptions.components.actors.SeatMovementBehaviour;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockBlock;
import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock;
@ -27,7 +46,11 @@ import com.simibubi.create.content.contraptions.components.motor.CreativeMotorGe
import com.simibubi.create.content.contraptions.components.press.MechanicalPressBlock;
import com.simibubi.create.content.contraptions.components.saw.SawBlock;
import com.simibubi.create.content.contraptions.components.saw.SawGenerator;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.*;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedBearingMovementBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock;
@ -50,7 +73,15 @@ import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyBlock;
import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainBlock;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.*;
import com.simibubi.create.content.contraptions.fluids.pipes.BracketBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.BracketBlockItem;
import com.simibubi.create.content.contraptions.fluids.pipes.BracketGenerator;
import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.GlassFluidPipeBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeGenerator;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankGenerator;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankItem;
@ -72,7 +103,13 @@ import com.simibubi.create.content.contraptions.relays.elementary.BracketedKinet
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem;
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
import com.simibubi.create.content.contraptions.relays.encased.*;
import com.simibubi.create.content.contraptions.relays.encased.AdjustablePulleyBlock;
import com.simibubi.create.content.contraptions.relays.encased.ClutchBlock;
import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock;
import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltGenerator;
import com.simibubi.create.content.contraptions.relays.encased.EncasedCTBehaviour;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock;
import com.simibubi.create.content.contraptions.relays.encased.GearshiftBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator;
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock;
@ -84,23 +121,53 @@ import com.simibubi.create.content.logistics.block.chute.ChuteGenerator;
import com.simibubi.create.content.logistics.block.chute.ChuteItem;
import com.simibubi.create.content.logistics.block.chute.SmartChuteBlock;
import com.simibubi.create.content.logistics.block.depot.DepotBlock;
import com.simibubi.create.content.logistics.block.diodes.*;
import com.simibubi.create.content.logistics.block.funnel.*;
import com.simibubi.create.content.logistics.block.depot.EjectorBlock;
import com.simibubi.create.content.logistics.block.depot.EjectorItem;
import com.simibubi.create.content.logistics.block.diodes.AbstractDiodeGenerator;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterBlock;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterGenerator;
import com.simibubi.create.content.logistics.block.diodes.PoweredLatchBlock;
import com.simibubi.create.content.logistics.block.diodes.PoweredLatchGenerator;
import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterBlock;
import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterGenerator;
import com.simibubi.create.content.logistics.block.diodes.ToggleLatchBlock;
import com.simibubi.create.content.logistics.block.diodes.ToggleLatchGenerator;
import com.simibubi.create.content.logistics.block.funnel.AndesiteFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelGenerator;
import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelGenerator;
import com.simibubi.create.content.logistics.block.funnel.FunnelItem;
import com.simibubi.create.content.logistics.block.funnel.FunnelMovementBehaviour;
import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock;
import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem;
import com.simibubi.create.content.logistics.block.redstone.*;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock;
import com.simibubi.create.content.logistics.block.redstone.ContactMovementBehaviour;
import com.simibubi.create.content.logistics.block.redstone.ContentObserverBlock;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeGenerator;
import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock;
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock;
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkGenerator;
import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchBlock;
import com.simibubi.create.content.palettes.MetalBlock;
import com.simibubi.create.content.schematics.block.SchematicTableBlock;
import com.simibubi.create.content.schematics.block.SchematicannonBlock;
import com.simibubi.create.foundation.block.ItemUseOverrides;
import com.simibubi.create.foundation.config.StressConfigDefaults;
import com.simibubi.create.foundation.data.*;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.BlockStateGen;
import com.simibubi.create.foundation.data.BuilderTransformers;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.data.ModelGen;
import com.simibubi.create.foundation.data.SharedProperties;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.utility.DyeHelper;
import com.simibubi.create.foundation.worldgen.OxidizingBlock;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.block.SoundType;
@ -119,15 +186,6 @@ import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.common.Tags;
import net.minecraftforge.common.ToolType;
import static com.simibubi.create.AllMovementBehaviours.addMovementBehaviour;
import static com.simibubi.create.AllTags.tagBlockAndItem;
import static com.simibubi.create.content.AllSections.SCHEMATICS;
import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock;
import static com.simibubi.create.foundation.data.BlockStateGen.oxidizedBlockstate;
import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures;
import static com.simibubi.create.foundation.data.ModelGen.customItemModel;
import static com.simibubi.create.foundation.data.ModelGen.oxidizedItemModel;
public class AllBlocks {
private static final CreateRegistrate REGISTRATE = Create.registrate()
@ -422,6 +480,15 @@ public class AllBlocks {
.item()
.transform(customItemModel("_", "block"))
.register();
public static final BlockEntry<EjectorBlock> WEIGHTED_EJECTOR = REGISTRATE.block("weighted_ejector", EjectorBlock::new)
.initialProperties(SharedProperties::stone)
.properties(Block.Properties::nonOpaque)
.blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p), 180))
.transform(StressConfigDefaults.setImpact(2.0))
.item(EjectorItem::new)
.transform(customItemModel())
.register();
public static final BlockEntry<ChuteBlock> CHUTE = REGISTRATE.block("chute", ChuteBlock::new)
.initialProperties(SharedProperties::softMetal)

View file

@ -1,7 +1,18 @@
package com.simibubi.create;
import com.simibubi.create.content.contraptions.base.*;
import com.simibubi.create.content.contraptions.components.actors.*;
import com.simibubi.create.content.contraptions.base.BackHalfShaftInstance;
import com.simibubi.create.content.contraptions.base.HalfShaftInstance;
import com.simibubi.create.content.contraptions.base.HorizontalHalfShaftInstance;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
import com.simibubi.create.content.contraptions.components.actors.DrillInstance;
import com.simibubi.create.content.contraptions.components.actors.DrillRenderer;
import com.simibubi.create.content.contraptions.components.actors.DrillTileEntity;
import com.simibubi.create.content.contraptions.components.actors.HarvesterRenderer;
import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity;
import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceTileEntity;
import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity;
import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceRenderer;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockRenderer;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterInstance;
@ -60,8 +71,19 @@ import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheel
import com.simibubi.create.content.contraptions.fluids.PumpCogInstance;
import com.simibubi.create.content.contraptions.fluids.PumpRenderer;
import com.simibubi.create.content.contraptions.fluids.PumpTileEntity;
import com.simibubi.create.content.contraptions.fluids.actors.*;
import com.simibubi.create.content.contraptions.fluids.pipes.*;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity;
import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainRenderer;
import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveInstance;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveRenderer;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer;
import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity;
@ -77,7 +99,13 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltInstance;
import com.simibubi.create.content.contraptions.relays.belt.BeltRenderer;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.contraptions.relays.elementary.SimpleKineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.*;
import com.simibubi.create.content.contraptions.relays.encased.AdjustablePulleyTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ClutchTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftRenderer;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.content.contraptions.relays.encased.SplitShaftInstance;
import com.simibubi.create.content.contraptions.relays.encased.SplitShaftRenderer;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeInstance;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer;
import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity;
@ -96,6 +124,8 @@ import com.simibubi.create.content.logistics.block.chute.SmartChuteRenderer;
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.depot.EjectorRenderer;
import com.simibubi.create.content.logistics.block.depot.EjectorTileEntity;
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;
@ -108,7 +138,14 @@ import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTile
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInstance;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity;
import com.simibubi.create.content.logistics.block.redstone.*;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverInstance;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity;
import com.simibubi.create.content.logistics.block.redstone.ContentObserverTileEntity;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity;
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity;
import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity;
import com.simibubi.create.content.schematics.block.SchematicTableTileEntity;
import com.simibubi.create.content.schematics.block.SchematicannonInstance;
import com.simibubi.create.content.schematics.block.SchematicannonRenderer;
@ -578,6 +615,13 @@ public class AllTileEntities {
.renderer(() -> DepotRenderer::new)
.register();
public static final TileEntityEntry<EjectorTileEntity> WEIGHTED_EJECTOR = Create.registrate()
.tileEntity("weighted_ejector", EjectorTileEntity::new)
.instance(() -> ShaftInstance::new)
.validBlocks(AllBlocks.WEIGHTED_EJECTOR)
.renderer(() -> EjectorRenderer::new)
.register();
public static final TileEntityEntry<FunnelTileEntity> FUNNEL = Create.registrate()
.tileEntity("funnel", FunnelTileEntity::new)
.instance(() -> FunnelInstance::new)

View file

@ -8,7 +8,6 @@ import java.util.List;
import javax.annotation.Nullable;
import com.simibubi.create.Create;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.KineticNetwork;
import com.simibubi.create.content.contraptions.RotationPropagator;
import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel;
@ -40,7 +39,6 @@ import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
public abstract class KineticTileEntity extends SmartTileEntity
implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered {

View file

@ -24,7 +24,7 @@ public class BasinOperatorBlockItem extends BlockItem {
BlockState placedOnState = context.getWorld()
.getBlockState(placedOnPos);
if (AllBlocks.BASIN.has(placedOnState) || AllBlocks.BELT.has(placedOnState)
|| AllBlocks.DEPOT.has(placedOnState)) {
|| AllBlocks.DEPOT.has(placedOnState) || AllBlocks.WEIGHTED_EJECTOR.has(placedOnState)) {
if (context.getWorld()
.getBlockState(placedOnPos.up(2))
.getMaterial()

View file

@ -150,7 +150,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
if (stack.isEmpty())
continue;
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite());
.tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite(), false);
if (tryExportingToBeltFunnel != null) {
if (tryExportingToBeltFunnel.getCount() != stack.getCount()) {
inventory.setStackInSlot(slot, tryExportingToBeltFunnel);

View file

@ -128,7 +128,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
Direction side = heldItem.insertedFrom;
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(heldItem.stack, side.getOpposite());
.tryExportingToBeltFunnel(heldItem.stack, side.getOpposite(), false);
if (tryExportingToBeltFunnel != null) {
if (tryExportingToBeltFunnel.getCount() != heldItem.stack.getCount()) {
if (tryExportingToBeltFunnel.isEmpty())

View file

@ -132,7 +132,7 @@ public class BeltTunnelBlock extends Block implements ITE<BeltTunnelTileEntity>,
public void updateTunnel(IWorld world, BlockPos pos) {
BlockState tunnel = world.getBlockState(pos);
BlockState newTunnel = getTunnelState(world, pos);
if (tunnel != newTunnel) {
if (tunnel != newTunnel && !world.isRemote()) {
world.setBlockState(pos, newTunnel, 3);
TileEntity te = world.getTileEntity(pos);
if (te != null && (te instanceof BeltTunnelTileEntity))

View file

@ -1,19 +1,24 @@
package com.simibubi.create.content.logistics.block.belts.tunnel;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticRenderMaterials;
import com.simibubi.create.content.logistics.block.FlapData;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.util.Direction;
import net.minecraft.world.LightType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.Map;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticRenderMaterials;
import com.simibubi.create.content.logistics.block.FlapData;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
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;
import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.util.Direction;
import net.minecraft.world.LightType;
public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity> implements IDynamicInstance {
private final Map<Direction, ArrayList<InstanceKey<FlapData>>> tunnelFlaps;
@ -62,6 +67,11 @@ public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity>
tunnelFlaps.put(direction, flaps);
});
}
@Override
public boolean shouldReset() {
return super.shouldReset() || tunnelFlaps.size() != tile.flaps.size();
}
@Override
public void beginFrame() {

View file

@ -101,9 +101,9 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe
// Backwards compat
if (!compound.contains("Sides") && compound.contains("Flaps"))
sides.addAll(flaps.keySet());
super.read(compound, clientPacket);
if (clientPacket)
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this));
}

View file

@ -22,6 +22,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.SidedFilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper;
@ -55,11 +56,13 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
ItemStack stackToDistribute;
float distributionProgress;
List<Pair<BlockPos, Direction>> distributionTargets;
int distributionDistanceLeft;
int distributionDistanceRight;
int previousOutputIndex;
// <filtered, non-filtered>
Couple<List<Pair<BlockPos, Direction>>> distributionTargets;
private boolean syncedOutputActive;
private Set<BrassTunnelTileEntity> syncSet;
@ -69,7 +72,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
public BrassTunnelTileEntity(TileEntityType<? extends BeltTunnelTileEntity> type) {
super(type);
distributionTargets = new ArrayList<>();
distributionTargets = Couple.create(ArrayList::new);
syncSet = new HashSet<>();
stackToDistribute = ItemStack.EMPTY;
beltCapability = LazyOptional.empty();
@ -113,7 +116,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
return;
if (distributionProgress == -1) {
distributionTargets.clear();
distributionTargets.forEach(List::clear);
distributionDistanceLeft = 0;
distributionDistanceRight = 0;
@ -137,27 +140,24 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
if (stackToDistribute.isEmpty())
return;
for (boolean filterPass : Iterate.trueAndFalse) {
for (Pair<BrassTunnelTileEntity, Direction> pair : validOutputs) {
BrassTunnelTileEntity tunnel = pair.getKey();
Direction output = pair.getValue();
if (filterPass && tunnel.flapFilterEmpty(output))
continue;
if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null)
continue;
distributionTargets.add(Pair.of(tunnel.pos, output));
int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ();
if (distance < 0)
distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance);
else
distributionDistanceRight = Math.max(distributionDistanceRight, distance);
}
if (!distributionTargets.isEmpty() && filterPass)
break;
for (Pair<BrassTunnelTileEntity, Direction> pair : validOutputs) {
BrassTunnelTileEntity tunnel = pair.getKey();
Direction output = pair.getValue();
if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null)
continue;
distributionTargets.get(!tunnel.flapFilterEmpty(output))
.add(Pair.of(tunnel.pos, output));
int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ();
if (distance < 0)
distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance);
else
distributionDistanceRight = Math.max(distributionDistanceRight, distance);
}
if (distributionTargets.isEmpty())
if (distributionTargets.getFirst()
.isEmpty()
&& distributionTargets.getSecond()
.isEmpty())
return;
if (selectionMode.get() != SelectionMode.SYNCHRONIZE || syncedOutputActive) {
@ -167,9 +167,14 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
return;
}
if (distributionProgress == 0) {
if (distributionProgress != 0)
return;
distributionTargets.forEach(list -> {
if (stackToDistribute.isEmpty())
return;
List<Pair<BrassTunnelTileEntity, Direction>> validTargets = new ArrayList<>();
for (Pair<BlockPos, Direction> pair : distributionTargets) {
for (Pair<BlockPos, Direction> pair : list) {
BlockPos tunnelPos = pair.getKey();
Direction output = pair.getValue();
TileEntity te = world.getTileEntity(tunnelPos);
@ -177,18 +182,15 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
continue;
validTargets.add(Pair.of((BrassTunnelTileEntity) te, output));
}
distribute(validTargets);
distributionProgress = -1;
return;
}
});
}
private static Random rand = new Random();
private void distribute(List<Pair<BrassTunnelTileEntity, Direction>> validTargets) {
final int amountTargets = validTargets.size();
int amountTargets = validTargets.size();
if (amountTargets == 0)
return;
@ -204,18 +206,23 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
ItemStack toDistribute = null;
int leftovers = 0;
int remainingOutputs = amountTargets;
for (boolean simulate : Iterate.trueAndFalse) {
if (remainingOutputs == 0)
return;
leftovers = 0;
int index = indexStart;
int stackSize = stackToDistribute.getCount();
int splitStackSize = stackSize / amountTargets;
int splitRemainder = stackSize % amountTargets;
int splitStackSize = stackSize / remainingOutputs;
int splitRemainder = stackSize % remainingOutputs;
int visited = 0;
toDistribute = stackToDistribute.copy();
if (!force && simulate)
if (!(force || split) && simulate)
continue;
while (visited < amountTargets) {
Pair<BrassTunnelTileEntity, Direction> pair = validTargets.get(index);
BrassTunnelTileEntity tunnel = pair.getKey();
@ -230,6 +237,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
if (remainder == null || remainder.getCount() == count) {
if (force)
return;
if (split && simulate)
remainingOutputs--;
continue;
}
@ -457,19 +466,22 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
compound.putBoolean("SyncedOutput", syncedOutputActive);
compound.putBoolean("ConnectedLeft", connectedLeft);
compound.putBoolean("ConnectedRight", connectedRight);
compound.put("StackToDistribute", stackToDistribute.serializeNBT());
compound.putFloat("DistributionProgress", distributionProgress);
compound.putInt("PreviousIndex", previousOutputIndex);
compound.putInt("DistanceLeft", distributionDistanceLeft);
compound.putInt("DistanceRight", distributionDistanceRight);
compound.put("Targets", NBTHelper.writeCompoundList(distributionTargets, pair -> {
CompoundNBT nbt = new CompoundNBT();
nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey()));
nbt.putInt("Face", pair.getValue()
.getIndex());
return nbt;
}));
for (boolean filtered : Iterate.trueAndFalse) {
compound.put(filtered ? "FilteredTargets" : "Targets",
NBTHelper.writeCompoundList(distributionTargets.get(filtered), pair -> {
CompoundNBT nbt = new CompoundNBT();
nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey()));
nbt.putInt("Face", pair.getValue()
.getIndex());
return nbt;
}));
}
super.write(compound, clientPacket);
}
@ -487,11 +499,15 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
previousOutputIndex = compound.getInt("PreviousIndex");
distributionDistanceLeft = compound.getInt("DistanceLeft");
distributionDistanceRight = compound.getInt("DistanceRight");
distributionTargets = NBTHelper.readCompoundList(compound.getList("Targets", NBT.TAG_COMPOUND), nbt -> {
BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos"));
Direction face = Direction.byIndex(nbt.getInt("Face"));
return Pair.of(pos, face);
});
for (boolean filtered : Iterate.trueAndFalse) {
distributionTargets.set(filtered, NBTHelper
.readCompoundList(compound.getList(filtered ? "FilteredTargets" : "Targets", NBT.TAG_COMPOUND), nbt -> {
BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos"));
Direction face = Direction.byIndex(nbt.getInt("Face"));
return Pair.of(pos, face);
}));
}
super.read(compound, clientPacket);

View file

@ -0,0 +1,379 @@
package com.simibubi.create.content.logistics.block.depot;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.logistics.block.funnel.AbstractFunnelBlock;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
public class DepotBehaviour extends TileEntityBehaviour {
public static BehaviourType<DepotBehaviour> TYPE = new BehaviourType<>();
TransportedItemStack heldItem;
List<TransportedItemStack> incoming;
ItemStackHandler processingOutputBuffer;
DepotItemHandler itemHandler;
LazyOptional<DepotItemHandler> lazyItemHandler;
TransportedItemStackHandlerBehaviour transportedHandler;
Supplier<Integer> maxStackSize;
Supplier<Boolean> canAcceptItems;
Predicate<Direction> canFunnelsPullFrom;
boolean allowMerge;
public DepotBehaviour(SmartTileEntity te) {
super(te);
maxStackSize = () -> 64;
canAcceptItems = () -> true;
canFunnelsPullFrom = $ -> true;
incoming = new ArrayList<>();
itemHandler = new DepotItemHandler(this);
lazyItemHandler = LazyOptional.of(() -> itemHandler);
processingOutputBuffer = new ItemStackHandler(8) {
protected void onContentsChanged(int slot) {
te.notifyUpdate();
};
};
}
public void enableMerging() {
allowMerge = true;
}
@Override
public void tick() {
super.tick();
World world = tileEntity.getWorld();
for (Iterator<TransportedItemStack> iterator = incoming.iterator(); iterator.hasNext();) {
TransportedItemStack ts = iterator.next();
if (!tick(ts))
continue;
if (world.isRemote)
continue;
if (heldItem == null) {
heldItem = ts;
} else {
if (!ItemHandlerHelper.canItemStacksStack(heldItem.stack, ts.stack)) {
Vec3d vec = VecHelper.getCenterOf(tileEntity.getPos());
InventoryHelper.spawnItemStack(tileEntity.getWorld(), vec.x, vec.y + .5f, vec.z, ts.stack);
} else {
heldItem.stack.grow(ts.stack.getCount());
}
}
iterator.remove();
tileEntity.notifyUpdate();
}
if (heldItem == null)
return;
if (!tick(heldItem))
return;
BlockPos pos = tileEntity.getPos();
if (world.isRemote)
return;
if (handleBeltFunnelOutput())
return;
BeltProcessingBehaviour processingBehaviour =
TileEntityBehaviour.get(world, pos.up(2), BeltProcessingBehaviour.TYPE);
if (processingBehaviour == null)
return;
if (!heldItem.locked && BeltProcessingBehaviour.isBlocked(world, pos))
return;
ItemStack previousItem = heldItem.stack;
boolean wasLocked = heldItem.locked;
ProcessingResult result = wasLocked ? processingBehaviour.handleHeldItem(heldItem, transportedHandler)
: processingBehaviour.handleReceivedItem(heldItem, transportedHandler);
if (result == ProcessingResult.REMOVE) {
heldItem = null;
tileEntity.sendData();
return;
}
heldItem.locked = result == ProcessingResult.HOLD;
if (heldItem.locked != wasLocked || !previousItem.equals(heldItem.stack, false))
tileEntity.sendData();
}
protected boolean tick(TransportedItemStack heldItem) {
heldItem.prevBeltPosition = heldItem.beltPosition;
heldItem.prevSideOffset = heldItem.sideOffset;
float diff = .5f - heldItem.beltPosition;
if (diff > 1 / 512f) {
if (diff > 1 / 32f && !BeltHelper.isItemUpright(heldItem.stack))
heldItem.angle += 1;
heldItem.beltPosition += diff / 4f;
}
return diff < 1 / 16f;
}
private boolean handleBeltFunnelOutput() {
BlockState funnel = getWorld().getBlockState(getPos().up());
Direction funnelFacing = AbstractFunnelBlock.getFunnelFacing(funnel);
if (funnelFacing == null || !canFunnelsPullFrom.test(funnelFacing.getOpposite()))
return false;
for (int slot = 0; slot < processingOutputBuffer.getSlots(); slot++) {
ItemStack previousItem = processingOutputBuffer.getStackInSlot(slot);
if (previousItem.isEmpty())
continue;
ItemStack afterInsert = tileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(previousItem, null, false);
if (afterInsert == null)
return false;
if (previousItem.getCount() != afterInsert.getCount()) {
processingOutputBuffer.setStackInSlot(slot, afterInsert);
tileEntity.notifyUpdate();
return true;
}
}
ItemStack previousItem = heldItem.stack;
ItemStack afterInsert = tileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(previousItem, null, false);
if (afterInsert == null)
return false;
if (previousItem.getCount() != afterInsert.getCount()) {
if (afterInsert.isEmpty())
heldItem = null;
else
heldItem.stack = afterInsert;
tileEntity.notifyUpdate();
return true;
}
return false;
}
@Override
public void remove() {
if (lazyItemHandler != null)
lazyItemHandler.invalidate();
}
@Override
public void write(CompoundNBT compound, boolean clientPacket) {
if (heldItem != null)
compound.put("HeldItem", heldItem.serializeNBT());
compound.put("OutputBuffer", processingOutputBuffer.serializeNBT());
if (canMergeItems() && !incoming.isEmpty())
compound.put("Incoming", NBTHelper.writeCompoundList(incoming, TransportedItemStack::serializeNBT));
}
@Override
public void read(CompoundNBT compound, boolean clientPacket) {
heldItem = null;
if (compound.contains("HeldItem"))
heldItem = TransportedItemStack.read(compound.getCompound("HeldItem"));
processingOutputBuffer.deserializeNBT(compound.getCompound("OutputBuffer"));
if (canMergeItems()) {
ListNBT list = compound.getList("Incoming", NBT.TAG_COMPOUND);
incoming = NBTHelper.readCompoundList(list, TransportedItemStack::read);
}
}
public void addSubBehaviours(List<TileEntityBehaviour> behaviours) {
behaviours.add(new DirectBeltInputBehaviour(tileEntity).allowingBeltFunnels()
.setInsertionHandler(this::tryInsertingFromSide));
transportedHandler = new TransportedItemStackHandlerBehaviour(tileEntity, this::applyToAllItems)
.withStackPlacement(this::getWorldPositionOf);
behaviours.add(transportedHandler);
}
public ItemStack getHeldItemStack() {
return heldItem == null ? ItemStack.EMPTY : heldItem.stack;
}
public boolean canMergeItems() {
return allowMerge;
}
public int getPresentStackSize() {
int cumulativeStackSize = 0;
cumulativeStackSize += getHeldItemStack().getCount();
for (int slot = 0; slot < processingOutputBuffer.getSlots(); slot++)
cumulativeStackSize += processingOutputBuffer.getStackInSlot(slot)
.getCount();
return cumulativeStackSize;
}
public int getRemainingSpace() {
int cumulativeStackSize = getPresentStackSize();
for (TransportedItemStack transportedItemStack : incoming)
cumulativeStackSize += transportedItemStack.stack.getCount();
int fromGetter = maxStackSize.get();
return (fromGetter == 0 ? 64 : fromGetter) - cumulativeStackSize;
}
public ItemStack insert(TransportedItemStack heldItem, boolean simulate) {
if (!canAcceptItems.get())
return heldItem.stack;
if (canMergeItems()) {
int remainingSpace = getRemainingSpace();
ItemStack inserted = heldItem.stack;
if (remainingSpace <= 0)
return inserted;
if (this.heldItem != null && !ItemHandlerHelper.canItemStacksStack(this.heldItem.stack, inserted))
return inserted;
ItemStack returned = ItemStack.EMPTY;
if (remainingSpace < inserted.getCount()) {
returned = ItemHandlerHelper.copyStackWithSize(heldItem.stack, inserted.getCount() - remainingSpace);
if (!simulate) {
TransportedItemStack copy = heldItem.copy();
copy.stack.setCount(remainingSpace);
if (this.heldItem != null)
incoming.add(copy);
else
this.heldItem = copy;
}
} else {
if (!simulate) {
if (this.heldItem != null)
incoming.add(heldItem);
else
this.heldItem = heldItem;
}
}
return returned;
}
if (!simulate)
this.heldItem = heldItem;
return ItemStack.EMPTY;
}
public void setHeldItem(TransportedItemStack heldItem) {
this.heldItem = heldItem;
}
public void removeHeldItem() {
this.heldItem = null;
}
public void setCenteredHeldItem(TransportedItemStack heldItem) {
this.heldItem = heldItem;
this.heldItem.beltPosition = 0.5f;
this.heldItem.prevBeltPosition = 0.5f;
}
public <T> LazyOptional<T> getItemCapability(Capability<T> cap, Direction side) {
return lazyItemHandler.cast();
}
private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) {
ItemStack inserted = transportedStack.stack;
if (!getHeldItemStack().isEmpty() && !canMergeItems())
return inserted;
if (!isOutputEmpty() && !canMergeItems())
return inserted;
if (!canAcceptItems.get())
return inserted;
int size = transportedStack.stack.getCount();
transportedStack = transportedStack.copy();
transportedStack.beltPosition = side.getAxis()
.isVertical() ? .5f : 0;
transportedStack.insertedFrom = side;
transportedStack.prevSideOffset = transportedStack.sideOffset;
transportedStack.prevBeltPosition = transportedStack.beltPosition;
ItemStack remainder = insert(transportedStack, simulate);
if (remainder.getCount() != size)
tileEntity.notifyUpdate();
return remainder;
}
private void applyToAllItems(float maxDistanceFromCentre,
Function<TransportedItemStack, TransportedResult> processFunction) {
if (heldItem == null)
return;
if (.5f - heldItem.beltPosition > maxDistanceFromCentre)
return;
boolean dirty = false;
TransportedItemStack transportedItemStack = heldItem;
ItemStack stackBefore = transportedItemStack.stack.copy();
TransportedResult result = processFunction.apply(transportedItemStack);
if (result == null || result.didntChangeFrom(stackBefore))
return;
dirty = true;
heldItem = null;
if (result.hasHeldOutput())
setCenteredHeldItem(result.getHeldOutput());
for (TransportedItemStack added : result.getOutputs()) {
if (getHeldItemStack().isEmpty()) {
setCenteredHeldItem(added);
continue;
}
ItemStack remainder = ItemHandlerHelper.insertItemStacked(processingOutputBuffer, added.stack, false);
Vec3d vec = VecHelper.getCenterOf(tileEntity.getPos());
InventoryHelper.spawnItemStack(tileEntity.getWorld(), vec.x, vec.y + .5f, vec.z, remainder);
}
if (dirty)
tileEntity.notifyUpdate();
}
public boolean isEmpty() {
return heldItem == null && isOutputEmpty();
}
public boolean isOutputEmpty() {
for (int i = 0; i < processingOutputBuffer.getSlots(); i++)
if (!processingOutputBuffer.getStackInSlot(i)
.isEmpty())
return false;
return true;
}
private Vec3d getWorldPositionOf(TransportedItemStack transported) {
Vec3d offsetVec = new Vec3d(.5f, 14 / 16f, .5f);
return offsetVec.add(new Vec3d(tileEntity.getPos()));
}
@Override
public BehaviourType<?> getType() {
return TYPE;
}
}

View file

@ -2,27 +2,18 @@ package com.simibubi.create.content.logistics.block.depot;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
@ -30,8 +21,6 @@ import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler;
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@ -65,74 +54,18 @@ public class DepotBlock extends Block implements ITE<DepotTileEntity>, IWrenchab
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) {
if (ray.getFace() != Direction.UP)
return ActionResultType.PASS;
if (world.isRemote)
return ActionResultType.SUCCESS;
withTileEntityDo(world, pos, te -> {
ItemStack heldItem = player.getHeldItem(hand);
boolean wasEmptyHanded = heldItem.isEmpty();
boolean shouldntPlaceItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem);
ItemStack mainItemStack = te.getHeldItemStack();
if (!mainItemStack.isEmpty()) {
player.inventory.placeItemBackInInventory(world, mainItemStack);
te.setHeldItem(null);
}
ItemStackHandler outputs = te.processingOutputBuffer;
for (int i = 0; i < outputs.getSlots(); i++)
player.inventory.placeItemBackInInventory(world, outputs.extractItem(i, 64, false));
if (!wasEmptyHanded && !shouldntPlaceItem) {
TransportedItemStack transported = new TransportedItemStack(heldItem);
transported.insertedFrom = player.getHorizontalFacing();
transported.prevBeltPosition = .25f;
transported.beltPosition = .25f;
te.setHeldItem(transported);
player.setHeldItem(hand, ItemStack.EMPTY);
}
te.markDirty();
te.sendData();
});
return ActionResultType.SUCCESS;
return SharedDepotBlockMethods.onUse(state, world, pos, player, hand, ray);
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
return;
withTileEntityDo(worldIn, pos, te -> {
ItemHelper.dropContents(worldIn, pos, te.processingOutputBuffer);
if (!te.getHeldItemStack()
.isEmpty())
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), te.getHeldItemStack());
});
worldIn.removeTileEntity(pos);
SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving);
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
if (!AllBlocks.DEPOT.has(worldIn.getBlockState(entityIn.getPosition())))
return;
if (!(entityIn instanceof ItemEntity))
return;
if (!entityIn.isAlive())
return;
if (entityIn.world.isRemote)
return;
ItemEntity itemEntity = (ItemEntity) entityIn;
DirectBeltInputBehaviour inputBehaviour =
TileEntityBehaviour.get(worldIn, entityIn.getPosition(), DirectBeltInputBehaviour.TYPE);
if (inputBehaviour == null)
return;
ItemStack remainder = inputBehaviour.handleInsertion(itemEntity.getItem(), Direction.DOWN, false);
itemEntity.setItem(remainder);
if (remainder.isEmpty())
itemEntity.remove();
SharedDepotBlockMethods.onLanded(worldIn, entityIn);
}
@Override
@ -142,11 +75,7 @@ public class DepotBlock extends Block implements ITE<DepotTileEntity>, IWrenchab
@Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
try {
return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).itemHandler);
} catch (TileEntityException ignored) {
}
return 0;
return SharedDepotBlockMethods.getComparatorInputOverride(blockState, worldIn, pos);
}
}

View file

@ -8,9 +8,9 @@ import net.minecraftforge.items.IItemHandler;
public class DepotItemHandler implements IItemHandler {
private static final int MAIN_SLOT = 0;
private DepotTileEntity te;
private DepotBehaviour te;
public DepotItemHandler(DepotTileEntity te) {
public DepotItemHandler(DepotBehaviour te) {
this.te = te;
}
@ -29,16 +29,15 @@ public class DepotItemHandler implements IItemHandler {
if (slot != MAIN_SLOT)
return stack;
if (!te.getHeldItemStack()
.isEmpty())
.isEmpty() && !te.canMergeItems())
return stack;
if (!te.isOutputEmpty())
if (!te.isOutputEmpty() && !te.canMergeItems())
return stack;
if (!simulate) {
te.setHeldItem(new TransportedItemStack(stack));
te.markDirty();
te.sendData();
}
return ItemStack.EMPTY;
ItemStack remainder = te.insert(new TransportedItemStack(stack), simulate);
if (!simulate && remainder != stack)
te.tileEntity.notifyUpdate();
return remainder;
}
@Override
@ -55,15 +54,14 @@ public class DepotItemHandler implements IItemHandler {
te.heldItem.stack = stack;
if (stack.isEmpty())
te.heldItem = null;
te.markDirty();
te.sendData();
te.tileEntity.notifyUpdate();
}
return extracted;
}
@Override
public int getSlotLimit(int slot) {
return 64;
return slot == MAIN_SLOT ? te.maxStackSize.get() : 64;
}
@Override

View file

@ -5,6 +5,7 @@ import java.util.Random;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.VecHelper;
@ -30,43 +31,54 @@ public class DepotRenderer extends SafeTileEntityRenderer<DepotTileEntity> {
@Override
protected void renderSafe(DepotTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
renderItemsOf(te, partialTicks, ms, buffer, light, overlay, te.depotBehaviour);
}
TransportedItemStack transported = te.heldItem;
public static void renderItemsOf(SmartTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay, DepotBehaviour depotBehaviour) {
TransportedItemStack transported = depotBehaviour.heldItem;
MatrixStacker msr = MatrixStacker.of(ms);
Vec3d itemPosition = VecHelper.getCenterOf(te.getPos());
ms.push();
ms.translate(.5f, 15 / 16f, .5f);
// Render main item
if (transported != null) {
if (transported != null)
depotBehaviour.incoming.add(transported);
// Render main items
for (TransportedItemStack tis : depotBehaviour.incoming) {
ms.push();
msr.nudge(0);
float offset = MathHelper.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition);
float sideOffset = MathHelper.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset);
float offset = MathHelper.lerp(partialTicks, tis.prevBeltPosition, tis.beltPosition);
float sideOffset = MathHelper.lerp(partialTicks, tis.prevSideOffset, tis.sideOffset);
if (transported.insertedFrom.getAxis()
if (tis.insertedFrom.getAxis()
.isHorizontal()) {
Vec3d offsetVec = new Vec3d(transported.insertedFrom.getOpposite()
Vec3d offsetVec = new Vec3d(tis.insertedFrom.getOpposite()
.getDirectionVec()).scale(.5f - offset);
ms.translate(offsetVec.x, offsetVec.y, offsetVec.z);
boolean alongX = transported.insertedFrom.rotateY()
boolean alongX = tis.insertedFrom.rotateY()
.getAxis() == Axis.X;
if (!alongX)
sideOffset *= -1;
ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset);
}
ItemStack itemStack = transported.stack;
int angle = transported.angle;
ItemStack itemStack = tis.stack;
int angle = tis.angle;
Random r = new Random(0);
renderItem(ms, buffer, light, overlay, itemStack, angle, r, itemPosition);
ms.pop();
}
if (transported != null)
depotBehaviour.incoming.remove(transported);
// Render output items
for (int i = 0; i < te.processingOutputBuffer.getSlots(); i++) {
ItemStack stack = te.processingOutputBuffer.getStackInSlot(i);
for (int i = 0; i < depotBehaviour.processingOutputBuffer.getSlots(); i++) {
ItemStack stack = depotBehaviour.processingOutputBuffer.getStackInSlot(i);
if (stack.isEmpty())
continue;
ms.push();

View file

@ -1,253 +1,35 @@
package com.simibubi.create.content.logistics.block.depot;
import java.util.List;
import java.util.function.Function;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
public class DepotTileEntity extends SmartTileEntity {
TransportedItemStack heldItem;
ItemStackHandler processingOutputBuffer;
DepotItemHandler itemHandler;
LazyOptional<DepotItemHandler> lazyItemHandler;
private TransportedItemStackHandlerBehaviour transportedHandler;
DepotBehaviour depotBehaviour;
public DepotTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
itemHandler = new DepotItemHandler(this);
lazyItemHandler = LazyOptional.of(() -> itemHandler);
processingOutputBuffer = new ItemStackHandler(8) {
protected void onContentsChanged(int slot) {
markDirty();
sendData();
};
};
}
@Override
public void tick() {
super.tick();
if (heldItem == null)
return;
heldItem.prevBeltPosition = heldItem.beltPosition;
heldItem.prevSideOffset = heldItem.sideOffset;
float diff = .5f - heldItem.beltPosition;
if (diff > 1 / 512f) {
if (diff > 1 / 32f && !BeltHelper.isItemUpright(heldItem.stack))
heldItem.angle += 1;
heldItem.beltPosition += diff / 4f;
}
if (diff > 1 / 16f)
return;
if (world.isRemote)
return;
if (handleBeltFunnelOutput())
return;
BeltProcessingBehaviour processingBehaviour =
TileEntityBehaviour.get(world, pos.up(2), BeltProcessingBehaviour.TYPE);
if (processingBehaviour == null)
return;
if (!heldItem.locked && BeltProcessingBehaviour.isBlocked(world, pos))
return;
ItemStack previousItem = heldItem.stack;
boolean wasLocked = heldItem.locked;
ProcessingResult result = wasLocked ? processingBehaviour.handleHeldItem(heldItem, transportedHandler)
: processingBehaviour.handleReceivedItem(heldItem, transportedHandler);
if (result == ProcessingResult.REMOVE) {
heldItem = null;
sendData();
return;
}
heldItem.locked = result == ProcessingResult.HOLD;
if (heldItem.locked != wasLocked || !previousItem.equals(heldItem.stack, false))
sendData();
}
private boolean handleBeltFunnelOutput() {
for (int slot = 0; slot < processingOutputBuffer.getSlots(); slot++) {
ItemStack previousItem = processingOutputBuffer.getStackInSlot(slot);
if (previousItem.isEmpty())
continue;
ItemStack afterInsert =
getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null);
if (afterInsert == null)
return false;
if (previousItem.getCount() != afterInsert.getCount()) {
processingOutputBuffer.setStackInSlot(slot, afterInsert);
notifyUpdate();
return true;
}
}
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;
else
heldItem.stack = afterInsert;
notifyUpdate();
return true;
}
return false;
}
@Override
public void remove() {
super.remove();
if (lazyItemHandler != null)
lazyItemHandler.invalidate();
}
@Override
public void write(CompoundNBT compound, boolean clientPacket) {
if (heldItem != null)
compound.put("HeldItem", heldItem.serializeNBT());
compound.put("OutputBuffer", processingOutputBuffer.serializeNBT());
super.write(compound, clientPacket);
}
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
heldItem = null;
if (compound.contains("HeldItem"))
heldItem = TransportedItemStack.read(compound.getCompound("HeldItem"));
processingOutputBuffer.deserializeNBT(compound.getCompound("OutputBuffer"));
super.read(compound, clientPacket);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
behaviours.add(new DirectBeltInputBehaviour(this).allowingBeltFunnels()
.setInsertionHandler(this::tryInsertingFromSide));
transportedHandler = new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems)
.withStackPlacement(this::getWorldPositionOf);
behaviours.add(transportedHandler);
}
public ItemStack getHeldItemStack() {
return heldItem == null ? ItemStack.EMPTY : heldItem.stack;
}
public void setHeldItem(TransportedItemStack heldItem) {
this.heldItem = heldItem;
}
public void setCenteredHeldItem(TransportedItemStack heldItem) {
this.heldItem = heldItem;
this.heldItem.beltPosition = 0.5f;
this.heldItem.prevBeltPosition = 0.5f;
behaviours.add(depotBehaviour = new DepotBehaviour(this));
depotBehaviour.addSubBehaviours(behaviours);
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return lazyItemHandler.cast();
return depotBehaviour.getItemCapability(cap, side);
return super.getCapability(cap, side);
}
private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) {
ItemStack inserted = transportedStack.stack;
ItemStack empty = ItemStack.EMPTY;
if (!getHeldItemStack().isEmpty())
return inserted;
if (!isOutputEmpty())
return inserted;
if (simulate)
return empty;
transportedStack = transportedStack.copy();
transportedStack.beltPosition = side.getAxis()
.isVertical() ? .5f : 0;
transportedStack.insertedFrom = side;
transportedStack.prevSideOffset = transportedStack.sideOffset;
transportedStack.prevBeltPosition = transportedStack.beltPosition;
setHeldItem(transportedStack);
markDirty();
sendData();
return empty;
}
private void applyToAllItems(float maxDistanceFromCentre,
Function<TransportedItemStack, TransportedResult> processFunction) {
if (heldItem == null)
return;
if (.5f - heldItem.beltPosition > maxDistanceFromCentre)
return;
boolean dirty = false;
TransportedItemStack transportedItemStack = heldItem;
ItemStack stackBefore = transportedItemStack.stack.copy();
TransportedResult result = processFunction.apply(transportedItemStack);
if (result == null || result.didntChangeFrom(stackBefore))
return;
dirty = true;
heldItem = null;
if (result.hasHeldOutput())
setCenteredHeldItem(result.getHeldOutput());
for (TransportedItemStack added : result.getOutputs()) {
if (getHeldItemStack().isEmpty()) {
setCenteredHeldItem(added);
continue;
}
ItemStack remainder = ItemHandlerHelper.insertItemStacked(processingOutputBuffer, added.stack, false);
Vec3d vec = VecHelper.getCenterOf(pos);
InventoryHelper.spawnItemStack(world, vec.x, vec.y + .5f, vec.z, remainder);
}
if (dirty) {
markDirty();
sendData();
}
}
public boolean isOutputEmpty() {
for (int i = 0; i < processingOutputBuffer.getSlots(); i++)
if (!processingOutputBuffer.getStackInSlot(i)
.isEmpty())
return false;
return true;
}
private Vec3d getWorldPositionOf(TransportedItemStack transported) {
Vec3d offsetVec = new Vec3d(.5f, 14 / 16f, .5f);
return offsetVec.add(new Vec3d(pos));
}
}

View file

@ -0,0 +1,152 @@
package com.simibubi.create.content.logistics.block.depot;
import java.util.Optional;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock;
import com.simibubi.create.content.logistics.block.depot.EjectorTileEntity.State;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public class EjectorBlock extends HorizontalKineticBlock implements ITE<EjectorTileEntity> {
public EjectorBlock(Properties properties) {
super(properties);
}
@Override
public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
return AllShapes.DEPOT;
}
@Override
public float getSlipperiness(BlockState state, IWorldReader world, BlockPos pos, Entity entity) {
return getTileEntityOptional(world, pos).filter(ete -> ete.state == State.LAUNCHING)
.map($ -> 1f)
.orElse(super.getSlipperiness(state, world, pos, entity));
}
@Override
public void onFallenUpon(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) {
Optional<EjectorTileEntity> tileEntityOptional = getTileEntityOptional(p_180658_1_, p_180658_2_);
if (tileEntityOptional.isPresent()) {
p_180658_3_.handleFallDamage(p_180658_4_, 0.0F);
return;
}
super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_);
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
BlockPos position = entityIn.getPosition();
if (!AllBlocks.WEIGHTED_EJECTOR.has(worldIn.getBlockState(position)))
return;
if (!entityIn.isAlive())
return;
if (entityIn instanceof ItemEntity) {
SharedDepotBlockMethods.onLanded(worldIn, entityIn);
return;
}
Optional<EjectorTileEntity> teProvider = getTileEntityOptional(worldIn, position);
if (!teProvider.isPresent())
return;
EjectorTileEntity ejectorTileEntity = teProvider.get();
if (ejectorTileEntity.getState() == State.RETRACTING)
return;
if (ejectorTileEntity.launcher.getHorizontalDistance() == 0)
return;
if (entityIn.onGround) {
entityIn.onGround = false;
Vec3d center = VecHelper.getCenterOf(position)
.add(0, 7 / 16f, 0);
Vec3d positionVec = entityIn.getPositionVec();
double diff = center.distanceTo(positionVec);
entityIn.setMotion(0, -0.125, 0);
Vec3d vec = center.add(positionVec)
.scale(.5f);
if (diff > 4 / 16f) {
entityIn.setPosition(vec.x, vec.y, vec.z);
return;
}
}
ejectorTileEntity.launchAll();
ejectorTileEntity.notifyUpdate();
if (entityIn.world.isRemote)
AllPackets.channel.sendToServer(new EjectorTriggerPacket(ejectorTileEntity.getPos()));
}
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) {
if (AllItems.WRENCH.isIn(player.getHeldItem(hand)))
return ActionResultType.PASS;
return SharedDepotBlockMethods.onUse(state, world, pos, player, hand, ray);
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
withTileEntityDo(worldIn, pos, EjectorTileEntity::dropFlyingItems);
SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving);
}
@Override
public Axis getRotationAxis(BlockState state) {
return state.get(HORIZONTAL_FACING)
.rotateY()
.getAxis();
}
@Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return getRotationAxis(state) == face.getAxis();
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.WEIGHTED_EJECTOR.create();
}
@Override
public Class<EjectorTileEntity> getTileEntityClass() {
return EjectorTileEntity.class;
}
@Override
public boolean hasComparatorInputOverride(BlockState state) {
return true;
}
@Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
return SharedDepotBlockMethods.getComparatorInputOverride(blockState, worldIn, pos);
}
}

View file

@ -0,0 +1,51 @@
package com.simibubi.create.content.logistics.block.depot;
import java.util.function.Supplier;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public class EjectorElytraPacket extends SimplePacketBase {
private BlockPos pos;
public EjectorElytraPacket(BlockPos pos) {
this.pos = pos;
}
public EjectorElytraPacket(PacketBuffer buffer) {
pos = buffer.readBlockPos();
}
@Override
public void write(PacketBuffer buffer) {
buffer.writeBlockPos(pos);
}
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity player = context.get()
.getSender();
if (player == null)
return;
World world = player.world;
if (world == null || !world.isBlockPresent(pos))
return;
TileEntity tileEntity = world.getTileEntity(pos);
if (tileEntity instanceof EjectorTileEntity)
((EjectorTileEntity) tileEntity).deployElytra(player);
});
context.get()
.setPacketHandled(true);
}
}

View file

@ -0,0 +1,52 @@
package com.simibubi.create.content.logistics.block.depot;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber
public class EjectorItem extends BlockItem {
public EjectorItem(Block p_i48527_1_, Properties p_i48527_2_) {
super(p_i48527_1_, p_i48527_2_);
}
@Override
public ActionResultType onItemUse(ItemUseContext ctx) {
PlayerEntity player = ctx.getPlayer();
if (player != null && player.isSneaking())
return ActionResultType.SUCCESS;
return super.onItemUse(ctx);
}
@Override
protected BlockState getStateForPlacement(BlockItemUseContext p_195945_1_) {
BlockState stateForPlacement = super.getStateForPlacement(p_195945_1_);
return stateForPlacement;
}
@Override
protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_,
BlockState p_195943_5_) {
if (world.isRemote)
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> EjectorTargetHandler.flushSettings(pos));
return super.onBlockPlaced(pos, world, p_195943_3_, p_195943_4_, p_195943_5_);
}
@Override
public boolean canPlayerBreakBlockWhileHolding(BlockState state, World world, BlockPos pos,
PlayerEntity p_195938_4_) {
return !p_195938_4_.isSneaking();
}
}

View file

@ -0,0 +1,68 @@
package com.simibubi.create.content.logistics.block.depot;
import java.util.function.Supplier;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public class EjectorPlacementPacket extends SimplePacketBase {
private int h, v;
private BlockPos pos;
private Direction facing;
public EjectorPlacementPacket(int h, int v, BlockPos pos, Direction facing) {
this.h = h;
this.v = v;
this.pos = pos;
this.facing = facing;
}
public EjectorPlacementPacket(PacketBuffer buffer) {
h = buffer.readInt();
v = buffer.readInt();
pos = buffer.readBlockPos();
facing = Direction.byIndex(buffer.readVarInt());
}
@Override
public void write(PacketBuffer buffer) {
buffer.writeInt(h);
buffer.writeInt(v);
buffer.writeBlockPos(pos);
buffer.writeVarInt(facing.getIndex());
}
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity player = context.get()
.getSender();
if (player == null)
return;
World world = player.world;
if (world == null || !world.isBlockPresent(pos))
return;
TileEntity tileEntity = world.getTileEntity(pos);
BlockState state = world.getBlockState(pos);
if (tileEntity instanceof EjectorTileEntity)
((EjectorTileEntity) tileEntity).setTarget(h, v);
if (AllBlocks.WEIGHTED_EJECTOR.has(state))
world.setBlockState(pos, state.with(EjectorBlock.HORIZONTAL_FACING, facing));
});
context.get()
.setPacketHandled(true);
}
}

View file

@ -0,0 +1,97 @@
package com.simibubi.create.content.logistics.block.depot;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
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.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.IntAttached;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.Vec3d;
public class EjectorRenderer extends KineticTileEntityRenderer {
public EjectorRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) {
return true;
}
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
EjectorTileEntity ejector = (EjectorTileEntity) te;
SuperByteBuffer model = AllBlockPartials.EJECTOR_TOP.renderOn(te.getBlockState());
IVertexBuilder vertexBuilder = buffer.getBuffer(RenderType.getSolid());
Vec3d rotationOffset = VecHelper.voxelSpace(0, 11.25, 0.75);
float lidProgress = ((EjectorTileEntity) te).getLidProgress(partialTicks);
float angle = lidProgress * 70;
applyLidAngle(te, rotationOffset, angle, model.matrixStacker());
model.light(light)
.renderInto(ms, vertexBuilder);
MatrixStacker msr = MatrixStacker.of(ms);
for (IntAttached<ItemStack> intAttached : ejector.launchedItems) {
ms.push();
float time = intAttached.getFirst() + partialTicks;
Vec3d launchedItemLocation = ejector.getLaunchedItemLocation(time);
msr.translate(launchedItemLocation.subtract(new Vec3d(te.getPos())));
Vec3d itemRotOffset = VecHelper.voxelSpace(0,3,0);
msr.translate(itemRotOffset);
msr.rotateY(AngleHelper.horizontalAngle(ejector.getFacing()));
msr.rotateX(time * 40);
msr.translateBack(itemRotOffset);
Minecraft.getInstance()
.getItemRenderer()
.renderItem(intAttached.getValue(), TransformType.GROUND, light, overlay, ms, buffer);
ms.pop();
}
DepotBehaviour behaviour = te.getBehaviour(DepotBehaviour.TYPE);
if (behaviour == null || behaviour.isEmpty())
return;
ms.push();
applyLidAngle(te, rotationOffset, angle, msr);
msr.centre()
.rotateY(-180 - AngleHelper.horizontalAngle(te.getBlockState()
.get(EjectorBlock.HORIZONTAL_FACING)))
.unCentre();
DepotRenderer.renderItemsOf(te, partialTicks, ms, buffer, light, overlay, behaviour);
ms.pop();
}
protected void applyLidAngle(KineticTileEntity te, Vec3d rotationOffset, float angle, MatrixStacker matrixStacker) {
matrixStacker.centre()
.rotateY(180 + AngleHelper.horizontalAngle(te.getBlockState()
.get(EjectorBlock.HORIZONTAL_FACING)))
.unCentre()
.translate(rotationOffset)
.rotateX(-angle)
.translateBack(rotationOffset);
}
@Override
protected BlockState getRenderedBlockState(KineticTileEntity te) {
return shaft(getRotationAxisOf(te));
}
}

View file

@ -0,0 +1,269 @@
package com.simibubi.create.content.logistics.block.depot;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.particles.RedstoneParticleData;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.RayTraceResult.Type;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber(value = Dist.CLIENT)
public class EjectorTargetHandler {
static BlockPos currentSelection;
static ItemStack currentItem;
static long lastHoveredBlockPos = -1;
static EntityLauncher launcher;
@SubscribeEvent
public static void rightClickingBlocksSelectsThem(PlayerInteractEvent.RightClickBlock event) {
if (currentItem == null)
return;
BlockPos pos = event.getPos();
World world = event.getWorld();
if (!world.isRemote)
return;
PlayerEntity player = event.getPlayer();
if (player == null || player.isSpectator() || !player.isSneaking())
return;
String key = "weighted_ejector.target_set";
TextFormatting colour = TextFormatting.GOLD;
player.sendStatusMessage(new StringTextComponent(Lang.translate(key)).applyTextStyle(colour), true);
currentSelection = pos;
launcher = null;
event.setCanceled(true);
event.setCancellationResult(ActionResultType.SUCCESS);
}
@SubscribeEvent
public static void leftClickingBlocksDeselectsThem(PlayerInteractEvent.LeftClickBlock event) {
if (currentItem == null)
return;
if (!event.getWorld().isRemote)
return;
if (!event.getPlayer()
.isSneaking())
return;
BlockPos pos = event.getPos();
if (pos.equals(currentSelection)) {
currentSelection = null;
launcher = null;
event.setCanceled(true);
event.setCancellationResult(ActionResultType.SUCCESS);
}
}
public static void flushSettings(BlockPos pos) {
if (currentItem == null)
return;
int h = 0;
int v = 0;
ClientPlayerEntity player = Minecraft.getInstance().player;
String key = "weighted_ejector.target_not_valid";
TextFormatting colour = TextFormatting.WHITE;
if (currentSelection == null)
key = "weighted_ejector.no_target";
Direction validTargetDirection = getValidTargetDirection(pos);
if (validTargetDirection == null) {
player.sendStatusMessage(new StringTextComponent(Lang.translate(key)).applyTextStyle(colour), true);
currentItem = null;
currentSelection = null;
return;
}
key = "weighted_ejector.targeting";
colour = TextFormatting.GREEN;
player.sendStatusMessage(new StringTextComponent(
Lang.translate(key, currentSelection.getX(), currentSelection.getY(), currentSelection.getZ()))
.applyTextStyle(colour),
true);
BlockPos diff = pos.subtract(currentSelection);
h = Math.abs(diff.getX() + diff.getZ());
v = -diff.getY();
AllPackets.channel.sendToServer(new EjectorPlacementPacket(h, v, pos, validTargetDirection));
currentSelection = null;
currentItem = null;
}
public static Direction getValidTargetDirection(BlockPos pos) {
if (currentSelection == null)
return null;
if (VecHelper.onSameAxis(pos, currentSelection, Axis.Y))
return null;
int xDiff = currentSelection.getX() - pos.getX();
int zDiff = currentSelection.getZ() - pos.getZ();
int max = AllConfigs.SERVER.kinetics.maxEjectorDistance.get();
if (Math.abs(xDiff) > max || Math.abs(zDiff) > max)
return null;
if (xDiff == 0)
return Direction.getFacingFromAxis(zDiff < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE, Axis.Z);
if (zDiff == 0)
return Direction.getFacingFromAxis(xDiff < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE, Axis.X);
return null;
}
public static void tick() {
PlayerEntity player = Minecraft.getInstance().player;
if (player == null)
return;
ItemStack heldItemMainhand = player.getHeldItemMainhand();
if (!AllBlocks.WEIGHTED_EJECTOR.isIn(heldItemMainhand)) {
currentItem = null;
} else {
if (heldItemMainhand != currentItem) {
currentSelection = null;
currentItem = heldItemMainhand;
}
drawOutline(currentSelection);
}
checkForWrench(heldItemMainhand);
drawArc();
}
protected static void drawArc() {
Minecraft mc = Minecraft.getInstance();
boolean wrench = AllItems.WRENCH.isIn(mc.player.getHeldItemMainhand());
if (currentSelection == null)
return;
if (currentItem == null && !wrench)
return;
RayTraceResult objectMouseOver = mc.objectMouseOver;
if (!(objectMouseOver instanceof BlockRayTraceResult))
return;
BlockRayTraceResult blockRayTraceResult = (BlockRayTraceResult) objectMouseOver;
if (blockRayTraceResult.getType() == Type.MISS)
return;
BlockPos pos = blockRayTraceResult.getPos();
if (!wrench)
pos = pos.offset(blockRayTraceResult.getFace());
int xDiff = currentSelection.getX() - pos.getX();
int yDiff = currentSelection.getY() - pos.getY();
int zDiff = currentSelection.getZ() - pos.getZ();
int validX = Math.abs(zDiff) > Math.abs(xDiff) ? 0 : xDiff;
int validZ = Math.abs(zDiff) < Math.abs(xDiff) ? 0 : zDiff;
BlockPos validPos = currentSelection.add(validX, yDiff, validZ);
Direction d = getValidTargetDirection(validPos);
if (d == null)
return;
if (launcher == null || lastHoveredBlockPos != pos.toLong()) {
lastHoveredBlockPos = pos.toLong();
launcher = new EntityLauncher(Math.abs(validX + validZ), yDiff);
}
double totalFlyingTicks = launcher.getTotalFlyingTicks() + 3;
int segments = (((int) totalFlyingTicks) / 3) + 1;
double tickOffset = totalFlyingTicks / segments;
boolean valid = xDiff == validX && zDiff == validZ;
int intColor = valid ? 0x9ede73 : 0xff7171;
Vec3d color = ColorHelper.getRGB(intColor);
RedstoneParticleData data = new RedstoneParticleData((float) color.x, (float) color.y, (float) color.z, 1);
ClientWorld world = mc.world;
AxisAlignedBB bb = new AxisAlignedBB(0, 0, 0, 1, 0, 1).offset(currentSelection.add(-validX, -yDiff, -validZ));
CreateClient.outliner.chaseAABB("valid", bb)
.colored(intColor)
.lineWidth(1 / 16f);
for (int i = 0; i < segments; i++) {
double ticks = ((AnimationTickHolder.getRenderTime() / 3) % tickOffset) + i * tickOffset;
Vec3d vec = launcher.getGlobalPos(ticks, d, pos)
.add(xDiff - validX, 0, zDiff - validZ);
world.addParticle(data, vec.x, vec.y, vec.z, 0, 0, 0);
}
}
private static void checkForWrench(ItemStack heldItem) {
if (!AllItems.WRENCH.isIn(heldItem))
return;
RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver;
if (!(objectMouseOver instanceof BlockRayTraceResult))
return;
BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver;
BlockPos pos = result.getPos();
TileEntity te = Minecraft.getInstance().world.getTileEntity(pos);
if (!(te instanceof EjectorTileEntity)) {
lastHoveredBlockPos = -1;
currentSelection = null;
return;
}
if (lastHoveredBlockPos == -1 || lastHoveredBlockPos != pos.toLong()) {
EjectorTileEntity ejector = (EjectorTileEntity) te;
if (!ejector.getTargetPosition()
.equals(ejector.getPos()))
currentSelection = ejector.getTargetPosition();
lastHoveredBlockPos = pos.toLong();
launcher = null;
}
if (lastHoveredBlockPos != -1)
drawOutline(currentSelection);
}
private static void drawOutline(BlockPos selection) {
World world = Minecraft.getInstance().world;
if (currentSelection == null)
return;
BlockPos pos = currentSelection;
BlockState state = world.getBlockState(pos);
VoxelShape shape = state.getShape(world, pos);
AxisAlignedBB boundingBox = shape.isEmpty() ? new AxisAlignedBB(BlockPos.ZERO) : shape.getBoundingBox();
CreateClient.outliner.showAABB("target", boundingBox.offset(pos))
.colored(0xffcb74)
.lineWidth(1 / 16f);
}
}

View file

@ -0,0 +1,496 @@
package com.simibubi.create.content.logistics.block.depot;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.logistics.block.funnel.AbstractFunnelBlock;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.IntAttached;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ElytraItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.ItemStackHandler;
public class EjectorTileEntity extends KineticTileEntity {
List<IntAttached<ItemStack>> launchedItems;
ScrollValueBehaviour maxStackSize;
DepotBehaviour depotBehaviour;
EntityLauncher launcher;
LerpedFloat lidProgress;
State state;
public enum State {
CHARGED, LAUNCHING, RETRACTING;
}
public EjectorTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
launcher = new EntityLauncher(1, 0);
lidProgress = LerpedFloat.linear()
.startWithValue(1);
state = State.RETRACTING;
launchedItems = new ArrayList<>();
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
super.addBehaviours(behaviours);
behaviours.add(depotBehaviour = new DepotBehaviour(this));
maxStackSize = new ScrollValueBehaviour(Lang.translate("weighted_ejector.stack_size"), this, new EjectorSlot())
.between(0, 64)
.withFormatter(i -> i == 0 ? "*" : String.valueOf(i))
.onlyActiveWhen(() -> state == State.CHARGED)
.requiresWrench();
behaviours.add(maxStackSize);
depotBehaviour.maxStackSize = () -> maxStackSize.getValue();
depotBehaviour.canAcceptItems = () -> state == State.CHARGED;
depotBehaviour.canFunnelsPullFrom = side -> side != getFacing();
depotBehaviour.enableMerging();
depotBehaviour.addSubBehaviours(behaviours);
}
public void launchAll() {
if (state != State.CHARGED && !(world.isRemote && state == State.LAUNCHING))
return;
Direction facing = getFacing();
List<Entity> entities =
world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(pos).grow(-1 / 16f, 0, -1 / 16f));
// Launch Items
if (!world.isRemote)
launchItems();
// Launch Entities
for (Entity entity : entities) {
boolean isPlayerEntity = entity instanceof PlayerEntity;
if (!entity.isAlive())
continue;
if (entity instanceof ItemEntity)
continue;
entity.onGround = false;
if (isPlayerEntity != world.isRemote)
continue;
entity.setPosition(pos.getX() + .5f, pos.getY() + 1, pos.getZ() + .5f);
launcher.applyMotion(entity, facing);
if (!isPlayerEntity)
continue;
PlayerEntity playerEntity = (PlayerEntity) entity;
if (!(playerEntity.getItemStackFromSlot(EquipmentSlotType.CHEST)
.getItem() instanceof ElytraItem))
continue;
playerEntity.rotationYaw = facing.getHorizontalAngle();
playerEntity.rotationPitch = -35;
playerEntity.setMotion(playerEntity.getMotion()
.scale(.75f));
deployElytra(playerEntity);
AllPackets.channel.sendToServer(new EjectorElytraPacket(pos));
}
lidProgress.chase(1, .8f, Chaser.EXP);
state = State.LAUNCHING;
if (!world.isRemote) {
world.playSound(null, pos, SoundEvents.BLOCK_WOODEN_TRAPDOOR_CLOSE, SoundCategory.BLOCKS, .5f, 1f);
world.playSound(null, pos, SoundEvents.BLOCK_CHEST_OPEN, SoundCategory.BLOCKS, .125f, 1.4f);
}
}
public void deployElytra(PlayerEntity playerEntity) {
EntityHack.setElytraFlying(playerEntity);
}
protected void launchItems() {
ItemStack heldItemStack = depotBehaviour.getHeldItemStack();
Direction funnelFacing = getFacing().getOpposite();
if (AbstractFunnelBlock.getFunnelFacing(world.getBlockState(pos.up())) == funnelFacing) {
DirectBeltInputBehaviour directOutput = getBehaviour(DirectBeltInputBehaviour.TYPE);
if (depotBehaviour.heldItem != null) {
ItemStack remainder = directOutput.tryExportingToBeltFunnel(heldItemStack, funnelFacing, false);
if (remainder == null)
;
else if (remainder.isEmpty())
depotBehaviour.removeHeldItem();
else if (!remainder.isItemEqual(heldItemStack))
depotBehaviour.heldItem.stack = remainder;
}
for (Iterator<TransportedItemStack> iterator = depotBehaviour.incoming.iterator(); iterator.hasNext();) {
TransportedItemStack transportedItemStack = iterator.next();
ItemStack stack = transportedItemStack.stack;
ItemStack remainder = directOutput.tryExportingToBeltFunnel(stack, funnelFacing, false);
if (remainder == null)
;
else if (remainder.isEmpty())
iterator.remove();
else if (!remainder.isItemEqual(stack))
transportedItemStack.stack = remainder;
}
ItemStackHandler outputs = depotBehaviour.processingOutputBuffer;
for (int i = 0; i < outputs.getSlots(); i++) {
ItemStack remainder =
directOutput.tryExportingToBeltFunnel(outputs.getStackInSlot(i), funnelFacing, false);
if (remainder != null)
outputs.setStackInSlot(i, remainder);
}
return;
}
if (depotBehaviour.heldItem != null) {
launchedItems.add(IntAttached.withZero(heldItemStack));
depotBehaviour.removeHeldItem();
}
for (TransportedItemStack transportedItemStack : depotBehaviour.incoming)
launchedItems.add(IntAttached.withZero(transportedItemStack.stack));
depotBehaviour.incoming.clear();
ItemStackHandler outputs = depotBehaviour.processingOutputBuffer;
for (int i = 0; i < outputs.getSlots(); i++) {
ItemStack extractItem = outputs.extractItem(i, 64, false);
if (!extractItem.isEmpty())
launchedItems.add(IntAttached.withZero(extractItem));
}
}
protected Direction getFacing() {
BlockState blockState = getBlockState();
if (!AllBlocks.WEIGHTED_EJECTOR.has(blockState))
return Direction.UP;
Direction facing = blockState.get(EjectorBlock.HORIZONTAL_FACING);
return facing;
}
@Override
public void tick() {
super.tick();
boolean doLogic = !world.isRemote || isVirtual();
State prevState = state;
float maxTime = Math.max(3, (float) launcher.getTotalFlyingTicks());
for (Iterator<IntAttached<ItemStack>> iterator = launchedItems.iterator(); iterator.hasNext();) {
IntAttached<ItemStack> intAttached = iterator.next();
if (intAttached.exceeds((int) maxTime)) {
placeItemAtTarget(doLogic, maxTime, intAttached);
iterator.remove();
}
intAttached.increment();
}
if (state == State.LAUNCHING) {
lidProgress.chase(1, .8f, Chaser.EXP);
lidProgress.tickChaser();
if (lidProgress.getValue() > 1 - 1 / 16f && doLogic) {
state = State.RETRACTING;
lidProgress.setValue(1);
}
}
if (state == State.CHARGED) {
lidProgress.setValue(0);
if (doLogic)
ejectIfTriggered();
}
if (state == State.RETRACTING) {
float value = MathHelper.clamp(lidProgress.getValue() - getWindUpSpeed(), 0, 1);
lidProgress.setValue(value);
int soundRate = (int) (1 / (getWindUpSpeed() * 5)) + 1;
float volume = .125f;
float pitch = 1.5f - lidProgress.getValue();
if (((int) world.getGameTime()) % soundRate == 0 && doLogic)
world.playSound(null, pos, SoundEvents.BLOCK_WOODEN_BUTTON_CLICK_OFF, SoundCategory.BLOCKS, volume,
pitch);
if (lidProgress.getValue() == 0 && doLogic) {
state = State.CHARGED;
lidProgress.setValue(0);
List<Entity> entities =
world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(pos).grow(-1 / 16f, 0, -1 / 16f));
for (Entity entity : entities)
if (!(entity instanceof PlayerEntity))
entity.setPosition(entity.getX(), entity.getY() + volume, entity.getZ());
}
}
if (state != prevState)
notifyUpdate();
}
protected void ejectIfTriggered() {
int presentStackSize = depotBehaviour.getPresentStackSize();
if (presentStackSize == 0)
return;
if (presentStackSize < maxStackSize.getValue())
return;
Direction funnelFacing = getFacing().getOpposite();
if (AbstractFunnelBlock.getFunnelFacing(world.getBlockState(pos.up())) == funnelFacing) {
DirectBeltInputBehaviour directOutput = getBehaviour(DirectBeltInputBehaviour.TYPE);
if (depotBehaviour.heldItem != null) {
ItemStack tryFunnel =
directOutput.tryExportingToBeltFunnel(depotBehaviour.getHeldItemStack(), funnelFacing, true);
if (tryFunnel == null || !tryFunnel.isEmpty())
return;
}
}
DirectBeltInputBehaviour targetOpenInv = getTargetOpenInv();
// Do not eject if target cannot accept held item
if (targetOpenInv != null && depotBehaviour.heldItem != null
&& targetOpenInv.handleInsertion(depotBehaviour.getHeldItemStack(), Direction.UP, true)
.isItemEqual(depotBehaviour.getHeldItemStack()))
return;
launchAll();
notifyUpdate();
}
protected void placeItemAtTarget(boolean doLogic, float maxTime, IntAttached<ItemStack> intAttached) {
if (!doLogic)
return;
DirectBeltInputBehaviour targetOpenInv = getTargetOpenInv();
if (targetOpenInv != null) {
ItemStack remainder = targetOpenInv.handleInsertion(intAttached.getValue(), Direction.UP, false);
intAttached.setSecond(remainder);
}
if (intAttached.getValue()
.isEmpty())
return;
Vec3d ejectVec = getLaunchedItemLocation(maxTime);
Vec3d ejectMotionVec = getLaunchedItemMotion(maxTime);
ItemEntity item = new ItemEntity(world, ejectVec.x, ejectVec.y, ejectVec.z, intAttached.getValue());
item.setMotion(ejectMotionVec);
item.setDefaultPickupDelay();
world.addEntity(item);
}
public DirectBeltInputBehaviour getTargetOpenInv() {
return TileEntityBehaviour.get(world, pos.up(launcher.getVerticalDistance())
.offset(getFacing(), Math.max(1, launcher.getHorizontalDistance())), DirectBeltInputBehaviour.TYPE);
}
public Vec3d getLaunchedItemLocation(float time) {
return launcher.getGlobalPos(time, getFacing().getOpposite(), pos);
}
public Vec3d getLaunchedItemMotion(float time) {
return launcher.getGlobalVelocity(time, getFacing().getOpposite(), pos);
}
public void dropFlyingItems() {
for (IntAttached<ItemStack> intAttached : launchedItems) {
Vec3d ejectVec = getLaunchedItemLocation(intAttached.getFirst());
Vec3d ejectMotionVec = getLaunchedItemMotion(intAttached.getFirst());
ItemEntity item = new ItemEntity(world, 0, 0, 0, intAttached.getValue());
item.setPos(ejectVec.x, ejectVec.y, ejectVec.z);
item.setMotion(ejectMotionVec);
item.setDefaultPickupDelay();
world.addEntity(item);
}
launchedItems.clear();
}
public float getWindUpSpeed() {
int hd = launcher.getHorizontalDistance();
int vd = launcher.getVerticalDistance();
float speedFactor = Math.abs(getSpeed()) / 256f;
float distanceFactor;
if (hd == 0 && vd == 0)
distanceFactor = 1;
else
distanceFactor = 1 * MathHelper.sqrt(Math.pow(hd, 2) + Math.pow(vd, 2));
return speedFactor / distanceFactor;
}
@Override
protected void write(CompoundNBT compound, boolean clientPacket) {
super.write(compound, clientPacket);
compound.putInt("HorizontalDistance", launcher.getHorizontalDistance());
compound.putInt("VerticalDistance", launcher.getVerticalDistance());
NBTHelper.writeEnum(compound, "State", state);
compound.put("Lid", lidProgress.writeNBT());
compound.put("LaunchedItems",
NBTHelper.writeCompoundList(launchedItems, ia -> ia.serializeNBT(ItemStack::serializeNBT)));
}
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
super.read(compound, clientPacket);
int horizontalDistance = compound.getInt("HorizontalDistance");
int verticalDistance = compound.getInt("VerticalDistance");
if (launcher == null || launcher.getHorizontalDistance() != horizontalDistance
|| launcher.getVerticalDistance() != verticalDistance) {
launcher.set(horizontalDistance, verticalDistance);
launcher.clamp(AllConfigs.SERVER.kinetics.maxEjectorDistance.get());
}
state = NBTHelper.readEnum(compound, "State", State.class);
lidProgress.readNBT(compound.getCompound("Lid"), clientPacket);
launchedItems = NBTHelper.readCompoundList(compound.getList("LaunchedItems", NBT.TAG_COMPOUND),
nbt -> IntAttached.read(nbt, ItemStack::read));
}
public void setTarget(int horizontalDistance, int verticalDistance) {
launcher.set(Math.max(1, horizontalDistance), verticalDistance);
if (horizontalDistance == 0 && verticalDistance == 0) {
state = State.CHARGED;
lidProgress.startWithValue(0);
}
sendData();
}
public BlockPos getTargetPosition() {
BlockState blockState = getBlockState();
if (!AllBlocks.WEIGHTED_EJECTOR.has(blockState))
return pos;
Direction facing = blockState.get(EjectorBlock.HORIZONTAL_FACING);
return pos.offset(facing, launcher.getHorizontalDistance())
.up(launcher.getVerticalDistance());
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (isItemHandlerCap(cap))
return depotBehaviour.getItemCapability(cap, side);
return super.getCapability(cap, side);
}
@Override
public boolean shouldRenderAsTE() {
return true;
}
public float getLidProgress(float pt) {
return lidProgress.getValue(pt);
}
public State getState() {
return state;
}
@Override
@OnlyIn(Dist.CLIENT)
public AxisAlignedBB getRenderBoundingBox() {
return INFINITE_EXTENT_AABB;
}
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return super.getMaxRenderDistanceSquared() * 16;
}
private static abstract class EntityHack extends Entity {
public EntityHack(EntityType<?> p_i48580_1_, World p_i48580_2_) {
super(p_i48580_1_, p_i48580_2_);
}
public static void setElytraFlying(Entity e) {
EntityDataManager data = e.getDataManager();
data.set(FLAGS, (byte) (data.get(FLAGS) | 1 << 7));
}
}
private static class EjectorSlot extends ValueBoxTransform.Sided {
@Override
protected Vec3d getLocalOffset(BlockState state) {
return new Vec3d(.5, 13 / 16f, .5).add(VecHelper.rotate(new Vec3d(0, 0, -.3), angle(state), Axis.Y));
}
@Override
protected void rotate(BlockState state, MatrixStack ms) {
MatrixStacker.of(ms)
.rotateY(angle(state))
.rotateX(90);
}
protected float angle(BlockState state) {
float horizontalAngle = AllBlocks.WEIGHTED_EJECTOR.has(state)
? AngleHelper.horizontalAngle(state.get(EjectorBlock.HORIZONTAL_FACING))
: 0;
return horizontalAngle;
}
@Override
protected boolean isSideActive(BlockState state, Direction direction) {
return direction == Direction.UP;
}
@Override
protected float getScale() {
return 0.2f;
}
@Override
protected Vec3d getSouthLocation() {
return Vec3d.ZERO;
}
}
}

View file

@ -0,0 +1,29 @@
package com.simibubi.create.content.logistics.block.depot;
import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.math.BlockPos;
public class EjectorTriggerPacket extends TileEntityConfigurationPacket<EjectorTileEntity> {
public EjectorTriggerPacket(BlockPos pos) {
super(pos);
}
public EjectorTriggerPacket(PacketBuffer buffer) {
super(buffer);
}
@Override
protected void writeSettings(PacketBuffer buffer) {}
@Override
protected void readSettings(PacketBuffer buffer) {}
@Override
protected void applySettings(EjectorTileEntity te) {
te.launchAll();
}
}

View file

@ -0,0 +1,140 @@
package com.simibubi.create.content.logistics.block.depot;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.entity.Entity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
public class EntityLauncher {
private int horizontalDistance;
private int verticalDistance;
private double yMotion;
private double xMotion;
private double totalFlyingTicks;
public EntityLauncher(int horizontalDistance, int verticalDistance) {
set(horizontalDistance, verticalDistance);
}
public void clamp(int max) {
set(Math.min(horizontalDistance, max),
MathHelper.signum(verticalDistance) * Math.min(Math.abs(verticalDistance), max));
}
public void set(int horizontalDistance, int verticalDistance) {
this.horizontalDistance = horizontalDistance;
this.verticalDistance = verticalDistance;
recalculateTrajectory();
}
public void applyMotion(Entity entity, Direction facing) {
Vec3d motionVec = new Vec3d(0, yMotion, xMotion);
motionVec = VecHelper.rotate(motionVec, AngleHelper.horizontalAngle(facing), Axis.Y);
entity.setMotion(motionVec.x, motionVec.y, motionVec.z);
}
public int getHorizontalDistance() {
return horizontalDistance;
}
public int getVerticalDistance() {
return verticalDistance;
}
public double getTotalFlyingTicks() {
return totalFlyingTicks;
}
public Vec3d getGlobalPos(double t, Direction d, BlockPos launcher) {
Vec3d start = new Vec3d(launcher.getX() + .5f, launcher.getY() + .5f, launcher.getZ() + .5f);
Vec3d vec = new Vec3d(0, y(t), x(t));
return VecHelper.rotate(vec, 180 + AngleHelper.horizontalAngle(d), Axis.Y)
.add(start);
}
public Vec3d getGlobalVelocity(double t, Direction d, BlockPos launcher) {
return VecHelper.rotate(new Vec3d(0, dy(t), dx(t)), 180 + AngleHelper.horizontalAngle(d), Axis.Y);
}
public float x(double t) {
return (float) (xMotion * -10.6033 * (-1 + Math.pow(0.91, t)));
}
public float y(double t) {
double f = Math.pow(0.98, t);
return (float) (yMotion * -49.4983 * f + 49.4983 * yMotion - 194.033 * f - 3.92 * t + 194.033);
}
public float dx(double t) {
return (float) (xMotion * Math.pow(0.91, t));
}
public float dy(double t) {
double f = Math.pow(0.98, t);
return (float) (yMotion * f + ((f - 1) / (0.98 - 1)) * -0.0784);
}
protected void recalculateTrajectory() {
double xTarget = this.horizontalDistance;
double yTarget = this.verticalDistance;
/*
** Iterated:
* Horizontal Motion fh(x) = x * 0.91
* Vertical Motion fv(x) = (x - 0.08) * 0.98
* (Gravity modification ignored)
* > See LivingEntity.travel()
*
** n-th Iterative
* (= given initial velocity x, motion after t ticks)
* X'(x, t) = x * 0.91^t
* Y'(x, t) = x * 0.98^t + ((0.98^t - 1) / (0.98 - 1)) * -0.0784
*
** integral
* (= given intial velocity x, location offset after t ticks)
* X(x, t) = -10.6033x * (-1 + 0.91^t)
* Y(x, t) = -49.4983x * 0.98^t + 49.4983x - 194.033 * 0.98^t - 3.92t + 194.033
*
** argmax y
* (= given initial y velocity, ticks at which y reaches top)
* tPeak(x) = log(98 / (25x + 98)) / (2*log(7) - 2*log(5) - log(2))
*
** max y
* (= given initial y velocity, height offset at tPeak)
* yPeak(x) = 889.636 + 49.4983x + 0.032928/(98 + 25x) + 194.033 * log(1/(98 + 25x))
*
** yPeak inverse (Zelo's approximation)
* (= given yPeak, initial y velocity required to reach it at max)
* yMotion(h) = sqrt(2h/13) + 0.015h
*
** Y'(x, t) inverse (Simi's approximation)
* (= given yTarget and initial y velocity, elapsed ticks when arc hits yTarget on its way down)
* t*(x, v) = sqrt(yPeak(v) - x) * 4.87 + 0.115 * (yPeak(v) - x) + tPeak(v)
*
** xMotion
* (= given t* and xTarget, initial x velocity such that X'(x, t*) = xTarget)
* xMotion(t, x) = x / (-10.6033 * (-1 + 0.91^t));
*
** xError
* Interpolated correction function from observed inaccuracies in-game
*
*/
double xError = (-0.0007 * Math.pow(xTarget + .5, 2) + 0.484)
- (Math.min(5, yTarget) / 5) * Math.min(1, 0.076 * xTarget - 0.0014 * xTarget * xTarget);
double yPeak = Math.max(0, yTarget + (xTarget + .5) / 8f) + (xTarget <= 1 ? 1 : 4);
yMotion = Math.sqrt(2 * yPeak / 13) + 0.015 * yPeak;
double tPeak = Math.log(98 / (25 * yMotion + 98)) / (2 * Math.log(7) - 2 * Math.log(5) - Math.log(2));
totalFlyingTicks = Math.sqrt(yPeak - yMotion) * 4.87 + 0.115 * (yPeak - yMotion) + tPeak;
xMotion = (xTarget - xError + .5) / (-10.6033 * (-1 + Math.pow(0.91, totalFlyingTicks)));
}
}

View file

@ -0,0 +1,111 @@
package com.simibubi.create.content.logistics.block.depot;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler;
public class SharedDepotBlockMethods {
protected static DepotBehaviour get(IBlockReader worldIn, BlockPos pos) {
return TileEntityBehaviour.get(worldIn, pos, DepotBehaviour.TYPE);
}
public static ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) {
if (ray.getFace() != Direction.UP)
return ActionResultType.PASS;
if (world.isRemote)
return ActionResultType.SUCCESS;
DepotBehaviour behaviour = get(world, pos);
if (behaviour == null)
return ActionResultType.PASS;
if (!behaviour.canAcceptItems.get())
return ActionResultType.SUCCESS;
ItemStack heldItem = player.getHeldItem(hand);
boolean wasEmptyHanded = heldItem.isEmpty();
boolean shouldntPlaceItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem);
ItemStack mainItemStack = behaviour.getHeldItemStack();
if (!mainItemStack.isEmpty()) {
player.inventory.placeItemBackInInventory(world, mainItemStack);
behaviour.removeHeldItem();
}
ItemStackHandler outputs = behaviour.processingOutputBuffer;
for (int i = 0; i < outputs.getSlots(); i++)
player.inventory.placeItemBackInInventory(world, outputs.extractItem(i, 64, false));
if (!wasEmptyHanded && !shouldntPlaceItem) {
TransportedItemStack transported = new TransportedItemStack(heldItem);
transported.insertedFrom = player.getHorizontalFacing();
transported.prevBeltPosition = .25f;
transported.beltPosition = .25f;
behaviour.setHeldItem(transported);
player.setHeldItem(hand, ItemStack.EMPTY);
}
behaviour.tileEntity.notifyUpdate();
return ActionResultType.SUCCESS;
}
public static void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState,
boolean isMoving) {
if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
return;
DepotBehaviour behaviour = get(worldIn, pos);
if (behaviour == null)
return;
ItemHelper.dropContents(worldIn, pos, behaviour.processingOutputBuffer);
for (TransportedItemStack transportedItemStack : behaviour.incoming)
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), transportedItemStack.stack);
if (!behaviour.getHeldItemStack()
.isEmpty())
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), behaviour.getHeldItemStack());
worldIn.removeTileEntity(pos);
}
public static void onLanded(IBlockReader worldIn, Entity entityIn) {
if (!(entityIn instanceof ItemEntity))
return;
if (!entityIn.isAlive())
return;
if (entityIn.world.isRemote)
return;
ItemEntity itemEntity = (ItemEntity) entityIn;
DirectBeltInputBehaviour inputBehaviour =
TileEntityBehaviour.get(worldIn, entityIn.getPosition(), DirectBeltInputBehaviour.TYPE);
if (inputBehaviour == null)
return;
ItemStack remainder = inputBehaviour.handleInsertion(itemEntity.getItem(), Direction.DOWN, false);
itemEntity.setItem(remainder);
if (remainder.isEmpty())
itemEntity.remove();
}
public static int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
DepotBehaviour depotBehaviour = get(worldIn, pos);
if (depotBehaviour == null)
return 0;
return ItemHelper.calcRedstoneFromInventory(depotBehaviour.itemHandler);
}
}

View file

@ -228,7 +228,7 @@ public abstract class ArmInteractionPoint {
@Override
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
return AllBlocks.DEPOT.has(state);
return AllBlocks.DEPOT.has(state) || AllBlocks.WEIGHTED_EJECTOR.has(state);
}
}

View file

@ -21,6 +21,7 @@ import com.simibubi.create.content.curiosities.zapper.ZapperItem;
import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler;
import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperRenderHandler;
import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler;
import com.simibubi.create.content.logistics.block.depot.EjectorTargetHandler;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.TooltipHelper;
@ -114,6 +115,7 @@ public class ClientEvents {
ExtendoGripRenderHandler.tick();
// CollisionDebugger.tick();
ArmInteractionPointHandler.tick();
EjectorTargetHandler.tick();
PlacementHelpers.tick();
CreateClient.outliner.tickOutlines();
CreateClient.ghostBlocks.tickGhosts();

View file

@ -15,6 +15,7 @@ public class CKinetics extends ConfigBase {
public ConfigInt kineticValidationFrequency = i(60, 5, "kineticValidationFrequency", Comments.kineticValidationFrequency);
public ConfigFloat crankHungerMultiplier = f(.01f, 0, 1, "crankHungerMultiplier", Comments.crankHungerMultiplier);
public ConfigInt minimumWindmillSails = i(8, 0, "minimumWindmillSails", Comments.minimumWindmillSails);
public ConfigInt maxEjectorDistance = i(32, 0, "maxEjectorDistance", Comments.maxEjectorDistance);
public ConfigGroup fan = group(1, "encasedFan", "Encased Fan");
public ConfigInt fanPushDistance = i(20, 5, "fanPushDistance", Comments.fanPushDistance);
@ -81,6 +82,7 @@ public class CKinetics extends ConfigBase {
static String disableStress = "Disable the Stress mechanic altogether.";
static String kineticValidationFrequency = "Game ticks between Kinetic Blocks checking whether their source is still valid.";
static String minimumWindmillSails = "Amount of sail-type blocks required for a windmill to assemble successfully.";
static String maxEjectorDistance = "Max Distance in blocks a Weighted Ejector can throw";
}
public static enum DeployerAggroSetting {

View file

@ -317,7 +317,7 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("P")
.patternLine("A")
.patternLine("P")),
GANTRY_PINION = create(AllBlocks.GANTRY_CARRIAGE).unlockedBy(I::andesiteCasing)
.viaShaped(b -> b.key('B', ItemTags.PLANKS)
.key('S', I.cog())
@ -598,6 +598,14 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("A")
.patternLine("I")),
WEIGHTED_EJECTOR = create(AllBlocks.WEIGHTED_EJECTOR).unlockedBy(I::andesiteCasing)
.viaShaped(b -> b.key('A', AllItems.GOLDEN_SHEET.get())
.key('D', AllBlocks.DEPOT.get())
.key('I', I.cog())
.patternLine("A")
.patternLine("D")
.patternLine("I")),
MECHANICAL_ARM = create(AllBlocks.MECHANICAL_ARM::get).unlockedBy(I::brassCasing)
.returns(1)
.viaShaped(b -> b.key('L', I.brassSheet())

View file

@ -1,11 +1,22 @@
package com.simibubi.create.foundation.networking;
import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_CLIENT;
import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_SERVER;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Supplier;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionDisassemblyPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionStallPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionUpdatePacket;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.GlueEffectPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.sync.*;
import com.simibubi.create.content.contraptions.components.structureMovement.sync.ClientMotionPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionFluidPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionInteractionPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionSeatMappingPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.sync.LimbSwingUpdatePacket;
import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingCreationPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartControllerUpdatePacket;
import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket;
@ -13,18 +24,26 @@ import com.simibubi.create.content.contraptions.relays.advanced.sequencer.Config
import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket;
import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket;
import com.simibubi.create.content.curiosities.zapper.ZapperBeamPacket;
import com.simibubi.create.content.logistics.block.depot.EjectorElytraPacket;
import com.simibubi.create.content.logistics.block.depot.EjectorPlacementPacket;
import com.simibubi.create.content.logistics.block.depot.EjectorTriggerPacket;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmPlacementPacket;
import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket;
import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket;
import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket;
import com.simibubi.create.content.logistics.packet.FunnelFlapPacket;
import com.simibubi.create.content.logistics.packet.TunnelFlapPacket;
import com.simibubi.create.content.schematics.packet.*;
import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket;
import com.simibubi.create.content.schematics.packet.InstantSchematicPacket;
import com.simibubi.create.content.schematics.packet.SchematicPlacePacket;
import com.simibubi.create.content.schematics.packet.SchematicSyncPacket;
import com.simibubi.create.content.schematics.packet.SchematicUploadPacket;
import com.simibubi.create.foundation.command.ConfigureConfigPacket;
import com.simibubi.create.foundation.command.HighlightPacket;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCountUpdatePacket;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket;
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
@ -36,13 +55,6 @@ import net.minecraftforge.fml.network.PacketDistributor;
import net.minecraftforge.fml.network.PacketDistributor.TargetPoint;
import net.minecraftforge.fml.network.simple.SimpleChannel;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Supplier;
import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_CLIENT;
import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_SERVER;
public enum AllPackets {
// Client to Server
@ -64,6 +76,9 @@ public enum AllPackets {
INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new, PLAY_TO_SERVER),
SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new, PLAY_TO_SERVER),
LEFT_CLICK(LeftClickPacket.class, LeftClickPacket::new, PLAY_TO_SERVER),
PLACE_EJECTOR(EjectorPlacementPacket.class, EjectorPlacementPacket::new, PLAY_TO_SERVER),
TRIGGER_EJECTOR(EjectorTriggerPacket.class, EjectorTriggerPacket::new, PLAY_TO_SERVER),
EJECTOR_ELYTRA(EjectorElytraPacket.class, EjectorElytraPacket::new, PLAY_TO_SERVER),
// Server to Client
SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT),

View file

@ -307,6 +307,7 @@ public class PonderIndex {
.add(AllItems.BELT_CONNECTOR)
.add(AllBlocks.CHUTE)
.add(AllBlocks.DEPOT)
.add(AllBlocks.WEIGHTED_EJECTOR)
.add(AllBlocks.BASIN)
.add(AllBlocks.ANDESITE_FUNNEL)
.add(AllBlocks.BRASS_FUNNEL)
@ -326,6 +327,7 @@ public class PonderIndex {
.add(AllBlocks.CHUTE)
.add(AllBlocks.SMART_CHUTE)
.add(AllBlocks.DEPOT)
.add(AllBlocks.WEIGHTED_EJECTOR)
.add(AllBlocks.MECHANICAL_ARM)
.add(AllBlocks.ANDESITE_FUNNEL)
.add(AllBlocks.BRASS_FUNNEL)

View file

@ -98,7 +98,7 @@ public class DirectBeltInputBehaviour extends TileEntityBehaviour {
}
@Nullable
public ItemStack tryExportingToBeltFunnel(ItemStack stack, @Nullable Direction side) {
public ItemStack tryExportingToBeltFunnel(ItemStack stack, @Nullable Direction side, boolean simulate) {
BlockPos funnelPos = tileEntity.getPos()
.up();
World world = getWorld();
@ -112,8 +112,10 @@ public class DirectBeltInputBehaviour extends TileEntityBehaviour {
TileEntity te = world.getTileEntity(funnelPos);
if (!(te instanceof FunnelTileEntity))
return null;
ItemStack insert = FunnelBlock.tryInsert(world, funnelPos, stack, false);
if (insert.getCount() != stack.getCount())
if (funnelState.get(BeltFunnelBlock.POWERED))
return stack;
ItemStack insert = FunnelBlock.tryInsert(world, funnelPos, stack, simulate);
if (insert.getCount() != stack.getCount() && !simulate)
((FunnelTileEntity) te).flap(true);
return insert;
}

View file

@ -2,6 +2,7 @@ package com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
@ -33,6 +34,7 @@ public class ScrollValueBehaviour extends TileEntityBehaviour {
Function<Integer, String> formatter;
Function<Integer, String> unit;
Function<StepContext, Integer> step;
private Supplier<Boolean> isActive;
boolean needsWrench;
public ScrollValueBehaviour(String label, SmartTileEntity te, ValueBoxTransform slot) {
@ -47,6 +49,7 @@ public class ScrollValueBehaviour extends TileEntityBehaviour {
formatter = i -> Integer.toString(i);
step = (c) -> 1;
value = 0;
isActive = () -> true;
ticksUntilScrollPacket = -1;
}
@ -122,6 +125,11 @@ public class ScrollValueBehaviour extends TileEntityBehaviour {
this.unit = unit;
return this;
}
public ScrollValueBehaviour onlyActiveWhen(Supplier<Boolean> condition) {
isActive = condition;
return this;
}
public ScrollValueBehaviour withStepFunction(Function<StepContext, Integer> step) {
this.step = step;
@ -159,6 +167,10 @@ public class ScrollValueBehaviour extends TileEntityBehaviour {
public BehaviourType<?> getType() {
return TYPE;
}
public boolean isActive() {
return isActive.get();
}
public boolean testHit(Vec3d hit) {
BlockState state = tileEntity.getBlockState();

View file

@ -40,6 +40,8 @@ public class ScrollValueHandler {
ScrollValueBehaviour scrolling = TileEntityBehaviour.get(world, blockPos, ScrollValueBehaviour.TYPE);
if (scrolling == null)
return false;
if (!scrolling.isActive())
return false;
if (!mc.player.isAllowEdit())
return false;

View file

@ -35,7 +35,9 @@ public class ScrollValueRenderer {
ScrollValueBehaviour behaviour = TileEntityBehaviour.get(world, pos, ScrollValueBehaviour.TYPE);
if (behaviour == null)
return;
if (behaviour.needsWrench && !AllItems.WRENCH.isIn(Minecraft.getInstance().player.getHeldItemMainhand()))
if (!behaviour.isActive())
return;
if (behaviour.needsWrench && !AllItems.WRENCH.isIn(mc.player.getHeldItemMainhand()))
return;
boolean highlight = behaviour.testHit(target.getHitVec());

View file

@ -1,37 +1,56 @@
package com.simibubi.create.foundation.utility;
import java.util.function.Function;
import net.minecraft.nbt.CompoundNBT;
public class IntAttached<V> extends Pair<Integer, V> {
protected IntAttached(Integer first, V second) {
super(first, second);
}
public static <V> IntAttached<V> with(int number, V value) {
return new IntAttached<>(number, value);
}
public static <V> IntAttached<V> withZero(V value) {
return new IntAttached<>(0, value);
}
public boolean isZero() {
return first.intValue() == 0;
}
public boolean exceeds(int value) {
return first.intValue() > value;
}
public boolean isOrBelowZero() {
return first.intValue() <= 0;
}
public void increment() {
first++;
}
public void decrement() {
first--;
}
public V getValue() {
return getSecond();
}
public CompoundNBT serializeNBT(Function<V, CompoundNBT> serializer) {
CompoundNBT nbt = new CompoundNBT();
nbt.put("Item", serializer.apply(getValue()));
nbt.putInt("Location", getFirst());
return nbt;
}
public static <T> IntAttached<T> read(CompoundNBT nbt, Function<CompoundNBT, T> deserializer) {
return IntAttached.with(nbt.getInt("Location"), deserializer.apply(nbt.getCompound("Item")));
}
}

View file

@ -443,6 +443,12 @@
"create.mechanical_arm.deposit_to": "Deposit items to %1$s",
"create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(s).",
"create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "Target Selected",
"create.weighted_ejector.target_not_valid": "Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available",

View file

@ -0,0 +1,112 @@
{
"credit": "Made with Blockbench",
"textures": {
"3": "create:block/weighted_ejector_casing",
"7": "create:block/andesite_casing",
"particle": "create:block/weighted_ejector_top"
},
"elements": [
{
"from": [0, 2, 14],
"to": [16, 11, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [0, 10.5, 8, 15], "texture": "#3"},
"east": {"uv": [0, 10.5, 1, 15], "texture": "#3"},
"south": {"uv": [0, 10.5, 8, 15], "texture": "#3"},
"west": {"uv": [7, 10.5, 8, 15], "texture": "#3"},
"up": {"uv": [0, 7, 8, 8], "texture": "#3"}
}
},
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [0, 15, 8, 16], "texture": "#3"},
"east": {"uv": [0, 15, 8, 16], "texture": "#3"},
"south": {"uv": [0, 15, 8, 16], "texture": "#3"},
"west": {"uv": [0, 15, 8, 16], "texture": "#3"},
"up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#7"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#7"}
}
},
{
"from": [1, 2, 2],
"to": [15, 11, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"east": {"uv": [9, 2.5, 15, 7], "texture": "#3"},
"west": {"uv": [9, 2.5, 15, 7], "texture": "#3"},
"up": {"uv": [0.5, 1, 7.5, 7], "texture": "#3"}
}
},
{
"from": [12, 11, 5],
"to": [15, 12, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [6, 2, 7.5, 2.5], "rotation": 180, "texture": "#3"},
"east": {"uv": [10.5, 2, 13.5, 2.5], "texture": "#3"},
"south": {"uv": [6, 5.5, 7.5, 6], "texture": "#3"},
"west": {"uv": [6, 2.5, 6.5, 5.5], "rotation": 90, "texture": "#3"},
"up": {"uv": [6, 2.5, 7.5, 5.5], "texture": "#3"}
}
},
{
"from": [1, 11, 5],
"to": [4, 12, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [6, 5.5, 7.5, 6], "texture": "#3"},
"east": {"uv": [6, 2.5, 6.5, 5.5], "rotation": 90, "texture": "#3"},
"south": {"uv": [6, 2, 7.5, 2.5], "rotation": 180, "texture": "#3"},
"west": {"uv": [10.5, 2, 13.5, 2.5], "texture": "#3"},
"up": {"uv": [6, 2.5, 7.5, 5.5], "rotation": 180, "texture": "#3"}
}
},
{
"from": [0, 2, 0],
"to": [16, 11, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [8, 10.5, 16, 15], "texture": "#3"},
"east": {"uv": [7, 10.5, 8, 15], "texture": "#3"},
"south": {"uv": [0, 10.5, 8, 15], "texture": "#3"},
"west": {"uv": [0, 10.5, 1, 15], "texture": "#3"},
"up": {"uv": [0, 0, 8, 1], "texture": "#3"}
}
},
{
"from": [12, 9.5, -0.5],
"to": [14, 12.5, 2.5],
"faces": {
"north": {"uv": [8, 0, 9, 1.5], "texture": "#3"},
"east": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"south": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"west": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"up": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"down": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"}
}
},
{
"from": [2, 9.5, -0.5],
"to": [4, 12.5, 2.5],
"faces": {
"north": {"uv": [8, 0, 9, 1.5], "texture": "#3"},
"east": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"south": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"west": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"up": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"down": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"}
}
}
],
"groups": [
{
"name": "casing",
"origin": [0, 0, 0],
"children": [0, 1, 2, 3, 4, 5, 6, 7]
}
]
}

View file

@ -0,0 +1,247 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "block/stripped_spruce_log_top",
"1": "create:block/axis",
"2": "block/stripped_spruce_log",
"3": "create:block/weighted_ejector_casing",
"4": "create:block/weighted_ejector_top",
"5": "create:block/weighted_ejector_inner",
"6": "create:block/axis_top",
"7": "create:block/andesite_casing",
"particle": "create:block/weighted_ejector_top"
},
"elements": [
{
"from": [0, 6, 6],
"to": [16, 10, 10],
"faces": {
"north": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1"},
"east": {"uv": [6, 6, 10, 10], "texture": "#6"},
"south": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1"},
"west": {"uv": [6, 6, 10, 10], "texture": "#6"},
"up": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1"},
"down": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1"}
}
},
{
"from": [4, 9.5, -0.5],
"to": [12, 12.5, 2.5],
"faces": {
"north": {"uv": [9, 0, 13, 1.5], "texture": "#3"},
"east": {"uv": [12.5, 0, 13, 0.5], "texture": "#3"},
"south": {"uv": [9, 0, 13, 1.5], "texture": "#3"},
"west": {"uv": [12.5, 0, 13, 0.5], "texture": "#3"},
"up": {"uv": [9, 0, 13, 1.5], "rotation": 180, "texture": "#3"},
"down": {"uv": [9, 0, 13, 1.5], "texture": "#3"}
}
},
{
"from": [6, 7, 1],
"to": [10, 11, 5],
"faces": {
"east": {"uv": [4, 8, 8, 12], "texture": "#0"},
"south": {"uv": [5, 10, 9, 14], "texture": "#2"},
"west": {"uv": [8, 8, 12, 12], "texture": "#0"},
"down": {"uv": [5, 10, 9, 14], "texture": "#2"}
}
},
{
"from": [7.5, 5, 1],
"to": [8.5, 11, 7],
"faces": {
"east": {"uv": [2, 8, 8, 14], "texture": "#0"},
"south": {"uv": [13, 8, 14, 14], "texture": "#0"},
"west": {"uv": [8, 8, 14, 14], "texture": "#0"},
"down": {"uv": [13, 4, 14, 10], "texture": "#0"}
}
},
{
"from": [0.9, 11, 1],
"to": [15.1, 13, 15],
"faces": {
"north": {"uv": [1, 14, 15, 16], "texture": "#4"},
"east": {"uv": [1, 14, 15, 16], "texture": "#4"},
"south": {"uv": [1, 14, 15, 16], "texture": "#4"},
"west": {"uv": [1, 14, 15, 16], "texture": "#4"},
"up": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#4"},
"down": {"uv": [1, 1, 15, 15], "texture": "#5"}
}
},
{
"from": [7, 2, 1],
"to": [9, 11, 2],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"east": {"uv": [3, 0, 4, 9], "texture": "#2"},
"south": {"uv": [3, 0, 5, 9], "texture": "#2"},
"west": {"uv": [3, 0, 4, 9], "texture": "#2"},
"down": {"uv": [3, 0, 5, 1], "texture": "#2"}
}
},
{
"from": [7, 2, 0],
"to": [9, 11, 2],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"north": {"uv": [3, 0, 5, 9], "texture": "#2"},
"east": {"uv": [3, 0, 5, 9], "texture": "#2"},
"south": {"uv": [3, 0, 5, 9], "texture": "#2"},
"west": {"uv": [3, 0, 5, 9], "texture": "#2"},
"up": {"uv": [0, 0, 2, 2], "texture": "#2"},
"down": {"uv": [3, 0, 5, 2], "texture": "#2"}
}
},
{
"from": [7, 2, 0],
"to": [9, 11, 2],
"rotation": {"angle": -45, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"north": {"uv": [3, 0, 5, 9], "texture": "#2"},
"east": {"uv": [3, 0, 5, 9], "texture": "#2"},
"south": {"uv": [3, 0, 5, 9], "texture": "#2"},
"west": {"uv": [3, 0, 5, 9], "texture": "#2"},
"up": {"uv": [0, 0, 2, 2], "texture": "#2"},
"down": {"uv": [3, 0, 5, 2], "texture": "#2"}
}
},
{
"from": [7, 10, 1],
"to": [9, 12, 10],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"north": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 0, 5, 9], "rotation": 90, "texture": "#2"},
"south": {"uv": [3, 0, 5, 2], "texture": "#2"},
"west": {"uv": [3, 0, 5, 9], "rotation": 270, "texture": "#2"},
"up": {"uv": [3, 0, 5, 9], "texture": "#2"},
"down": {"uv": [3, 0, 5, 9], "rotation": 180, "texture": "#2"}
}
},
{
"from": [7, 10, 1],
"to": [9, 11, 10],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"east": {"uv": [3, 0, 4, 9], "rotation": 90, "texture": "#2"},
"south": {"uv": [3, 0, 5, 1], "texture": "#2"},
"west": {"uv": [3, 0, 4, 9], "rotation": 270, "texture": "#2"},
"up": {"uv": [0, 0, 2, 9], "texture": "#2"},
"down": {"uv": [3, 0, 5, 9], "rotation": 180, "texture": "#2"}
}
},
{
"from": [0, 2, 14],
"to": [16, 11, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [0, 10.5, 8, 15], "texture": "#3"},
"east": {"uv": [0, 10.5, 1, 15], "texture": "#3"},
"south": {"uv": [0, 10.5, 8, 15], "texture": "#3"},
"west": {"uv": [7, 10.5, 8, 15], "texture": "#3"},
"up": {"uv": [0, 7, 8, 8], "texture": "#3"}
}
},
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [0, 15, 8, 16], "texture": "#3"},
"east": {"uv": [0, 15, 8, 16], "texture": "#3"},
"south": {"uv": [0, 15, 8, 16], "texture": "#3"},
"west": {"uv": [0, 15, 8, 16], "texture": "#3"},
"up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#7"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#7"}
}
},
{
"from": [1, 2, 2],
"to": [15, 11, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"east": {"uv": [9, 2.5, 15, 7], "texture": "#3"},
"west": {"uv": [9, 2.5, 15, 7], "texture": "#3"},
"up": {"uv": [0.5, 1, 7.5, 7], "texture": "#3"}
}
},
{
"from": [12, 11, 5],
"to": [15, 12, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [6, 2, 7.5, 2.5], "rotation": 180, "texture": "#3"},
"east": {"uv": [10.5, 2, 13.5, 2.5], "texture": "#3"},
"south": {"uv": [6, 5.5, 7.5, 6], "texture": "#3"},
"west": {"uv": [6, 2.5, 6.5, 5.5], "rotation": 90, "texture": "#3"},
"up": {"uv": [6, 2.5, 7.5, 5.5], "texture": "#3"}
}
},
{
"from": [1, 11, 5],
"to": [4, 12, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [6, 5.5, 7.5, 6], "texture": "#3"},
"east": {"uv": [6, 2.5, 6.5, 5.5], "rotation": 90, "texture": "#3"},
"south": {"uv": [6, 2, 7.5, 2.5], "rotation": 180, "texture": "#3"},
"west": {"uv": [10.5, 2, 13.5, 2.5], "texture": "#3"},
"up": {"uv": [6, 2.5, 7.5, 5.5], "rotation": 180, "texture": "#3"}
}
},
{
"from": [0, 2, 0],
"to": [16, 11, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [8, 10.5, 16, 15], "texture": "#3"},
"east": {"uv": [7, 10.5, 8, 15], "texture": "#3"},
"south": {"uv": [0, 10.5, 8, 15], "texture": "#3"},
"west": {"uv": [0, 10.5, 1, 15], "texture": "#3"},
"up": {"uv": [0, 0, 8, 1], "texture": "#3"}
}
},
{
"from": [12, 9.5, -0.5],
"to": [14, 12.5, 2.5],
"faces": {
"north": {"uv": [8, 0, 9, 1.5], "texture": "#3"},
"east": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"south": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"west": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"up": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"down": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"}
}
},
{
"from": [2, 9.5, -0.5],
"to": [4, 12.5, 2.5],
"faces": {
"north": {"uv": [8, 0, 9, 1.5], "texture": "#3"},
"east": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"south": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"west": {"uv": [14, 0, 15.5, 1.5], "texture": "#3"},
"up": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"},
"down": {"uv": [8, 0, 9, 1.5], "rotation": 180, "texture": "#3"}
}
}
],
"groups": [
{
"name": "Axle",
"origin": [0, 0, 0],
"children": [0]
},
{
"name": "Panel",
"origin": [0, 0, 0],
"children": [1, 2, 3, 4, 5, 6, 7, 8, 9]
},
{
"name": "casing",
"origin": [0, 0, 0],
"children": [10, 11, 12, 13, 14, 15, 16, 17]
}
]
}

View file

@ -0,0 +1,126 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "block/stripped_spruce_log_top",
"2": "block/stripped_spruce_log",
"3": "create:block/weighted_ejector_casing",
"4": "create:block/weighted_ejector_top",
"5": "create:block/weighted_ejector_inner",
"particle": "create:block/weighted_ejector_top"
},
"elements": [
{
"from": [4, 9.5, -0.5],
"to": [12, 12.5, 2.5],
"faces": {
"north": {"uv": [9, 0, 13, 1.5], "texture": "#3"},
"east": {"uv": [12.5, 0, 13, 0.5], "texture": "#3"},
"south": {"uv": [9, 0, 13, 1.5], "texture": "#3"},
"west": {"uv": [12.5, 0, 13, 0.5], "texture": "#3"},
"up": {"uv": [9, 0, 13, 1.5], "rotation": 180, "texture": "#3"},
"down": {"uv": [9, 0, 13, 1.5], "texture": "#3"}
}
},
{
"from": [6, 7, 1],
"to": [10, 11, 5],
"faces": {
"east": {"uv": [4, 8, 8, 12], "texture": "#0"},
"south": {"uv": [5, 10, 9, 14], "texture": "#2"},
"west": {"uv": [8, 8, 12, 12], "texture": "#0"},
"down": {"uv": [5, 10, 9, 14], "texture": "#2"}
}
},
{
"from": [7.5, 5, 1],
"to": [8.5, 11, 7],
"faces": {
"east": {"uv": [2, 8, 8, 14], "texture": "#0"},
"south": {"uv": [13, 8, 14, 14], "texture": "#0"},
"west": {"uv": [8, 8, 14, 14], "texture": "#0"},
"down": {"uv": [13, 4, 14, 10], "texture": "#0"}
}
},
{
"from": [0.9, 11, 1],
"to": [15.1, 13, 15],
"faces": {
"north": {"uv": [1, 14, 15, 16], "texture": "#4"},
"east": {"uv": [1, 14, 15, 16], "texture": "#4"},
"south": {"uv": [1, 14, 15, 16], "texture": "#4"},
"west": {"uv": [1, 14, 15, 16], "texture": "#4"},
"up": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#4"},
"down": {"uv": [1, 1, 15, 15], "texture": "#5"}
}
},
{
"from": [7, 2, 1],
"to": [9, 11, 2],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"east": {"uv": [3, 0, 4, 9], "texture": "#2"},
"south": {"uv": [3, 0, 5, 9], "texture": "#2"},
"west": {"uv": [3, 0, 4, 9], "texture": "#2"},
"down": {"uv": [3, 0, 5, 1], "texture": "#2"}
}
},
{
"from": [7, 2, 0],
"to": [9, 11, 2],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"north": {"uv": [3, 0, 5, 9], "texture": "#2"},
"east": {"uv": [3, 0, 5, 9], "texture": "#2"},
"south": {"uv": [3, 0, 5, 9], "texture": "#2"},
"west": {"uv": [3, 0, 5, 9], "texture": "#2"},
"up": {"uv": [0, 0, 2, 2], "texture": "#2"},
"down": {"uv": [3, 0, 5, 2], "texture": "#2"}
}
},
{
"from": [7, 2, 0],
"to": [9, 11, 2],
"rotation": {"angle": -45, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"north": {"uv": [3, 0, 5, 9], "texture": "#2"},
"east": {"uv": [3, 0, 5, 9], "texture": "#2"},
"south": {"uv": [3, 0, 5, 9], "texture": "#2"},
"west": {"uv": [3, 0, 5, 9], "texture": "#2"},
"up": {"uv": [0, 0, 2, 2], "texture": "#2"},
"down": {"uv": [3, 0, 5, 2], "texture": "#2"}
}
},
{
"from": [7, 10, 1],
"to": [9, 12, 10],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"north": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 0, 5, 9], "rotation": 90, "texture": "#2"},
"south": {"uv": [3, 0, 5, 2], "texture": "#2"},
"west": {"uv": [3, 0, 5, 9], "rotation": 270, "texture": "#2"},
"up": {"uv": [3, 0, 5, 9], "texture": "#2"},
"down": {"uv": [3, 0, 5, 9], "rotation": 180, "texture": "#2"}
}
},
{
"from": [7, 10, 1],
"to": [9, 11, 10],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 1]},
"faces": {
"east": {"uv": [3, 0, 4, 9], "rotation": 90, "texture": "#2"},
"south": {"uv": [3, 0, 5, 1], "texture": "#2"},
"west": {"uv": [3, 0, 4, 9], "rotation": 270, "texture": "#2"},
"up": {"uv": [0, 0, 2, 9], "texture": "#2"},
"down": {"uv": [3, 0, 5, 9], "rotation": 180, "texture": "#2"}
}
}
],
"groups": [
{
"name": "Panel",
"origin": [0, 0, 0],
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8]
}
]
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B