Merge & Port

This commit is contained in:
grimmauld 2021-03-26 16:03:09 +01:00
commit 35c62360be
120 changed files with 13385 additions and 10710 deletions

View file

@ -141,13 +141,8 @@ fc652317e03b57c76e23a805da16a28d15254029 assets/create/blockstates/fancy_scoria_
5864daf839e54789a0dc8a44505f070bf3e184bc assets/create/blockstates/fancy_weathered_limestone_bricks.json 5864daf839e54789a0dc8a44505f070bf3e184bc assets/create/blockstates/fancy_weathered_limestone_bricks.json
fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json
b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json
<<<<<<< HEAD
8e532856c3c2b4e4e59c65a2a81a694e35d14658 assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json 8e532856c3c2b4e4e59c65a2a81a694e35d14658 assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json
65f5fa4b779af5150993b20174404ec93bfc4303 assets/create/blockstates/fluid_pipe.json 65f5fa4b779af5150993b20174404ec93bfc4303 assets/create/blockstates/fluid_pipe.json
=======
6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json
37bc041b7449dc4d7962225e606125ba1b188974 assets/create/blockstates/fluid_pipe.json
>>>>>>> mc1.15/dev
f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json
5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json
e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json
@ -344,7 +339,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json 4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
@ -400,6 +395,7 @@ fd7a9c7095372485081436c91489cadb2b0c514e assets/create/blockstates/weathered_lim
47f8c91ff4c3f5cad782ab469a1fe5f4909dc7f1 assets/create/blockstates/weathered_limestone_cobblestone_stairs.json 47f8c91ff4c3f5cad782ab469a1fe5f4909dc7f1 assets/create/blockstates/weathered_limestone_cobblestone_stairs.json
dfa5662bfd5a70bcd87673b1c40bf9106d5e2365 assets/create/blockstates/weathered_limestone_cobblestone_wall.json dfa5662bfd5a70bcd87673b1c40bf9106d5e2365 assets/create/blockstates/weathered_limestone_cobblestone_wall.json
c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_limestone_pillar.json c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_limestone_pillar.json
c838c0792511ca2e14493b40032bb1370fac588a assets/create/blockstates/weighted_ejector.json
512bf17c9ea309b1f7da54440f923530d25e467c assets/create/blockstates/white_sail.json 512bf17c9ea309b1f7da54440f923530d25e467c assets/create/blockstates/white_sail.json
4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json 4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json
89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json 89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json
@ -410,49 +406,26 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
<<<<<<< HEAD 768a724d6c921cb92790364cf7a692fe8742a885 assets/create/lang/en_ud.json
ff55f756f4bf71c142540d1a415a8dbbae86850e assets/create/lang/en_ud.json 74c0dd6af2ffc332fe1459f9c3fbfc9371eb2507 assets/create/lang/en_us.json
eb8e279de2f546a4e285605f2040b4d69a973567 assets/create/lang/en_us.json 97f7b6e61707a003e907ee166911ca106f0439d6 assets/create/lang/unfinished/de_de.json
75e1aaf752e50a00b9a70769c7e301844e0e091c assets/create/lang/unfinished/de_de.json aa49b660299817b148b362f9f5c357906de8df90 assets/create/lang/unfinished/es_es.json
ae95f4681d133fb86a60e793d3404a102d9149e0 assets/create/lang/unfinished/es_es.json 072cb64aac3feba48a2ca7e481cda325d7648b0f assets/create/lang/unfinished/es_mx.json
43f027b51015c1f9bf2c8d469e13681fccbc8a20 assets/create/lang/unfinished/es_mx.json 5463fcf22674ed540ce860358508fbac609c49d1 assets/create/lang/unfinished/fr_fr.json
7a2734f847e97639e3f94b4708c7c99cb4aeaf11 assets/create/lang/unfinished/fr_fr.json 7fbd50f2325711f3a2fd086d8307ff1afb577220 assets/create/lang/unfinished/it_it.json
9ba748cc93d37cd208652d3be8478fa93900eaac assets/create/lang/unfinished/it_it.json ff653860335529694629c7cabb7953afebc6fea3 assets/create/lang/unfinished/ja_jp.json
67d2bdddb3d254869ba13d9fd0b3a3e1ad2d32bb assets/create/lang/unfinished/ja_jp.json 332556b3f5364601e872431fab0fe3cdf40ac373 assets/create/lang/unfinished/ko_kr.json
fa8f962549fa9d9b47a3e1689bbffd4a2d52eeee assets/create/lang/unfinished/ko_kr.json cc8e5eb4c2ea1390a215d12462d54f761e076c64 assets/create/lang/unfinished/nl_nl.json
fb749708f8a5650ab98453634cf8b1954d7885ca assets/create/lang/unfinished/nl_nl.json 88fd1b02799e8d1392be7df529803321e334033d assets/create/lang/unfinished/pt_br.json
fbc5eefc388254be16d61e7eb86c8390336f8bc4 assets/create/lang/unfinished/pt_br.json f58b4e50ef5042aad6b254db7ff8c219f06b9ea3 assets/create/lang/unfinished/ru_ru.json
73b54db6545c6a3ea4a19ce7ad9214fa355b6802 assets/create/lang/unfinished/ru_ru.json e9e4cfbc8ef54b6c04ae77c776dfa7e546d05e02 assets/create/lang/unfinished/zh_cn.json
61928552f6b8c620db6737ca82920a875cda9a6e assets/create/lang/unfinished/zh_cn.json eb17617bb14d0ffac000f86d6f9aa23429e8f4c3 assets/create/lang/unfinished/zh_tw.json
8763f2214c14ed23b109343c69b0269a815e44e0 assets/create/lang/unfinished/zh_tw.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json
1358ff546e99004444fccca5355853d1738ef191 assets/create/models/block/acacia_window_pane_post.json 1358ff546e99004444fccca5355853d1738ef191 assets/create/models/block/acacia_window_pane_post.json
bd33b944ec6ad89850a1d275b3d2843fe6f831cc assets/create/models/block/acacia_window_pane_side.json bd33b944ec6ad89850a1d275b3d2843fe6f831cc assets/create/models/block/acacia_window_pane_side.json
b272035cd746364a0bd3bf13061f51190e9b46d6 assets/create/models/block/acacia_window_pane_side_alt.json b272035cd746364a0bd3bf13061f51190e9b46d6 assets/create/models/block/acacia_window_pane_side_alt.json
=======
2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json
3522bc1dd15fd219aaf506766fb96be5f65b1939 assets/create/lang/en_us.json
d389c171d3d6a7382fb5b2e80b14e9bee53d8179 assets/create/lang/unfinished/de_de.json
b3caab7bb37be53ea93895cbaae2081452cd095e assets/create/lang/unfinished/es_es.json
0039068794faea032b0a39c954f142e2c8e4dfc1 assets/create/lang/unfinished/es_mx.json
1e34083359caea11cf9fdbb3f04a5881ea62a55e assets/create/lang/unfinished/fr_fr.json
c9abd10d296055f56877317a5c7dee14d0e33bf5 assets/create/lang/unfinished/it_it.json
83298d57034c2bb54924dff2d9b5257502ac3b9a assets/create/lang/unfinished/ja_jp.json
2c0e5fbfc813949d973e9f95af9501ed65b80b82 assets/create/lang/unfinished/ko_kr.json
4b3b113e5f9351b741974bc18d13d9d648d38f91 assets/create/lang/unfinished/nl_nl.json
9bddfffdf5349353d37d7003546c94799c6e812d assets/create/lang/unfinished/pt_br.json
5119b6690e8faa7e25450674caebf3c9c53fd54b assets/create/lang/unfinished/ru_ru.json
f11eb922b49753b60894f0dfe8baabe004d13e05 assets/create/lang/unfinished/zh_cn.json
017a9c9cc6f4538c8c497097cbd59f590b4af160 assets/create/lang/unfinished/zh_tw.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json
7d23c8e4543108f5f53b78ccb4908f7a5bb76c54 assets/create/models/block/acacia_window_pane_post.json
3bdcc6bd616a179ffc22e66307aab538e9bcb75f assets/create/models/block/acacia_window_pane_side.json
7b5b6809e3ef685a497ba15b549d3918aeb6c135 assets/create/models/block/acacia_window_pane_side_alt.json
>>>>>>> mc1.15/dev
8e1e834bab1c09591006a063216e93c832503852 assets/create/models/block/adjustable_chain_gearshift_end_horizontal.json 8e1e834bab1c09591006a063216e93c832503852 assets/create/models/block/adjustable_chain_gearshift_end_horizontal.json
5d3d8b3989b087a5e9177951e9246f27a1838e84 assets/create/models/block/adjustable_chain_gearshift_end_horizontal_powered.json 5d3d8b3989b087a5e9177951e9246f27a1838e84 assets/create/models/block/adjustable_chain_gearshift_end_horizontal_powered.json
0ae6c67468b448f2f05c06f41bb162fafd86846a assets/create/models/block/adjustable_chain_gearshift_end_vertical.json 0ae6c67468b448f2f05c06f41bb162fafd86846a assets/create/models/block/adjustable_chain_gearshift_end_vertical.json
@ -1660,6 +1633,7 @@ f2cd30c585a25e336868ee4f8dd80799ecb986c6 assets/create/models/item/weathered_lim
3d26cb5616182ba6926d0bf703119ebfbeacbe31 assets/create/models/item/weathered_limestone_cobblestone_stairs.json 3d26cb5616182ba6926d0bf703119ebfbeacbe31 assets/create/models/item/weathered_limestone_cobblestone_stairs.json
ea1d735b557a71bbb2b35e5f03ba571d54c38dbe assets/create/models/item/weathered_limestone_cobblestone_wall.json ea1d735b557a71bbb2b35e5f03ba571d54c38dbe assets/create/models/item/weathered_limestone_cobblestone_wall.json
40bed7f5e9e97da45c5d9cebc3fcf87b2b13a808 assets/create/models/item/weathered_limestone_pillar.json 40bed7f5e9e97da45c5d9cebc3fcf87b2b13a808 assets/create/models/item/weathered_limestone_pillar.json
c36834070e12d25cd9e818d0d0181e267584b483 assets/create/models/item/weighted_ejector.json
30c449f637e8d56b7670b81ec2a90942e2972739 assets/create/models/item/wheat_flour.json 30c449f637e8d56b7670b81ec2a90942e2972739 assets/create/models/item/wheat_flour.json
9502a51ed2f6a110b6d41731a5948be4d70c8af8 assets/create/models/item/whisk.json 9502a51ed2f6a110b6d41731a5948be4d70c8af8 assets/create/models/item/whisk.json
c6253e0f8db3c3992d3f78fe5045e276d39d5b22 assets/create/models/item/white_sail.json c6253e0f8db3c3992d3f78fe5045e276d39d5b22 assets/create/models/item/white_sail.json
@ -1921,6 +1895,7 @@ f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create
07ec7b627bdb049f52dddcce021cec0ad44b0049 data/create/advancements/recipes/create.base/crafting/kinetics/turntable.json 07ec7b627bdb049f52dddcce021cec0ad44b0049 data/create/advancements/recipes/create.base/crafting/kinetics/turntable.json
89401c0a6dffa62dbffdbb63986f580a4878402e data/create/advancements/recipes/create.base/crafting/kinetics/vertical_gearboxfrom_conversion.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 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 7c146cc51139c2a8e287a60c8d645fa6f6f48cb1 data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json
f876dcbd2877c921613a4af481c89d66664c1ea8 data/create/advancements/recipes/create.base/crafting/kinetics/white_sail.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 37e545b016a7c5cd283168ac71ace6467a5ad3ef data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json
@ -2792,6 +2767,7 @@ c2a62f12680d04ed4f586c501bb026e367243dd2 data/create/loot_tables/blocks/weathere
a89f425c47c3831071b556697169a3124370aed7 data/create/loot_tables/blocks/weathered_limestone_cobblestone_stairs.json a89f425c47c3831071b556697169a3124370aed7 data/create/loot_tables/blocks/weathered_limestone_cobblestone_stairs.json
e8f3af61d9a2fd1ff5b32c9bb474ed005e6d70c4 data/create/loot_tables/blocks/weathered_limestone_cobblestone_wall.json e8f3af61d9a2fd1ff5b32c9bb474ed005e6d70c4 data/create/loot_tables/blocks/weathered_limestone_cobblestone_wall.json
54358a64639957cc66ffa5296ff45723f7adf00e data/create/loot_tables/blocks/weathered_limestone_pillar.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 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/white_sail.json
969eda31556feb5a68e350762848d17453275fee data/create/loot_tables/blocks/white_seat.json 969eda31556feb5a68e350762848d17453275fee data/create/loot_tables/blocks/white_seat.json
79fe374f8e677088f928a3a49ff5eeed6128d165 data/create/loot_tables/blocks/white_valve_handle.json 79fe374f8e677088f928a3a49ff5eeed6128d165 data/create/loot_tables/blocks/white_valve_handle.json
@ -2994,6 +2970,7 @@ af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/s
8494f5fcd85a740fa0f0384e3522d8cdd905ce49 data/create/recipes/crafting/kinetics/turntable.json 8494f5fcd85a740fa0f0384e3522d8cdd905ce49 data/create/recipes/crafting/kinetics/turntable.json
057c889b0a306f44b8835c896663154ccd9ff12f data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json 057c889b0a306f44b8835c896663154ccd9ff12f data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json
4fb009b86a51b2e259bd1f73848803f6276dd820 data/create/recipes/crafting/kinetics/water_wheel.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 f508d510576c93712e7f5265345a32e8818bbf0d data/create/recipes/crafting/kinetics/whisk.json
d80a741d2f0d4f742217b43d7e4d37f003ec9f9d data/create/recipes/crafting/kinetics/white_sail.json d80a741d2f0d4f742217b43d7e4d37f003ec9f9d data/create/recipes/crafting/kinetics/white_sail.json
f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_seat.json f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_seat.json

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

@ -396,6 +396,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_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_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.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_sail": "\u05DF\u0131\u0250S \u01DD\u0287\u0131\u0265M",
"block.create.white_seat": "\u0287\u0250\u01DDS \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", "block.create.white_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u0287\u0131\u0265M",

View file

@ -399,6 +399,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_stairs": "Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_cobblestone_wall": "Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Weathered Limestone Pillar", "block.create.weathered_limestone_pillar": "Weathered Limestone Pillar",
"block.create.weighted_ejector": "Weighted Ejector",
"block.create.white_sail": "White Sail", "block.create.white_sail": "White Sail",
"block.create.white_seat": "White Seat", "block.create.white_seat": "White Seat",
"block.create.white_valve_handle": "White Valve Handle", "block.create.white_valve_handle": "White Valve Handle",
@ -1026,6 +1027,10 @@
"create.item_attributes.added_by.inverted": "was not added by %1$s", "create.item_attributes.added_by.inverted": "was not added by %1$s",
"create.item_attributes.has_enchant": "is enchanted with %1$s", "create.item_attributes.has_enchant": "is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s",
"create.item_attributes.color": "is dyed %1$s",
"create.item_attributes.color.inverted": "is not dyed %1$s",
"create.item_attributes.max_enchanted": "is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "is not enchanted at max level",
"create.item_attributes.has_fluid": "contains %1$s", "create.item_attributes.has_fluid": "contains %1$s",
"create.item_attributes.has_fluid.inverted": "does not contain %1$s", "create.item_attributes.has_fluid.inverted": "does not contain %1$s",
"create.item_attributes.has_name": "has the custom name %1$s", "create.item_attributes.has_name": "has the custom name %1$s",
@ -1087,6 +1092,12 @@
"create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(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.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.logistics.when_multiple_outputs_available": "When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "Round Robin", "create.mechanical_arm.selection_mode.round_robin": "Round Robin",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1504", "_": "Missing Localizations: 1514",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -7,8 +7,8 @@
"block.create.acacia_window_pane": "Akazienholzfensterscheibe", "block.create.acacia_window_pane": "Akazienholzfensterscheibe",
"block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe", "block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe",
"block.create.adjustable_crate": "Verstellbare Kiste", "block.create.adjustable_crate": "Verstellbare Kiste",
"block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker", "block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker",
"block.create.adjustable_repeater": "Verstellbarer Verstärker", "block.create.adjustable_repeater": "Verstellbarer Verstärker",
"block.create.analog_lever": "Analoger Schalter", "block.create.analog_lever": "Analoger Schalter",
"block.create.andesite_belt_funnel": "Riementrichter aus Andesit", "block.create.andesite_belt_funnel": "Riementrichter aus Andesit",
"block.create.andesite_bricks": "Andesitziegel", "block.create.andesite_bricks": "Andesitziegel",
@ -22,9 +22,9 @@
"block.create.andesite_cobblestone_wall": "Andesitbruchsteinmauer", "block.create.andesite_cobblestone_wall": "Andesitbruchsteinmauer",
"block.create.andesite_encased_shaft": "Andesitummantelte Welle", "block.create.andesite_encased_shaft": "Andesitummantelte Welle",
"block.create.andesite_funnel": "Andesit Trichter", "block.create.andesite_funnel": "Andesit Trichter",
"block.create.andesite_pillar": "Andesitsäule", "block.create.andesite_pillar": "Andesitsäule",
"block.create.andesite_tunnel": "Andesittunnel", "block.create.andesite_tunnel": "Andesittunnel",
"block.create.basin": "Behälter", "block.create.basin": "Behälter",
"block.create.belt": "Mechanischer Riemen", "block.create.belt": "Mechanischer Riemen",
"block.create.birch_window": "Birkenholzfenster", "block.create.birch_window": "Birkenholzfenster",
"block.create.birch_window_pane": "Birkenholzfensterscheibe", "block.create.birch_window_pane": "Birkenholzfensterscheibe",
@ -45,12 +45,12 @@
"block.create.brown_seat": "Brauner Sitz", "block.create.brown_seat": "Brauner Sitz",
"block.create.brown_valve_handle": "Brauner Ventilgriff", "block.create.brown_valve_handle": "Brauner Ventilgriff",
"block.create.cart_assembler": "Lohrenmonteur", "block.create.cart_assembler": "Lohrenmonteur",
"block.create.chiseled_dark_scoria": "Gemeißelte dunkle Schlacke", "block.create.chiseled_dark_scoria": "Gemeißelte dunkle Schlacke",
"block.create.chiseled_dolomite": "Gemeißeltes Dolomit", "block.create.chiseled_dolomite": "Gemeißeltes Dolomit",
"block.create.chiseled_gabbro": "Gemeißeltes Gabbro", "block.create.chiseled_gabbro": "Gemeißeltes Gabbro",
"block.create.chiseled_limestone": "Gemeißelter Kalkstein", "block.create.chiseled_limestone": "Gemeißelter Kalkstein",
"block.create.chiseled_scoria": "Gemeißelte Schlacke", "block.create.chiseled_scoria": "Gemeißelte Schlacke",
"block.create.chiseled_weathered_limestone": "Gemeißelter verwitterter Kalkstein", "block.create.chiseled_weathered_limestone": "Gemeißelter verwitterter Kalkstein",
"block.create.chocolate": "Schokolade", "block.create.chocolate": "Schokolade",
"block.create.chute": "Rinne", "block.create.chute": "Rinne",
"block.create.clockwork_bearing": "Uhrwerk-Lager", "block.create.clockwork_bearing": "Uhrwerk-Lager",
@ -65,16 +65,16 @@
"block.create.copper_tiles": "Kupferfliesen", "block.create.copper_tiles": "Kupferfliesen",
"block.create.copper_valve_handle": "Kupfer Ventilgriff", "block.create.copper_valve_handle": "Kupfer Ventilgriff",
"block.create.creative_crate": "Kreative anpassbare Kiste", "block.create.creative_crate": "Kreative anpassbare Kiste",
"block.create.creative_fluid_tank": "Kreativer Flüssigkeitstank", "block.create.creative_fluid_tank": "Kreativer Flüssigkeitstank",
"block.create.creative_motor": "Kreativer Motor", "block.create.creative_motor": "Kreativer Motor",
"block.create.crimson_window": "UNLOCALIZED: Crimson Window", "block.create.crimson_window": "UNLOCALIZED: Crimson Window",
"block.create.crimson_window_pane": "UNLOCALIZED: Crimson Window Pane", "block.create.crimson_window_pane": "UNLOCALIZED: Crimson Window Pane",
"block.create.crushing_wheel": "Mahlwerkrad", "block.create.crushing_wheel": "Mahlwerkrad",
"block.create.crushing_wheel_controller": "Mahlwerkrad Steurung", "block.create.crushing_wheel_controller": "Mahlwerkrad Steurung",
"block.create.cuckoo_clock": "Kuckucksuhr", "block.create.cuckoo_clock": "Kuckucksuhr",
"block.create.cyan_sail": "Türkises Segel", "block.create.cyan_sail": "Türkises Segel",
"block.create.cyan_seat": "Türkiser Sitz", "block.create.cyan_seat": "Türkiser Sitz",
"block.create.cyan_valve_handle": "Türkiser Ventilgriff", "block.create.cyan_valve_handle": "Türkiser Ventilgriff",
"block.create.dark_oak_window": "Schwarzeichenholzfenster", "block.create.dark_oak_window": "Schwarzeichenholzfenster",
"block.create.dark_oak_window_pane": "Schwarzeichenholzfensterscheibe", "block.create.dark_oak_window_pane": "Schwarzeichenholzfensterscheibe",
"block.create.dark_scoria": "Dunkle Schlacke", "block.create.dark_scoria": "Dunkle Schlacke",
@ -86,8 +86,8 @@
"block.create.dark_scoria_cobblestone_slab": "Dunkle Schlackebruchsteinstufe", "block.create.dark_scoria_cobblestone_slab": "Dunkle Schlackebruchsteinstufe",
"block.create.dark_scoria_cobblestone_stairs": "Dunkle Schlackebruchsteintreppe", "block.create.dark_scoria_cobblestone_stairs": "Dunkle Schlackebruchsteintreppe",
"block.create.dark_scoria_cobblestone_wall": "Dunkle Schlackebruchsteinmauer", "block.create.dark_scoria_cobblestone_wall": "Dunkle Schlackebruchsteinmauer",
"block.create.dark_scoria_pillar": "Dunkle Schlackesäule", "block.create.dark_scoria_pillar": "Dunkle Schlackesäule",
"block.create.deployer": "Einsatzgerät", "block.create.deployer": "Einsatzgerät",
"block.create.depot": "Depot", "block.create.depot": "Depot",
"block.create.diorite_bricks": "Dioritziegel", "block.create.diorite_bricks": "Dioritziegel",
"block.create.diorite_bricks_slab": "Dioritziegelstufe", "block.create.diorite_bricks_slab": "Dioritziegelstufe",
@ -97,7 +97,7 @@
"block.create.diorite_cobblestone_slab": "Dioritbruchsteinstufe", "block.create.diorite_cobblestone_slab": "Dioritbruchsteinstufe",
"block.create.diorite_cobblestone_stairs": "Dioritbruchsteintreppe", "block.create.diorite_cobblestone_stairs": "Dioritbruchsteintreppe",
"block.create.diorite_cobblestone_wall": "Dioritbruchsteinmauer", "block.create.diorite_cobblestone_wall": "Dioritbruchsteinmauer",
"block.create.diorite_pillar": "Dioritsäule", "block.create.diorite_pillar": "Dioritsäule",
"block.create.dolomite": "Dolomit", "block.create.dolomite": "Dolomit",
"block.create.dolomite_bricks": "Dolomitziegel", "block.create.dolomite_bricks": "Dolomitziegel",
"block.create.dolomite_bricks_slab": "Dolomitziegelstufe", "block.create.dolomite_bricks_slab": "Dolomitziegelstufe",
@ -107,9 +107,9 @@
"block.create.dolomite_cobblestone_slab": "Dolomitbruchsteinstufe", "block.create.dolomite_cobblestone_slab": "Dolomitbruchsteinstufe",
"block.create.dolomite_cobblestone_stairs": "Dolomitbruchsteintreppe", "block.create.dolomite_cobblestone_stairs": "Dolomitbruchsteintreppe",
"block.create.dolomite_cobblestone_wall": "Dolomitbruchsteinmauer", "block.create.dolomite_cobblestone_wall": "Dolomitbruchsteinmauer",
"block.create.dolomite_pillar": "Dolomitsäule", "block.create.dolomite_pillar": "Dolomitsäule",
"block.create.encased_chain_drive": "Ummantelter Kettenriemen", "block.create.encased_chain_drive": "Ummantelter Kettenriemen",
"block.create.encased_fan": "Ummantelter Lüfter", "block.create.encased_fan": "Ummantelter Lüfter",
"block.create.encased_fluid_pipe": "Ummanteltes Rohr", "block.create.encased_fluid_pipe": "Ummanteltes Rohr",
"block.create.fancy_andesite_bricks": "Schicke Andesitziegel", "block.create.fancy_andesite_bricks": "Schicke Andesitziegel",
"block.create.fancy_andesite_bricks_slab": "Schicke Andesitziegelstufe", "block.create.fancy_andesite_bricks_slab": "Schicke Andesitziegelstufe",
@ -119,37 +119,37 @@
"block.create.fancy_dark_scoria_bricks_slab": "Schicke dunkle Schlackenziegelstufe", "block.create.fancy_dark_scoria_bricks_slab": "Schicke dunkle Schlackenziegelstufe",
"block.create.fancy_dark_scoria_bricks_stairs": "Schicke dunkle Schlackenziegeltreppe", "block.create.fancy_dark_scoria_bricks_stairs": "Schicke dunkle Schlackenziegeltreppe",
"block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer", "block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer",
"block.create.fancy_diorite_bricks": "Schöne Dioritziegel", "block.create.fancy_diorite_bricks": "Schöne Dioritziegel",
"block.create.fancy_diorite_bricks_slab": "Schöne Dioritziegelstufe", "block.create.fancy_diorite_bricks_slab": "Schöne Dioritziegelstufe",
"block.create.fancy_diorite_bricks_stairs": "Schöne Dioritziegeltreppe", "block.create.fancy_diorite_bricks_stairs": "Schöne Dioritziegeltreppe",
"block.create.fancy_diorite_bricks_wall": "Schöne Dioritziegelmauer", "block.create.fancy_diorite_bricks_wall": "Schöne Dioritziegelmauer",
"block.create.fancy_dolomite_bricks": "Schöne Dolomitziegel", "block.create.fancy_dolomite_bricks": "Schöne Dolomitziegel",
"block.create.fancy_dolomite_bricks_slab": "Schöne Dolomitziegelstufe", "block.create.fancy_dolomite_bricks_slab": "Schöne Dolomitziegelstufe",
"block.create.fancy_dolomite_bricks_stairs": "Schöne Dolomitziegeltreppe", "block.create.fancy_dolomite_bricks_stairs": "Schöne Dolomitziegeltreppe",
"block.create.fancy_dolomite_bricks_wall": "Schöne Dolomitziegelmauer", "block.create.fancy_dolomite_bricks_wall": "Schöne Dolomitziegelmauer",
"block.create.fancy_gabbro_bricks": "Schöne Gabelsteinziegel", "block.create.fancy_gabbro_bricks": "Schöne Gabelsteinziegel",
"block.create.fancy_gabbro_bricks_slab": "Schöne Gabelsteinziegelstufe", "block.create.fancy_gabbro_bricks_slab": "Schöne Gabelsteinziegelstufe",
"block.create.fancy_gabbro_bricks_stairs": "Schöne Gabelsteinziegeltreppe", "block.create.fancy_gabbro_bricks_stairs": "Schöne Gabelsteinziegeltreppe",
"block.create.fancy_gabbro_bricks_wall": "Schöne Gabelsteinziegelmauer", "block.create.fancy_gabbro_bricks_wall": "Schöne Gabelsteinziegelmauer",
"block.create.fancy_granite_bricks": "Schöne Granitziegel", "block.create.fancy_granite_bricks": "Schöne Granitziegel",
"block.create.fancy_granite_bricks_slab": "Schöne Granitziegelstufe", "block.create.fancy_granite_bricks_slab": "Schöne Granitziegelstufe",
"block.create.fancy_granite_bricks_stairs": "Schöne Granitziegeltreppe", "block.create.fancy_granite_bricks_stairs": "Schöne Granitziegeltreppe",
"block.create.fancy_granite_bricks_wall": "Schöne Granitziegelmauer", "block.create.fancy_granite_bricks_wall": "Schöne Granitziegelmauer",
"block.create.fancy_limestone_bricks": "Schöne Kalksteinziegel", "block.create.fancy_limestone_bricks": "Schöne Kalksteinziegel",
"block.create.fancy_limestone_bricks_slab": "Schöne Kalksteinziegelstufe", "block.create.fancy_limestone_bricks_slab": "Schöne Kalksteinziegelstufe",
"block.create.fancy_limestone_bricks_stairs": "Schöne Kalksteinziegeltreppe", "block.create.fancy_limestone_bricks_stairs": "Schöne Kalksteinziegeltreppe",
"block.create.fancy_limestone_bricks_wall": "Schöne Kalksteinziegelmauer", "block.create.fancy_limestone_bricks_wall": "Schöne Kalksteinziegelmauer",
"block.create.fancy_scoria_bricks": "Schöne Schlackenziegel", "block.create.fancy_scoria_bricks": "Schöne Schlackenziegel",
"block.create.fancy_scoria_bricks_slab": "Schöne Schlackenziegelstufe", "block.create.fancy_scoria_bricks_slab": "Schöne Schlackenziegelstufe",
"block.create.fancy_scoria_bricks_stairs": "Schöne Schlackenziegeltreppe", "block.create.fancy_scoria_bricks_stairs": "Schöne Schlackenziegeltreppe",
"block.create.fancy_scoria_bricks_wall": "Schöne Schlackenziegelmauer", "block.create.fancy_scoria_bricks_wall": "Schöne Schlackenziegelmauer",
"block.create.fancy_weathered_limestone_bricks": "Schöne Verwitterte Kalksteinziegel", "block.create.fancy_weathered_limestone_bricks": "Schöne Verwitterte Kalksteinziegel",
"block.create.fancy_weathered_limestone_bricks_slab": "Schöne Verwitterte Kalksteinziegelstufe", "block.create.fancy_weathered_limestone_bricks_slab": "Schöne Verwitterte Kalksteinziegelstufe",
"block.create.fancy_weathered_limestone_bricks_stairs": "Schöne Verwitterte Kalksteinziegeltreppe", "block.create.fancy_weathered_limestone_bricks_stairs": "Schöne Verwitterte Kalksteinziegeltreppe",
"block.create.fancy_weathered_limestone_bricks_wall": "Schöne Verwitterte Kalksteinziegelmauer", "block.create.fancy_weathered_limestone_bricks_wall": "Schöne Verwitterte Kalksteinziegelmauer",
"block.create.fluid_pipe": "Flüssigkeitsrohr", "block.create.fluid_pipe": "Flüssigkeitsrohr",
"block.create.fluid_tank": "Flüssigkeitstank", "block.create.fluid_tank": "Flüssigkeitstank",
"block.create.fluid_valve": "Flüssigkeitsventil", "block.create.fluid_valve": "Flüssigkeitsventil",
"block.create.flywheel": "Schwungrad", "block.create.flywheel": "Schwungrad",
"block.create.framed_glass": "Gerahmtes Glas", "block.create.framed_glass": "Gerahmtes Glas",
"block.create.framed_glass_pane": "Gerahmte Glasscheibe", "block.create.framed_glass_pane": "Gerahmte Glasscheibe",
@ -163,7 +163,7 @@
"block.create.gabbro_cobblestone_slab": "Gabelsteinbruchstein", "block.create.gabbro_cobblestone_slab": "Gabelsteinbruchstein",
"block.create.gabbro_cobblestone_stairs": "Gabelsteinbruchstein", "block.create.gabbro_cobblestone_stairs": "Gabelsteinbruchstein",
"block.create.gabbro_cobblestone_wall": "Gabelsteinbruchstein", "block.create.gabbro_cobblestone_wall": "Gabelsteinbruchstein",
"block.create.gabbro_pillar": "Gabelsteinsäule", "block.create.gabbro_pillar": "Gabelsteinsäule",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Getriebe", "block.create.gearbox": "Getriebe",
@ -177,13 +177,13 @@
"block.create.granite_cobblestone_slab": "Granitbruchsteinstufe", "block.create.granite_cobblestone_slab": "Granitbruchsteinstufe",
"block.create.granite_cobblestone_stairs": "Granitbruchtreppe", "block.create.granite_cobblestone_stairs": "Granitbruchtreppe",
"block.create.granite_cobblestone_wall": "Granitbruchsteinmauer", "block.create.granite_cobblestone_wall": "Granitbruchsteinmauer",
"block.create.granite_pillar": "Granitsäule", "block.create.granite_pillar": "Granitsäule",
"block.create.gray_sail": "Graues Segel", "block.create.gray_sail": "Graues Segel",
"block.create.gray_seat": "Grauer Sitz", "block.create.gray_seat": "Grauer Sitz",
"block.create.gray_valve_handle": "Grauer Ventilgriff", "block.create.gray_valve_handle": "Grauer Ventilgriff",
"block.create.green_sail": "Grünes Segel", "block.create.green_sail": "Grünes Segel",
"block.create.green_seat": "Grüner Sitz", "block.create.green_seat": "Grüner Sitz",
"block.create.green_valve_handle": "Grüner Ventilgriff", "block.create.green_valve_handle": "Grüner Ventilgriff",
"block.create.hand_crank": "Handkurbel", "block.create.hand_crank": "Handkurbel",
"block.create.honey": "Honig", "block.create.honey": "Honig",
"block.create.horizontal_framed_glass": "Horizontal Gerahmes Glas", "block.create.horizontal_framed_glass": "Horizontal Gerahmes Glas",
@ -192,7 +192,7 @@
"block.create.item_drain": "Abfluss", "block.create.item_drain": "Abfluss",
"block.create.jungle_window": "Tropenholzfenster", "block.create.jungle_window": "Tropenholzfenster",
"block.create.jungle_window_pane": "Tropenholzfensterscheib", "block.create.jungle_window_pane": "Tropenholzfensterscheib",
"block.create.large_cogwheel": "Großes Zahnrad", "block.create.large_cogwheel": "Großes Zahnrad",
"block.create.layered_andesite": "Geschichteter Andesit", "block.create.layered_andesite": "Geschichteter Andesit",
"block.create.layered_dark_scoria": "Geschichtete Dunkle Schlacke", "block.create.layered_dark_scoria": "Geschichtete Dunkle Schlacke",
"block.create.layered_diorite": "Geschichteter Diorit", "block.create.layered_diorite": "Geschichteter Diorit",
@ -208,9 +208,9 @@
"block.create.light_gray_sail": "Hellgraues Segel", "block.create.light_gray_sail": "Hellgraues Segel",
"block.create.light_gray_seat": "Hellgrauer Sitz", "block.create.light_gray_seat": "Hellgrauer Sitz",
"block.create.light_gray_valve_handle": "Hellgrauer Ventilgriff", "block.create.light_gray_valve_handle": "Hellgrauer Ventilgriff",
"block.create.lime_sail": "Hellgrünes Segel", "block.create.lime_sail": "Hellgrünes Segel",
"block.create.lime_seat": "Hellgrüner Sitz", "block.create.lime_seat": "Hellgrüner Sitz",
"block.create.lime_valve_handle": "Hellgrüner Ventilgriff", "block.create.lime_valve_handle": "Hellgrüner Ventilgriff",
"block.create.limesand": "Kalksand", "block.create.limesand": "Kalksand",
"block.create.limestone": "Kalkstein", "block.create.limestone": "Kalkstein",
"block.create.limestone_bricks": "Kalksteinziegel", "block.create.limestone_bricks": "Kalksteinziegel",
@ -221,8 +221,8 @@
"block.create.limestone_cobblestone_slab": "Kalkbruchsteinstufe", "block.create.limestone_cobblestone_slab": "Kalkbruchsteinstufe",
"block.create.limestone_cobblestone_stairs": "Kalkbruchsteintreppe", "block.create.limestone_cobblestone_stairs": "Kalkbruchsteintreppe",
"block.create.limestone_cobblestone_wall": "Kalkbruchsteinmauer", "block.create.limestone_cobblestone_wall": "Kalkbruchsteinmauer",
"block.create.limestone_pillar": "Kalksteinsäule", "block.create.limestone_pillar": "Kalksteinsäule",
"block.create.linear_chassis": "Schubgerüst", "block.create.linear_chassis": "Schubgerüst",
"block.create.lit_blaze_burner": "Aktiver Lohenbrenner", "block.create.lit_blaze_burner": "Aktiver Lohenbrenner",
"block.create.magenta_sail": "Magenta Segel", "block.create.magenta_sail": "Magenta Segel",
"block.create.magenta_seat": "Magenta Sitz", "block.create.magenta_seat": "Magenta Sitz",
@ -238,7 +238,7 @@
"block.create.mechanical_plough": "Mechanischer Pflug", "block.create.mechanical_plough": "Mechanischer Pflug",
"block.create.mechanical_press": "Mechanische Presse", "block.create.mechanical_press": "Mechanische Presse",
"block.create.mechanical_pump": "Mechanische Pumpe", "block.create.mechanical_pump": "Mechanische Pumpe",
"block.create.mechanical_saw": "Mechanische Säge", "block.create.mechanical_saw": "Mechanische Säge",
"block.create.metal_bracket": "Metallhalterung", "block.create.metal_bracket": "Metallhalterung",
"block.create.millstone": "Mahlstein", "block.create.millstone": "Mahlstein",
"block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor",
@ -310,7 +310,7 @@
"block.create.pink_sail": "Rosa Segel", "block.create.pink_sail": "Rosa Segel",
"block.create.pink_seat": "Rosa Sitz", "block.create.pink_seat": "Rosa Sitz",
"block.create.pink_valve_handle": "Rosa Ventilgriff", "block.create.pink_valve_handle": "Rosa Ventilgriff",
"block.create.piston_extension_pole": "Kolben-Pleuelverlängerung", "block.create.piston_extension_pole": "Kolben-Pleuelverlängerung",
"block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria",
"block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab",
"block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs",
@ -340,11 +340,11 @@
"block.create.powered_latch": "UNLOCALIZED: Powered Latch", "block.create.powered_latch": "UNLOCALIZED: Powered Latch",
"block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch",
"block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet",
"block.create.pulse_repeater": "Pulsierender Verstärker", "block.create.pulse_repeater": "Pulsierender Verstärker",
"block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_sail": "UNLOCALIZED: Purple Sail",
"block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_seat": "UNLOCALIZED: Purple Seat",
"block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle",
"block.create.radial_chassis": "Drehgerüst", "block.create.radial_chassis": "Drehgerüst",
"block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_sail": "UNLOCALIZED: Red Sail",
"block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_seat": "UNLOCALIZED: Red Seat",
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
@ -399,7 +399,8 @@
"block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab",
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "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_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule", "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_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -466,7 +467,7 @@
"item.create.goggles": "UNLOCALIZED: Engineer's Goggles", "item.create.goggles": "UNLOCALIZED: Engineer's Goggles",
"item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet",
"item.create.handheld_blockzapper": "Blockpistole", "item.create.handheld_blockzapper": "Blockpistole",
"item.create.handheld_worldshaper": "Geländeformer", "item.create.handheld_worldshaper": "Geländeformer",
"item.create.honey_bucket": "Honigeimer", "item.create.honey_bucket": "Honigeimer",
"item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple",
"item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit",
@ -486,12 +487,12 @@
"item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel",
"item.create.super_glue": "Superkleber", "item.create.super_glue": "Superkleber",
"item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll",
"item.create.tree_fertilizer": "Baumdünger", "item.create.tree_fertilizer": "Baumdünger",
"item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox",
"item.create.wand_of_symmetry": "Symmetriestab", "item.create.wand_of_symmetry": "Symmetriestab",
"item.create.wheat_flour": "Weizenmehl", "item.create.wheat_flour": "Weizenmehl",
"item.create.whisk": "UNLOCALIZED: Whisk", "item.create.whisk": "UNLOCALIZED: Whisk",
"item.create.wrench": "Schraubenschlüssel", "item.create.wrench": "Schraubenschlüssel",
"item.create.zinc_ingot": "Zinkbarren", "item.create.zinc_ingot": "Zinkbarren",
"item.create.zinc_nugget": "Zinkklumpen", "item.create.zinc_nugget": "Zinkklumpen",
@ -501,14 +502,14 @@
"advancement.create.root": "Willkommen zu Create", "advancement.create.root": "Willkommen zu Create",
"advancement.create.root.desc": "Es ist Zeit mit dem Bauen von tollen Apparaten zu starten!", "advancement.create.root.desc": "Es ist Zeit mit dem Bauen von tollen Apparaten zu starten!",
"advancement.create.andesite_alloy": "Alliterationen in Massen", "advancement.create.andesite_alloy": "Alliterationen in Massen",
"advancement.create.andesite_alloy.desc": "Create's Materialien haben verrückte Namen, Eisenlegierung ist im Deutschen leider keine.", "advancement.create.andesite_alloy.desc": "Create's Materialien haben verrückte Namen, Eisenlegierung ist im Deutschen leider keine.",
"advancement.create.its_alive": "Es ist am leben!", "advancement.create.its_alive": "Es ist am leben!",
"advancement.create.its_alive.desc": "Gucke deinem erstem beweglichen Teil beim drehen zu.", "advancement.create.its_alive.desc": "Gucke deinem erstem beweglichen Teil beim drehen zu.",
"advancement.create.shifting_gears": "Wechsel deine Gänge", "advancement.create.shifting_gears": "Wechsel deine Gänge",
"advancement.create.shifting_gears.desc": "Verbinde ein großes Zahnrad mit einem kleinem, um die Geschwindigkeit deiner Apparate zu verändern.", "advancement.create.shifting_gears.desc": "Verbinde ein großes Zahnrad mit einem kleinem, um die Geschwindigkeit deiner Apparate zu verändern.",
"advancement.create.overstressed": "Ãœberfordert", "advancement.create.overstressed": "Überfordert",
"advancement.create.overstressed.desc": "Erfahre die Limits der Belastung aus erster Hand.", "advancement.create.overstressed.desc": "Erfahre die Limits der Belastung aus erster Hand.",
"advancement.create.belt": "Befördere es alles", "advancement.create.belt": "Befördere es alles",
"advancement.create.belt.desc": "Verbinde zwei Wllen mit einem Mechanischem Riemen", "advancement.create.belt.desc": "Verbinde zwei Wllen mit einem Mechanischem Riemen",
"advancement.create.tunnel": "UNLOCALIZED: Take cover!", "advancement.create.tunnel": "UNLOCALIZED: Take cover!",
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.", "advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.",
@ -666,10 +667,10 @@
"itemGroup.create.palettes": "Create Paletten", "itemGroup.create.palettes": "Create Paletten",
"death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", "death.attack.create.crush": "%1$s stolperte in ein Mahlwerk",
"death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet", "death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet",
"death.attack.create.fan_lava": "%1$s wurde von Lava verweht", "death.attack.create.fan_lava": "%1$s wurde von Lava verweht",
"death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert",
"death.attack.create.mechanical_saw": "%1$s wurde zersägt", "death.attack.create.mechanical_saw": "%1$s wurde zersägt",
"death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt",
"create.block.deployer.damage_source_name": "einem Finger", "create.block.deployer.damage_source_name": "einem Finger",
@ -689,7 +690,7 @@
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
"create.recipe.packing": "UNLOCALIZED: Compacting", "create.recipe.packing": "UNLOCALIZED: Compacting",
"create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing",
"create.recipe.sawing": "Sägen", "create.recipe.sawing": "Sägen",
"create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting",
"create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting",
"create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting",
@ -700,9 +701,9 @@
"create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout", "create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout",
"create.recipe.draining": "UNLOCALIZED: Item Draining", "create.recipe.draining": "UNLOCALIZED: Item Draining",
"create.recipe.processing.chance": "Chance: %1$s%%", "create.recipe.processing.chance": "Chance: %1$s%%",
"create.recipe.heat_requirement.none": "Keine Hitze benötigt", "create.recipe.heat_requirement.none": "Keine Hitze benötigt",
"create.recipe.heat_requirement.heated": "Wenig Hitze benötigt", "create.recipe.heat_requirement.heated": "Wenig Hitze benötigt",
"create.recipe.heat_requirement.superheated": "Viel Hitze benötigt", "create.recipe.heat_requirement.superheated": "Viel Hitze benötigt",
"create.generic.range": "Reichweite", "create.generic.range": "Reichweite",
"create.generic.radius": "Radius", "create.generic.radius": "Radius",
@ -710,32 +711,32 @@
"create.generic.height": "UNLOCALIZED: Height", "create.generic.height": "UNLOCALIZED: Height",
"create.generic.length": "UNLOCALIZED: Length", "create.generic.length": "UNLOCALIZED: Length",
"create.generic.speed": "Geschwindigkeit", "create.generic.speed": "Geschwindigkeit",
"create.generic.delay": "Verzögerung", "create.generic.delay": "Verzögerung",
"create.generic.unit.ticks": "Ticks", "create.generic.unit.ticks": "Ticks",
"create.generic.unit.seconds": "Sekunden", "create.generic.unit.seconds": "Sekunden",
"create.generic.unit.minutes": "Minuten", "create.generic.unit.minutes": "Minuten",
"create.generic.unit.rpm": "RPM", "create.generic.unit.rpm": "RPM",
"create.generic.unit.stress": "su", "create.generic.unit.stress": "su",
"create.generic.unit.degrees": "°", "create.generic.unit.degrees": "°",
"create.generic.unit.millibuckets": "%1$smB", "create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Uhrzeigersinn", "create.generic.clockwise": "Uhrzeigersinn",
"create.generic.counter_clockwise": "Gegen-Uhrzeigersinn", "create.generic.counter_clockwise": "Gegen-Uhrzeigersinn",
"create.action.scroll": "Wechseln", "create.action.scroll": "Wechseln",
"create.action.confirm": "Bestätigen", "create.action.confirm": "Bestätigen",
"create.action.abort": "Abbrechen", "create.action.abort": "Abbrechen",
"create.action.saveToFile": "Speichern", "create.action.saveToFile": "Speichern",
"create.action.discard": "Löschen", "create.action.discard": "Löschen",
"create.keyinfo.toolmenu": "Werkzeugmenü", "create.keyinfo.toolmenu": "Werkzeugmenü",
"create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)",
"create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)",
"create.gui.scrollInput.defaultTitle": "Wähle eine Option:", "create.gui.scrollInput.defaultTitle": "Wähle eine Option:",
"create.gui.scrollInput.scrollToModify": "Mausrad zum Ändern", "create.gui.scrollInput.scrollToModify": "Mausrad zum Ändern",
"create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount", "create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount",
"create.gui.scrollInput.scrollToSelect": "Mausrad zum Auswählen", "create.gui.scrollInput.scrollToSelect": "Mausrad zum Auswählen",
"create.gui.scrollInput.shiftScrollsFaster": "Shift zum schnelleren Auswählen", "create.gui.scrollInput.shiftScrollsFaster": "Shift zum schnelleren Auswählen",
"create.gui.toolmenu.focusKey": "Halte [%1$s] zum Fokussieren", "create.gui.toolmenu.focusKey": "Halte [%1$s] zum Fokussieren",
"create.gui.toolmenu.cycle": "[Mausrad] zum Wechseln", "create.gui.toolmenu.cycle": "[Mausrad] zum Wechseln",
"create.gui.symmetryWand.mirrorType": "Spiegeln", "create.gui.symmetryWand.mirrorType": "Spiegeln",
@ -756,7 +757,7 @@
"create.gui.blockzapper.searchDiagonal": "Diagonalen folgen", "create.gui.blockzapper.searchDiagonal": "Diagonalen folgen",
"create.gui.blockzapper.searchFuzzy": "Materialgrenzen ignorieren", "create.gui.blockzapper.searchFuzzy": "Materialgrenzen ignorieren",
"create.gui.blockzapper.range": "Reichweite", "create.gui.blockzapper.range": "Reichweite",
"create.gui.blockzapper.needsUpgradedAmplifier": "Benötigt besseren Verstärker", "create.gui.blockzapper.needsUpgradedAmplifier": "Benötigt besseren Verstärker",
"create.gui.blockzapper.patternSection": "Muster", "create.gui.blockzapper.patternSection": "Muster",
"create.gui.blockzapper.pattern.solid": "Fest", "create.gui.blockzapper.pattern.solid": "Fest",
"create.gui.blockzapper.pattern.checkered": "Schachbrett", "create.gui.blockzapper.pattern.checkered": "Schachbrett",
@ -786,15 +787,15 @@
"create.blockzapper.usingBlock": "Auswahl: %1$s", "create.blockzapper.usingBlock": "Auswahl: %1$s",
"create.blockzapper.componentUpgrades": "Bauteil-Upgrades:", "create.blockzapper.componentUpgrades": "Bauteil-Upgrades:",
"create.blockzapper.component.body": "Rumpf", "create.blockzapper.component.body": "Rumpf",
"create.blockzapper.component.amplifier": "Verstärker", "create.blockzapper.component.amplifier": "Verstärker",
"create.blockzapper.component.accelerator": "Beschleuniger", "create.blockzapper.component.accelerator": "Beschleuniger",
"create.blockzapper.component.retriever": "Empfänger", "create.blockzapper.component.retriever": "Empfänger",
"create.blockzapper.component.scope": "Fernrohr", "create.blockzapper.component.scope": "Fernrohr",
"create.blockzapper.componentTier.none": "Nichts", "create.blockzapper.componentTier.none": "Nichts",
"create.blockzapper.componentTier.brass": "Messing", "create.blockzapper.componentTier.brass": "Messing",
"create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic",
"create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen", "create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen",
"create.blockzapper.empty": "Keine Blöcke übrig!", "create.blockzapper.empty": "Keine Blöcke übrig!",
"create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each",
"create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks", "create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks",
@ -821,7 +822,7 @@
"create.logistics.filter": "Filter", "create.logistics.filter": "Filter",
"create.logistics.recipe_filter": "Rezeptfilter", "create.logistics.recipe_filter": "Rezeptfilter",
"create.logistics.fluid_filter": "Flüssigkeitsfilter", "create.logistics.fluid_filter": "Flüssigkeitsfilter",
"create.logistics.firstFrequency": "Freq. #1", "create.logistics.firstFrequency": "Freq. #1",
"create.logistics.secondFrequency": "Freq. #2", "create.logistics.secondFrequency": "Freq. #2",
"create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.",
@ -876,26 +877,26 @@
"create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed", "create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed",
"create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed", "create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed",
"create.schematicAndQuill.dimensions": "Bauplangröße: %1$sx%2$sx%3$s", "create.schematicAndQuill.dimensions": "Bauplangröße: %1$sx%2$sx%3$s",
"create.schematicAndQuill.firstPos": "Erste Position festgelegt.", "create.schematicAndQuill.firstPos": "Erste Position festgelegt.",
"create.schematicAndQuill.secondPos": "Zweite Position festgelegt.", "create.schematicAndQuill.secondPos": "Zweite Position festgelegt.",
"create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.", "create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.",
"create.schematicAndQuill.abort": "Auswahl zurückgesetzt.", "create.schematicAndQuill.abort": "Auswahl zurückgesetzt.",
"create.schematicAndQuill.title": "Bauplanname:", "create.schematicAndQuill.title": "Bauplanname:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Mein Bauplan", "create.schematicAndQuill.fallbackName": "Mein Bauplan",
"create.schematicAndQuill.saved": "Gespeichert als %1$s", "create.schematicAndQuill.saved": "Gespeichert als %1$s",
"create.schematic.invalid": "[!] Ungültiger Gegenstand - Benutze einen Bauplantisch.", "create.schematic.invalid": "[!] Ungültiger Gegenstand - Benutze einen Bauplantisch.",
"create.schematic.position": "Position", "create.schematic.position": "Position",
"create.schematic.rotation": "Rotation", "create.schematic.rotation": "Rotation",
"create.schematic.rotation.none": "Nein", "create.schematic.rotation.none": "Nein",
"create.schematic.rotation.cw90": "90° im Uhrzeigersinn", "create.schematic.rotation.cw90": "90° im Uhrzeigersinn",
"create.schematic.rotation.cw180": "180° im Uhrzeigersinn", "create.schematic.rotation.cw180": "180° im Uhrzeigersinn",
"create.schematic.rotation.cw270": "270° im Uhrzeigersinn", "create.schematic.rotation.cw270": "270° im Uhrzeigersinn",
"create.schematic.mirror": "Spiegeln", "create.schematic.mirror": "Spiegeln",
"create.schematic.mirror.none": "Nein", "create.schematic.mirror.none": "Nein",
"create.schematic.mirror.frontBack": "Vor-Zurück", "create.schematic.mirror.frontBack": "Vor-Zurück",
"create.schematic.mirror.leftRight": "Links-Rechts", "create.schematic.mirror.leftRight": "Links-Rechts",
"create.schematic.tool.deploy": "Positionieren", "create.schematic.tool.deploy": "Positionieren",
"create.schematic.tool.move": "XZ Bewegen", "create.schematic.tool.move": "XZ Bewegen",
@ -906,7 +907,7 @@
"create.schematic.tool.deploy.description.0": "Bewegt die Struktur an einen anderen ort.", "create.schematic.tool.deploy.description.0": "Bewegt die Struktur an einen anderen ort.",
"create.schematic.tool.deploy.description.1": "Mit Rechtsklick auf den Boden platzieren.", "create.schematic.tool.deploy.description.1": "Mit Rechtsklick auf den Boden platzieren.",
"create.schematic.tool.deploy.description.2": "[Strg] halten, um in einer bestimmten Entfernung zu arbeiten.", "create.schematic.tool.deploy.description.2": "[Strg] halten, um in einer bestimmten Entfernung zu arbeiten.",
"create.schematic.tool.deploy.description.3": "[Strg]-Mausrad um die Entfernung zu ändern.", "create.schematic.tool.deploy.description.3": "[Strg]-Mausrad um die Entfernung zu ändern.",
"create.schematic.tool.move.description.0": "Bewegt das Schema horizontal", "create.schematic.tool.move.description.0": "Bewegt das Schema horizontal",
"create.schematic.tool.move.description.1": "Zeig auf das Schema und benutze [Strg]-Mausrad.", "create.schematic.tool.move.description.1": "Zeig auf das Schema und benutze [Strg]-Mausrad.",
"create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.2": "",
@ -916,52 +917,52 @@
"create.schematic.tool.movey.description.2": "", "create.schematic.tool.movey.description.2": "",
"create.schematic.tool.movey.description.3": "", "create.schematic.tool.movey.description.3": "",
"create.schematic.tool.rotate.description.0": "Rotiert das Schema um seine Mitte.", "create.schematic.tool.rotate.description.0": "Rotiert das Schema um seine Mitte.",
"create.schematic.tool.rotate.description.1": "[Strg]-Mausrad für eine Drehung um 90°", "create.schematic.tool.rotate.description.1": "[Strg]-Mausrad für eine Drehung um 90°",
"create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.2": "",
"create.schematic.tool.rotate.description.3": "", "create.schematic.tool.rotate.description.3": "",
"create.schematic.tool.print.description.0": "Platziert sofort die Struktur in der Welt", "create.schematic.tool.print.description.0": "Platziert sofort die Struktur in der Welt",
"create.schematic.tool.print.description.1": "[Rechtsklick] zum Bestätigen der Platzierung an der aktuellen Position.", "create.schematic.tool.print.description.1": "[Rechtsklick] zum Bestätigen der Platzierung an der aktuellen Position.",
"create.schematic.tool.print.description.2": "Dieses Werkzeug ist nur für den Kreativ-Modus.", "create.schematic.tool.print.description.2": "Dieses Werkzeug ist nur für den Kreativ-Modus.",
"create.schematic.tool.print.description.3": "", "create.schematic.tool.print.description.3": "",
"create.schematic.tool.flip.description.0": "Kehrt das Schema entlang der ausgewählten Oberfläche um.", "create.schematic.tool.flip.description.0": "Kehrt das Schema entlang der ausgewählten Oberfläche um.",
"create.schematic.tool.flip.description.1": "Zeige auf das Schema und benutze [Strg]-Mausrad.", "create.schematic.tool.flip.description.1": "Zeige auf das Schema und benutze [Strg]-Mausrad.",
"create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.2": "",
"create.schematic.tool.flip.description.3": "", "create.schematic.tool.flip.description.3": "",
"create.schematics.synchronizing": "Synchronisation...", "create.schematics.synchronizing": "Synchronisation...",
"create.schematics.uploadTooLarge": "Dein Bauplan ist zu groß.", "create.schematics.uploadTooLarge": "Dein Bauplan ist zu groß.",
"create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:", "create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.title": "Bauplantisch", "create.gui.schematicTable.title": "Bauplantisch",
"create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne", "create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne",
"create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne", "create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne",
"create.gui.schematicTable.uploading": "Hochladen...", "create.gui.schematicTable.uploading": "Hochladen...",
"create.gui.schematicTable.finished": "Hochgeladen!", "create.gui.schematicTable.finished": "Hochgeladen!",
"create.gui.schematicannon.title": "Bauplankanone", "create.gui.schematicannon.title": "Bauplankanone",
"create.gui.schematicannon.listPrinter": "Materiallistendruck", "create.gui.schematicannon.listPrinter": "Materiallistendruck",
"create.gui.schematicannon.gunpowderLevel": "Schwarzpulver bei %1$s%%", "create.gui.schematicannon.gunpowderLevel": "Schwarzpulver bei %1$s%%",
"create.gui.schematicannon.shotsRemaining": "%1$s Schuss übrig", "create.gui.schematicannon.shotsRemaining": "%1$s Schuss übrig",
"create.gui.schematicannon.shotsRemainingWithBackup": "Mit Reserve: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "Mit Reserve: %1$s",
"create.gui.schematicannon.optionEnabled": "Aktiviert", "create.gui.schematicannon.optionEnabled": "Aktiviert",
"create.gui.schematicannon.optionDisabled": "Deaktiviert", "create.gui.schematicannon.optionDisabled": "Deaktiviert",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Feste Blöcke nicht ersetzen", "create.gui.schematicannon.option.dontReplaceSolid": "Feste Blöcke nicht ersetzen",
"create.gui.schematicannon.option.replaceWithSolid": "Feste Blöcke mit festen ersetzen", "create.gui.schematicannon.option.replaceWithSolid": "Feste Blöcke mit festen ersetzen",
"create.gui.schematicannon.option.replaceWithAny": "Feste Blöcke immer ersetzen", "create.gui.schematicannon.option.replaceWithAny": "Feste Blöcke immer ersetzen",
"create.gui.schematicannon.option.replaceWithEmpty": "Feste Blöcke mit Leere ersetzen", "create.gui.schematicannon.option.replaceWithEmpty": "Feste Blöcke mit Leere ersetzen",
"create.gui.schematicannon.option.skipMissing": "Fehlende Blöcke ignorieren", "create.gui.schematicannon.option.skipMissing": "Fehlende Blöcke ignorieren",
"create.gui.schematicannon.option.skipTileEntities": "Tile Entities ignorieren", "create.gui.schematicannon.option.skipTileEntities": "Tile Entities ignorieren",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Wenn die Bauplankanone einen benötigten Block nicht finden kann, wird sie einfach beim nächsten weiter machen.", "create.gui.schematicannon.option.skipMissing.description": "Wenn die Bauplankanone einen benötigten Block nicht finden kann, wird sie einfach beim nächsten weiter machen.",
"create.gui.schematicannon.option.skipTileEntities.description": "Die Bauplankanone wird versuchen, Blöcke mit extra Daten, beispielsweise Truhen, nicht zu ersetzen.", "create.gui.schematicannon.option.skipTileEntities.description": "Die Bauplankanone wird versuchen, Blöcke mit extra Daten, beispielsweise Truhen, nicht zu ersetzen.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "Die Kanone wird ausschließlich nicht feste Blöcke und Luft in ihrem Arbeitsbereich ersetzen.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Die Kanone wird ausschließlich nicht feste Blöcke und Luft in ihrem Arbeitsbereich ersetzen.",
"create.gui.schematicannon.option.replaceWithSolid.description": "Die Kanone wird feste Blöcke nur dann ersetzen, wenn an der Position vorher bereits ein fester Block war.", "create.gui.schematicannon.option.replaceWithSolid.description": "Die Kanone wird feste Blöcke nur dann ersetzen, wenn an der Position vorher bereits ein fester Block war.",
"create.gui.schematicannon.option.replaceWithAny.description": "Die Kanone wird feste Blöcke ersetzen, wenn der Bauplan an der Position einen Block enthält.", "create.gui.schematicannon.option.replaceWithAny.description": "Die Kanone wird feste Blöcke ersetzen, wenn der Bauplan an der Position einen Block enthält.",
"create.gui.schematicannon.option.replaceWithEmpty.description": "Die Kanone wird alle Blöcke im Arbeitsbereich entfernen.", "create.gui.schematicannon.option.replaceWithEmpty.description": "Die Kanone wird alle Blöcke im Arbeitsbereich entfernen.",
"create.schematicannon.status.idle": "Aus", "create.schematicannon.status.idle": "Aus",
"create.schematicannon.status.ready": "Bereit", "create.schematicannon.status.ready": "Bereit",
@ -973,11 +974,11 @@
"create.schematicannon.status.targetNotLoaded": "Kein Block geladen", "create.schematicannon.status.targetNotLoaded": "Kein Block geladen",
"create.schematicannon.status.targetOutsideRange": "Ziel zu weit weg", "create.schematicannon.status.targetOutsideRange": "Ziel zu weit weg",
"create.schematicannon.status.searching": "Suchen", "create.schematicannon.status.searching": "Suchen",
"create.schematicannon.status.skipping": "Ãœberspringen", "create.schematicannon.status.skipping": "Überspringen",
"create.schematicannon.status.missingBlock": "Fehlender Block:", "create.schematicannon.status.missingBlock": "Fehlender Block:",
"create.schematicannon.status.placing": "Platzieren", "create.schematicannon.status.placing": "Platzieren",
"create.schematicannon.status.clearing": "Blöcke entfernen", "create.schematicannon.status.clearing": "Blöcke entfernen",
"create.schematicannon.status.schematicInvalid": "Bauplan ungültig", "create.schematicannon.status.schematicInvalid": "Bauplan ungültig",
"create.schematicannon.status.schematicNotPlaced": "Bauplan nicht positioniert", "create.schematicannon.status.schematicNotPlaced": "Bauplan nicht positioniert",
"create.schematicannon.status.schematicExpired": "Bauplandatei abgelaufen", "create.schematicannon.status.schematicExpired": "Bauplandatei abgelaufen",
@ -1027,6 +1028,10 @@
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s",
"create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s",
"create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s",
@ -1088,6 +1093,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "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.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.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1161,8 +1172,8 @@
"item.create.example_item.tooltip.condition1": "Wenn dies", "item.create.example_item.tooltip.condition1": "Wenn dies",
"item.create.example_item.tooltip.behaviour1": "dann tut dieser Gegenstand das. (Verhalten wird mit der Shift-Taste angezeigt)", "item.create.example_item.tooltip.behaviour1": "dann tut dieser Gegenstand das. (Verhalten wird mit der Shift-Taste angezeigt)",
"item.create.example_item.tooltip.condition2": "Und wenn dies", "item.create.example_item.tooltip.condition2": "Und wenn dies",
"item.create.example_item.tooltip.behaviour2": "kannst du so viele Verhaltensweisen hinzufügen wie du magst", "item.create.example_item.tooltip.behaviour2": "kannst du so viele Verhaltensweisen hinzufügen wie du magst",
"item.create.example_item.tooltip.control1": "Wenn Strg gedrückt ist", "item.create.example_item.tooltip.control1": "Wenn Strg gedrückt ist",
"item.create.example_item.tooltip.action1": "wird diese Steuerung gezeigt.", "item.create.example_item.tooltip.action1": "wird diese Steuerung gezeigt.",
"block.create.andesite_encased_shaft.tooltip": "UNLOCALIZED: ANDESITE ENCASED SHAFT", "block.create.andesite_encased_shaft.tooltip": "UNLOCALIZED: ANDESITE ENCASED SHAFT",
@ -1321,24 +1332,24 @@
"block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical Arm_.", "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical Arm_.",
"item.create.wand_of_symmetry.tooltip": "SYMMETRIESTAB", "item.create.wand_of_symmetry.tooltip": "SYMMETRIESTAB",
"item.create.wand_of_symmetry.tooltip.summary": "Spiegelt deine Blockplatzierung perfekt über die konfigurierten Ebenen.", "item.create.wand_of_symmetry.tooltip.summary": "Spiegelt deine Blockplatzierung perfekt über die konfigurierten Ebenen.",
"item.create.wand_of_symmetry.tooltip.condition1": "Wenn in der Schnellleiste", "item.create.wand_of_symmetry.tooltip.condition1": "Wenn in der Schnellleiste",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Bleibt aktiv", "item.create.wand_of_symmetry.tooltip.behaviour1": "Bleibt aktiv",
"item.create.wand_of_symmetry.tooltip.control1": "R-Klick auf Boden", "item.create.wand_of_symmetry.tooltip.control1": "R-Klick auf Boden",
"item.create.wand_of_symmetry.tooltip.action1": "_Erstellt_ oder _Bewegt_ den Spiegel", "item.create.wand_of_symmetry.tooltip.action1": "_Erstellt_ oder _Bewegt_ den Spiegel",
"item.create.wand_of_symmetry.tooltip.control2": "R-Klick in die Luft", "item.create.wand_of_symmetry.tooltip.control2": "R-Klick in die Luft",
"item.create.wand_of_symmetry.tooltip.action2": "_Löscht_ den aktiven Spiegel", "item.create.wand_of_symmetry.tooltip.action2": "_Löscht_ den aktiven Spiegel",
"item.create.wand_of_symmetry.tooltip.control3": "R-Klick beim Schleichen", "item.create.wand_of_symmetry.tooltip.control3": "R-Klick beim Schleichen",
"item.create.wand_of_symmetry.tooltip.action3": "Ãffnet das _Konfigurationsmenü_", "item.create.wand_of_symmetry.tooltip.action3": "Öffnet das _Konfigurationsmenü_",
"item.create.handheld_blockzapper.tooltip": "BLOCKPISTOLE", "item.create.handheld_blockzapper.tooltip": "BLOCKPISTOLE",
"item.create.handheld_blockzapper.tooltip.summary": "Ermöglicht das Platzieren und Austauschen von Blöcken aus großer Entfernung.", "item.create.handheld_blockzapper.tooltip.summary": "Ermöglicht das Platzieren und Austauschen von Blöcken aus großer Entfernung.",
"item.create.handheld_blockzapper.tooltip.control1": "L-Klick auf Block", "item.create.handheld_blockzapper.tooltip.control1": "L-Klick auf Block",
"item.create.handheld_blockzapper.tooltip.action1": "Legt die von dem Werkzeug platzierten Blöcke auf den angeschauten Block fest.", "item.create.handheld_blockzapper.tooltip.action1": "Legt die von dem Werkzeug platzierten Blöcke auf den angeschauten Block fest.",
"item.create.handheld_blockzapper.tooltip.control2": "R-Klick auf Block", "item.create.handheld_blockzapper.tooltip.control2": "R-Klick auf Block",
"item.create.handheld_blockzapper.tooltip.action2": "_Platziert_ oder _Ersetzt_ den ausgewählten Block.", "item.create.handheld_blockzapper.tooltip.action2": "_Platziert_ oder _Ersetzt_ den ausgewählten Block.",
"item.create.handheld_blockzapper.tooltip.control3": "R-Klick beim Schleichen", "item.create.handheld_blockzapper.tooltip.control3": "R-Klick beim Schleichen",
"item.create.handheld_blockzapper.tooltip.action3": "Ãffnet das _Konfigurationsmenü_", "item.create.handheld_blockzapper.tooltip.action3": "Öffnet das _Konfigurationsmenü_",
"item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER",
"item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain features_.",
@ -1349,10 +1360,10 @@
"item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking", "item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking",
"item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration Interface_", "item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration Interface_",
"item.create.tree_fertilizer.tooltip": "BAUMDÃœNGER", "item.create.tree_fertilizer.tooltip": "BAUMDÜNGER",
"item.create.tree_fertilizer.tooltip.summary": "Eine Mischung aus Mineralien, die sich für weit verbreitete Baumarten eignet", "item.create.tree_fertilizer.tooltip.summary": "Eine Mischung aus Mineralien, die sich für weit verbreitete Baumarten eignet",
"item.create.tree_fertilizer.tooltip.condition1": "Wenn auf einen Setzling angewendet", "item.create.tree_fertilizer.tooltip.condition1": "Wenn auf einen Setzling angewendet",
"item.create.tree_fertilizer.tooltip.behaviour1": "Lässt Bäume unabhängig vom Platz um sie herum wachsen", "item.create.tree_fertilizer.tooltip.behaviour1": "Lässt Bäume unabhängig vom Platz um sie herum wachsen",
"item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER",
"item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant axe_ able to chop down trees in a split second.", "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant axe_ able to chop down trees in a split second.",
@ -1377,60 +1388,60 @@
"item.create.attribute_filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration interface_.", "item.create.attribute_filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration interface_.",
"item.create.empty_schematic.tooltip": "LEERER BAUPLAN", "item.create.empty_schematic.tooltip": "LEERER BAUPLAN",
"item.create.empty_schematic.tooltip.summary": "Wird für die Herstellung und das Schreiben auf dem _Bauplantisch_ verwendet", "item.create.empty_schematic.tooltip.summary": "Wird für die Herstellung und das Schreiben auf dem _Bauplantisch_ verwendet",
"item.create.schematic.tooltip": "BAUPLAN", "item.create.schematic.tooltip": "BAUPLAN",
"item.create.schematic.tooltip.summary": "Beschreibt eine Struktur, die in der Welt platziert werden kann. Positioniere das Hologramm wie gewünscht und verwende eine _Bauplankanone_, um die Struktur zu bauen.", "item.create.schematic.tooltip.summary": "Beschreibt eine Struktur, die in der Welt platziert werden kann. Positioniere das Hologramm wie gewünscht und verwende eine _Bauplankanone_, um die Struktur zu bauen.",
"item.create.schematic.tooltip.condition1": "Wenn gehalten", "item.create.schematic.tooltip.condition1": "Wenn gehalten",
"item.create.schematic.tooltip.behaviour1": "Kann mit den Werkzeugen auf dem Bildschirm positioniert werden", "item.create.schematic.tooltip.behaviour1": "Kann mit den Werkzeugen auf dem Bildschirm positioniert werden",
"item.create.schematic.tooltip.control1": "R-Klick beim Schleichen", "item.create.schematic.tooltip.control1": "R-Klick beim Schleichen",
"item.create.schematic.tooltip.action1": "Ãffnet ein Menü zur Eingabe exakter _Koordinaten_.", "item.create.schematic.tooltip.action1": "Öffnet ein Menü zur Eingabe exakter _Koordinaten_.",
"item.create.schematic_and_quill.tooltip": "BAUPLAN UND FEDER", "item.create.schematic_and_quill.tooltip": "BAUPLAN UND FEDER",
"item.create.schematic_and_quill.tooltip.summary": "Wird benutzt, um eine existierende Struktur in der Welt als eine .nbt-Datei zu speichern.", "item.create.schematic_and_quill.tooltip.summary": "Wird benutzt, um eine existierende Struktur in der Welt als eine .nbt-Datei zu speichern.",
"item.create.schematic_and_quill.tooltip.condition1": "Schritt 1", "item.create.schematic_and_quill.tooltip.condition1": "Schritt 1",
"item.create.schematic_and_quill.tooltip.behaviour1": "Wähle zwei Eckpunkte mit R-Klick aus", "item.create.schematic_and_quill.tooltip.behaviour1": "Wähle zwei Eckpunkte mit R-Klick aus",
"item.create.schematic_and_quill.tooltip.condition2": "Schritt 2", "item.create.schematic_and_quill.tooltip.condition2": "Schritt 2",
"item.create.schematic_and_quill.tooltip.behaviour2": "Auf den Oberflächen _Strg-Scrollen_ um die Größe zu verändern. Nochmals R-Klick um zu speichern.", "item.create.schematic_and_quill.tooltip.behaviour2": "Auf den Oberflächen _Strg-Scrollen_ um die Größe zu verändern. Nochmals R-Klick um zu speichern.",
"item.create.schematic_and_quill.tooltip.control1": "R-Klick", "item.create.schematic_and_quill.tooltip.control1": "R-Klick",
"item.create.schematic_and_quill.tooltip.action1": "Einen Eckpunkt auswählen / Speichern bestätigen", "item.create.schematic_and_quill.tooltip.action1": "Einen Eckpunkt auswählen / Speichern bestätigen",
"item.create.schematic_and_quill.tooltip.control2": "Strg gedrückt halten", "item.create.schematic_and_quill.tooltip.control2": "Strg gedrückt halten",
"item.create.schematic_and_quill.tooltip.action2": "Wählt Punkte _mitten_ _in_ _der_ _Luft._ _Scrolle,_ um die Distanz anzupassen.", "item.create.schematic_and_quill.tooltip.action2": "Wählt Punkte _mitten_ _in_ _der_ _Luft._ _Scrolle,_ um die Distanz anzupassen.",
"item.create.schematic_and_quill.tooltip.control3": "R-Klick beim Schleichen", "item.create.schematic_and_quill.tooltip.control3": "R-Klick beim Schleichen",
"item.create.schematic_and_quill.tooltip.action3": "_Setzt_ die Auswahl _zurück_ und löscht sie.", "item.create.schematic_and_quill.tooltip.action3": "_Setzt_ die Auswahl _zurück_ und löscht sie.",
"block.create.schematicannon.tooltip": "BAUPLANKANONE", "block.create.schematicannon.tooltip": "BAUPLANKANONE",
"block.create.schematicannon.tooltip.summary": "Schießt Blöcke, um eine Struktur nach einem positionierten _Bauplan_ zu errichten. Benutzt Gegenstände aus benachbarten Inventaren und _Schießpulver_ als Treibstoff.", "block.create.schematicannon.tooltip.summary": "Schießt Blöcke, um eine Struktur nach einem positionierten _Bauplan_ zu errichten. Benutzt Gegenstände aus benachbarten Inventaren und _Schießpulver_ als Treibstoff.",
"block.create.schematicannon.tooltip.control1": "Wenn R-Geklickt", "block.create.schematicannon.tooltip.control1": "Wenn R-Geklickt",
"block.create.schematicannon.tooltip.action1": "Ãffnet das _Menü_", "block.create.schematicannon.tooltip.action1": "Öffnet das _Menü_",
"block.create.schematic_table.tooltip": "BAUPLANTISCH", "block.create.schematic_table.tooltip": "BAUPLANTISCH",
"block.create.schematic_table.tooltip.summary": "Schreibt gespeicherte Baupläne auf einen _Leeren_ _Bauplan_", "block.create.schematic_table.tooltip.summary": "Schreibt gespeicherte Baupläne auf einen _Leeren_ _Bauplan_",
"block.create.schematic_table.tooltip.condition1": "Wenn ein Leerer Bauplan bereitgestellt wird", "block.create.schematic_table.tooltip.condition1": "Wenn ein Leerer Bauplan bereitgestellt wird",
"block.create.schematic_table.tooltip.behaviour1": "Lädt eine ausgewählte Datei von deinem Bauplan-Ordner hoch", "block.create.schematic_table.tooltip.behaviour1": "Lädt eine ausgewählte Datei von deinem Bauplan-Ordner hoch",
"block.create.shaft.tooltip": "WELLE", "block.create.shaft.tooltip": "WELLE",
"block.create.shaft.tooltip.summary": "_Ãœberträgt_ _Rotation_ entlang ihrer Achse.", "block.create.shaft.tooltip.summary": "_Überträgt_ _Rotation_ entlang ihrer Achse.",
"block.create.cogwheel.tooltip": "ZAHNRAD", "block.create.cogwheel.tooltip": "ZAHNRAD",
"block.create.cogwheel.tooltip.summary": "_Ãœberträgt_ _Rotation_ entlang seiner Achse und auf benachbarte _Zahnräder._", "block.create.cogwheel.tooltip.summary": "_Überträgt_ _Rotation_ entlang seiner Achse und auf benachbarte _Zahnräder._",
"block.create.large_cogwheel.tooltip": "GROẞES ZAHNRAD", "block.create.large_cogwheel.tooltip": "GROES ZAHNRAD",
"block.create.large_cogwheel.tooltip.summary": "Eine größere Version des _Zahnrads,_ ermöglicht eine _Änderung_ der _Rotationsgeschwindigket_, wenn es mit einem kleinerem Zahnrad verbunden wird.", "block.create.large_cogwheel.tooltip.summary": "Eine größere Version des _Zahnrads,_ ermöglicht eine _Änderung_ der _Rotationsgeschwindigket_, wenn es mit einem kleinerem Zahnrad verbunden wird.",
"block.create.encased_shaft.tooltip": "EINGESCHLOSSENE WELLE", "block.create.encased_shaft.tooltip": "EINGESCHLOSSENE WELLE",
"block.create.encased_shaft.tooltip.summary": "_Ãœberträgt_ _Rotation_ entlang ihrer Achse. Nützlich für die Ãœbertragung von Rotation durch Wände hindurch.", "block.create.encased_shaft.tooltip.summary": "_Überträgt_ _Rotation_ entlang ihrer Achse. Nützlich für die Übertragung von Rotation durch Wände hindurch.",
"block.create.gearbox.tooltip": "GETRIEBE", "block.create.gearbox.tooltip": "GETRIEBE",
"block.create.gearbox.tooltip.summary": "_Leitet_ _Rotation_ in _vier_ _Richtungen_ weiter. Kehrt geradlinige Verbindungen um.", "block.create.gearbox.tooltip.summary": "_Leitet_ _Rotation_ in _vier_ _Richtungen_ weiter. Kehrt geradlinige Verbindungen um.",
"block.create.gearshift.tooltip": "GANGSCHALTUNG", "block.create.gearshift.tooltip": "GANGSCHALTUNG",
"block.create.gearshift.tooltip.summary": "Ein kontrollierbarer _Rotationsschalter_ für angeschlossene Wellen.", "block.create.gearshift.tooltip.summary": "Ein kontrollierbarer _Rotationsschalter_ für angeschlossene Wellen.",
"block.create.gearshift.tooltip.condition1": "Wenn aktiv", "block.create.gearshift.tooltip.condition1": "Wenn aktiv",
"block.create.gearshift.tooltip.behaviour1": "_Kehrt_ die ausgehende Drehrichtung _um._", "block.create.gearshift.tooltip.behaviour1": "_Kehrt_ die ausgehende Drehrichtung _um._",
"block.create.clutch.tooltip": "KUPPLUNG", "block.create.clutch.tooltip": "KUPPLUNG",
"block.create.clutch.tooltip.summary": "Ein kontrollierbarer _Rotationsschalter_ für angeschlossene Wellen.", "block.create.clutch.tooltip.summary": "Ein kontrollierbarer _Rotationsschalter_ für angeschlossene Wellen.",
"block.create.clutch.tooltip.condition1": "Wenn aktiv", "block.create.clutch.tooltip.condition1": "Wenn aktiv",
"block.create.clutch.tooltip.behaviour1": "_Stoppt_ das Weiterleiten von Rotation zur anderen Seite.", "block.create.clutch.tooltip.behaviour1": "_Stoppt_ das Weiterleiten von Rotation zur anderen Seite.",
@ -1447,9 +1458,9 @@
"item.create.belt_connector.tooltip": "MECHANISCHER RIEMEN", "item.create.belt_connector.tooltip": "MECHANISCHER RIEMEN",
"item.create.belt_connector.tooltip.summary": "Verbindet zwei _Wellen_ mit einem _Mechanischen_ _Riemen._ Verbundene Wellen haben die exakt gleiche Rotationsgeschwindigkeit und Richtung.", "item.create.belt_connector.tooltip.summary": "Verbindet zwei _Wellen_ mit einem _Mechanischen_ _Riemen._ Verbundene Wellen haben die exakt gleiche Rotationsgeschwindigkeit und Richtung.",
"item.create.belt_connector.tooltip.control1": "R-Klick auf Welle", "item.create.belt_connector.tooltip.control1": "R-Klick auf Welle",
"item.create.belt_connector.tooltip.action1": "Wählt die Welle als Verbindungspunkt für den Riemen aus. Beide ausgewählten Wellen müssen _horizontal,_ _vertikal_ oder _diagonal_ entlang der Richtung des Riemens zeigen.", "item.create.belt_connector.tooltip.action1": "Wählt die Welle als Verbindungspunkt für den Riemen aus. Beide ausgewählten Wellen müssen _horizontal,_ _vertikal_ oder _diagonal_ entlang der Richtung des Riemens zeigen.",
"item.create.belt_connector.tooltip.control2": "R-Klick beim Schleichen", "item.create.belt_connector.tooltip.control2": "R-Klick beim Schleichen",
"item.create.belt_connector.tooltip.action2": "_Setzt_ die erste ausgewählte Position des Riemens _zurück._", "item.create.belt_connector.tooltip.action2": "_Setzt_ die erste ausgewählte Position des Riemens _zurück._",
"item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES", "item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES",
"item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic information_.", "item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic information_.",
@ -1471,16 +1482,16 @@
"block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.", "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.",
"block.create.water_wheel.tooltip": "WASSERRAD", "block.create.water_wheel.tooltip": "WASSERRAD",
"block.create.water_wheel.tooltip.summary": "Liefert _Rotationsenergie_ von benachbarten _Wasserströmungen._", "block.create.water_wheel.tooltip.summary": "Liefert _Rotationsenergie_ von benachbarten _Wasserströmungen._",
"block.create.encased_fan.tooltip": "EINGESCHLOSSENER PROPELLER", "block.create.encased_fan.tooltip": "EINGESCHLOSSENER PROPELLER",
"block.create.encased_fan.tooltip.summary": "Wandelt _Rotationsenergie_ in _Luftstöme_ um und wieder zurück. Hat mehrere Verwendungsmöglichkeiten.", "block.create.encased_fan.tooltip.summary": "Wandelt _Rotationsenergie_ in _Luftstöme_ um und wieder zurück. Hat mehrere Verwendungsmöglichkeiten.",
"block.create.encased_fan.tooltip.condition1": "Wenn über Feuer", "block.create.encased_fan.tooltip.condition1": "Wenn über Feuer",
"block.create.encased_fan.tooltip.behaviour1": "Liefert _Rotationsenergie_ (muss vertikal ausgerichtet sein)", "block.create.encased_fan.tooltip.behaviour1": "Liefert _Rotationsenergie_ (muss vertikal ausgerichtet sein)",
"block.create.encased_fan.tooltip.condition2": "Wenn angetrieben", "block.create.encased_fan.tooltip.condition2": "Wenn angetrieben",
"block.create.encased_fan.tooltip.behaviour2": "_Bläst_ Dinge auf einer Seite von sich weg, _zieht_ sie auf der anderen zu sich hin. Kraft und Geschwindigkeit sind abhängig von der eingehenden Rotation.", "block.create.encased_fan.tooltip.behaviour2": "_Bläst_ Dinge auf einer Seite von sich weg, _zieht_ sie auf der anderen zu sich hin. Kraft und Geschwindigkeit sind abhängig von der eingehenden Rotation.",
"block.create.encased_fan.tooltip.condition3": "Wenn Luft durch spezielle Blöcke fließt", "block.create.encased_fan.tooltip.condition3": "Wenn Luft durch spezielle Blöcke fließt",
"block.create.encased_fan.tooltip.behaviour3": "Werden Gegenstände vor dem Block verarbeitet: _Wasser_ wäscht, _Feuer_ räuchert, und _Lava_ schmilzt den Gegenstand.", "block.create.encased_fan.tooltip.behaviour3": "Werden Gegenstände vor dem Block verarbeitet: _Wasser_ wäscht, _Feuer_ räuchert, und _Lava_ schmilzt den Gegenstand.",
"block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE", "block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE",
"block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.", "block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.",
@ -1496,7 +1507,7 @@
"block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.", "block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.",
"block.create.turntable.tooltip": "DREHTISCH", "block.create.turntable.tooltip": "DREHTISCH",
"block.create.turntable.tooltip.summary": "Wandelt _Rotationsenergie_ in starkes Schwindelgefühl um.", "block.create.turntable.tooltip.summary": "Wandelt _Rotationsenergie_ in starkes Schwindelgefühl um.",
"block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE",
"block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.",
@ -1506,16 +1517,16 @@
"block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.",
"block.create.crushing_wheel.tooltip": "MAHLWERKRAD", "block.create.crushing_wheel.tooltip": "MAHLWERKRAD",
"block.create.crushing_wheel.tooltip.summary": "Riesige, drehbare Räder, die alles _zermalmen_ das zwischen ihnen landet.", "block.create.crushing_wheel.tooltip.summary": "Riesige, drehbare Räder, die alles _zermalmen_ das zwischen ihnen landet.",
"block.create.crushing_wheel.tooltip.condition1": "Wenn mit einem anderem Mahlwerkrad verbunden", "block.create.crushing_wheel.tooltip.condition1": "Wenn mit einem anderem Mahlwerkrad verbunden",
"block.create.crushing_wheel.tooltip.behaviour1": "Formt einen Schredder, mit dem man verschiedene Sachen verarbeiten kann. Die Zähne der Räder müssen ineinandergreifen und mit der _gleichen_ _Geschwindigkeit_ in _gegengesetzte_ _Richtungen_ drehen.", "block.create.crushing_wheel.tooltip.behaviour1": "Formt einen Schredder, mit dem man verschiedene Sachen verarbeiten kann. Die Zähne der Räder müssen ineinandergreifen und mit der _gleichen_ _Geschwindigkeit_ in _gegengesetzte_ _Richtungen_ drehen.",
"block.create.mechanical_press.tooltip": "MECHANISCHE PRESSE", "block.create.mechanical_press.tooltip": "MECHANISCHE PRESSE",
"block.create.mechanical_press.tooltip.summary": "Ein starker Kolben, welcher Gegenstände unter ihm zusammenpresst. Benötigt konstante _Rotationsenergie._", "block.create.mechanical_press.tooltip.summary": "Ein starker Kolben, welcher Gegenstände unter ihm zusammenpresst. Benötigt konstante _Rotationsenergie._",
"block.create.mechanical_press.tooltip.condition1": "Wenn durch Redstone aktiviert", "block.create.mechanical_press.tooltip.condition1": "Wenn durch Redstone aktiviert",
"block.create.mechanical_press.tooltip.behaviour1": "_Fängt_ _an_, Gegenstände, die darunter liegen, zusammenzudrücken.", "block.create.mechanical_press.tooltip.behaviour1": "_Fängt_ _an_, Gegenstände, die darunter liegen, zusammenzudrücken.",
"block.create.mechanical_press.tooltip.condition2": "Wenn über einem Mechanischem Riemen", "block.create.mechanical_press.tooltip.condition2": "Wenn über einem Mechanischem Riemen",
"block.create.mechanical_press.tooltip.behaviour2": "Presst _automatisch_ alle auf dem Riemen vorbeigeführten Gegenstände zusammen.", "block.create.mechanical_press.tooltip.behaviour2": "Presst _automatisch_ alle auf dem Riemen vorbeigeführten Gegenstände zusammen.",
"block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin",
"block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact items_ in the basin whenever all necessary ingredients are present.", "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact items_ in the basin whenever all necessary ingredients are present.",
@ -1580,19 +1591,19 @@
"block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.", "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.",
"block.create.mechanical_piston.tooltip": "MECHANISCHER KOLBEN", "block.create.mechanical_piston.tooltip": "MECHANISCHER KOLBEN",
"block.create.mechanical_piston.tooltip.summary": "Eine fortgeschrittene Version des _Kolbens,_ welcher _Rotationsenergie_ benutzt, um verbundene Strukturen präzise zu bewegen. _Kolben-Pleuelverlängerungen_ auf der Hinterseite bestimmen die _Reichweite_ des Kolbens. Ohne Verlängerungen bewegt sich dieser nicht. Verwende ein _Schubgerüst,_ um mehr als nur eine Reihe von Blöcken zu bewegen.", "block.create.mechanical_piston.tooltip.summary": "Eine fortgeschrittene Version des _Kolbens,_ welcher _Rotationsenergie_ benutzt, um verbundene Strukturen präzise zu bewegen. _Kolben-Pleuelverlängerungen_ auf der Hinterseite bestimmen die _Reichweite_ des Kolbens. Ohne Verlängerungen bewegt sich dieser nicht. Verwende ein _Schubgerüst,_ um mehr als nur eine Reihe von Blöcken zu bewegen.",
"block.create.mechanical_piston.tooltip.condition1": "Wenn angetrieben", "block.create.mechanical_piston.tooltip.condition1": "Wenn angetrieben",
"block.create.mechanical_piston.tooltip.behaviour1": "Fängt an, die angeschlossene Struktur zu bewegen. Geschwindigkeit und Richtung korrelieren mit der eingehenden Rotationsgeschwindigkeit.", "block.create.mechanical_piston.tooltip.behaviour1": "Fängt an, die angeschlossene Struktur zu bewegen. Geschwindigkeit und Richtung korrelieren mit der eingehenden Rotationsgeschwindigkeit.",
"block.create.piston_extension_pole.tooltip": "KOLBEN-PLEUELVERÄNGERUNG", "block.create.piston_extension_pole.tooltip": "KOLBEN-PLEUELVERÄNGERUNG",
"block.create.piston_extension_pole.tooltip.summary": "Wird benutzt, um die Reichweite von _Mechanischen_ _Kolben_ zu erhöhen.", "block.create.piston_extension_pole.tooltip.summary": "Wird benutzt, um die Reichweite von _Mechanischen_ _Kolben_ zu erhöhen.",
"block.create.piston_extension_pole.tooltip.condition1": "Wenn an einem Mechanischen Kolben angebracht", "block.create.piston_extension_pole.tooltip.condition1": "Wenn an einem Mechanischen Kolben angebracht",
"block.create.piston_extension_pole.tooltip.behaviour1": "Erhöht die Länge des Kolbens um 1 Block.", "block.create.piston_extension_pole.tooltip.behaviour1": "Erhöht die Länge des Kolbens um 1 Block.",
"block.create.mechanical_bearing.tooltip": "MECHANISCHES LAGER", "block.create.mechanical_bearing.tooltip": "MECHANISCHES LAGER",
"block.create.mechanical_bearing.tooltip.summary": "Wird benutzt, um _größere_ _Strukturen_ zu drehen oder um _Rotationsenergie_ aus Wind zu erzeugen.", "block.create.mechanical_bearing.tooltip.summary": "Wird benutzt, um _größere_ _Strukturen_ zu drehen oder um _Rotationsenergie_ aus Wind zu erzeugen.",
"block.create.mechanical_bearing.tooltip.condition1": "Wenn angetrieben", "block.create.mechanical_bearing.tooltip.condition1": "Wenn angetrieben",
"block.create.mechanical_bearing.tooltip.behaviour1": "Fängt an, angeschlossene _Drehgerüste_ und an ihnen angebrachte Blöcke zu drehen.", "block.create.mechanical_bearing.tooltip.behaviour1": "Fängt an, angeschlossene _Drehgerüste_ und an ihnen angebrachte Blöcke zu drehen.",
"block.create.windmill_bearing.tooltip": "UNLOCALIZED: WINDMILL BEARING", "block.create.windmill_bearing.tooltip": "UNLOCALIZED: WINDMILL BEARING",
"block.create.windmill_bearing.tooltip.summary": "UNLOCALIZED: Used for harnessing _Rotational Force_ from wind. Attach your own design and watch it spin!", "block.create.windmill_bearing.tooltip.summary": "UNLOCALIZED: Used for harnessing _Rotational Force_ from wind. Attach your own design and watch it spin!",
@ -1639,38 +1650,38 @@
"block.create.rope_pulley.tooltip.condition1": "UNLOCALIZED: When Powered by Kinetics", "block.create.rope_pulley.tooltip.condition1": "UNLOCALIZED: When Powered by Kinetics",
"block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", "block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.",
"block.create.linear_chassis.tooltip": "SCHUBGERÃœST", "block.create.linear_chassis.tooltip": "SCHUBGERÜST",
"block.create.linear_chassis.tooltip.summary": "Eine konfigurierbare Basis für Strukturen, die durch _Mechanische_ _Kolben_ bewegt werden sollen. Diese Blöcke müssen die erste Reihe von Blöcken vor dem Kloben bilden.", "block.create.linear_chassis.tooltip.summary": "Eine konfigurierbare Basis für Strukturen, die durch _Mechanische_ _Kolben_ bewegt werden sollen. Diese Blöcke müssen die erste Reihe von Blöcken vor dem Kloben bilden.",
"block.create.linear_chassis.tooltip.condition1": "Wenn durch einen Mechanischen Kolben bewegt", "block.create.linear_chassis.tooltip.condition1": "Wenn durch einen Mechanischen Kolben bewegt",
"block.create.linear_chassis.tooltip.behaviour1": "_Bewegt_ alle _verbundenen_ _Gerüste_ mit der gleichen Orientierung, und angebrachte Blöcke davor. Wenn der Kolben zurückgezogen wird, werden Blöcke nur zurückgezogen, wenn die Fläche des Gerüsts _klebrig_ ist (Siehe [Strg]).", "block.create.linear_chassis.tooltip.behaviour1": "_Bewegt_ alle _verbundenen_ _Gerüste_ mit der gleichen Orientierung, und angebrachte Blöcke davor. Wenn der Kolben zurückgezogen wird, werden Blöcke nur zurückgezogen, wenn die Fläche des Gerüsts _klebrig_ ist (Siehe [Strg]).",
"block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench",
"block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.",
"block.create.linear_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt", "block.create.linear_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt",
"block.create.linear_chassis.tooltip.action1": "Lässt die Oberfläche _klebrig_ werden. Wenn der Kolben zurückgezogen wird, _zieht_ das Gerüst alle verbundenen Blöcke _zurück_ in seine Spalte und innerhalb der konfigurierten Reichweite.", "block.create.linear_chassis.tooltip.action1": "Lässt die Oberfläche _klebrig_ werden. Wenn der Kolben zurückgezogen wird, _zieht_ das Gerüst alle verbundenen Blöcke _zurück_ in seine Spalte und innerhalb der konfigurierten Reichweite.",
"block.create.secondary_linear_chassis.tooltip": "UNLOCALIZED: SECONDARY LINEAR CHASSIS", "block.create.secondary_linear_chassis.tooltip": "UNLOCALIZED: SECONDARY LINEAR CHASSIS",
"block.create.secondary_linear_chassis.tooltip.summary": "UNLOCALIZED: A second type of _Linear Chassis_ that does not connect to the other.", "block.create.secondary_linear_chassis.tooltip.summary": "UNLOCALIZED: A second type of _Linear Chassis_ that does not connect to the other.",
"block.create.radial_chassis.tooltip": "DREHGERÃœST", "block.create.radial_chassis.tooltip": "DREHGERÜST",
"block.create.radial_chassis.tooltip.summary": "Wird für das Drehen von Strukturen mit dem _Mechanischem_ _Lager_ benutzt.", "block.create.radial_chassis.tooltip.summary": "Wird für das Drehen von Strukturen mit dem _Mechanischem_ _Lager_ benutzt.",
"block.create.radial_chassis.tooltip.condition1": "Wenn durch ein Lager gedreht", "block.create.radial_chassis.tooltip.condition1": "Wenn durch ein Lager gedreht",
"block.create.radial_chassis.tooltip.behaviour1": "_Dreht_ alle an _klebrigen_ Seiten angebrachten Blöcke (Siehe [Strg]) innerhalb der konfigurierten Reichweite um sich. _Ãœberträgt_ die Rotation zu weiter angebrachten Rotationsgerüsten.", "block.create.radial_chassis.tooltip.behaviour1": "_Dreht_ alle an _klebrigen_ Seiten angebrachten Blöcke (Siehe [Strg]) innerhalb der konfigurierten Reichweite um sich. _Überträgt_ die Rotation zu weiter angebrachten Rotationsgerüsten.",
"block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench",
"block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.",
"block.create.radial_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt", "block.create.radial_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt",
"block.create.radial_chassis.tooltip.action1": "Lässt die geklickte Fläche _klebrig_ werden. Wenn das Gerüst gedreht wird, werden alle verbundenen Blöcke an dieser Seite mit dem Gerüst mitgedreht.", "block.create.radial_chassis.tooltip.action1": "Lässt die geklickte Fläche _klebrig_ werden. Wenn das Gerüst gedreht wird, werden alle verbundenen Blöcke an dieser Seite mit dem Gerüst mitgedreht.",
"block.create.mechanical_drill.tooltip": "MECHANISCHER BOHRER", "block.create.mechanical_drill.tooltip": "MECHANISCHER BOHRER",
"block.create.mechanical_drill.tooltip.summary": "Ein mechanisches Gerät, welches sich dazu eignet _Blöcke_ _zu_ _brechen._", "block.create.mechanical_drill.tooltip.summary": "Ein mechanisches Gerät, welches sich dazu eignet _Blöcke_ _zu_ _brechen._",
"block.create.mechanical_drill.tooltip.condition1": "Wenn angetrieben", "block.create.mechanical_drill.tooltip.condition1": "Wenn angetrieben",
"block.create.mechanical_drill.tooltip.behaviour1": "Funktioniert als _stationärer_ Blockbrecher. _Schadet_ außerdem _Wesen_ in seiner effektiven Reichweite.", "block.create.mechanical_drill.tooltip.behaviour1": "Funktioniert als _stationärer_ Blockbrecher. _Schadet_ außerdem _Wesen_ in seiner effektiven Reichweite.",
"block.create.mechanical_drill.tooltip.condition2": "Wenn durch einem Mechanischen Kolben bewegt", "block.create.mechanical_drill.tooltip.condition2": "Wenn durch einem Mechanischen Kolben bewegt",
"block.create.mechanical_drill.tooltip.behaviour2": "Bricht Blöcke die der Bohrer trifft.", "block.create.mechanical_drill.tooltip.behaviour2": "Bricht Blöcke die der Bohrer trifft.",
"block.create.mechanical_harvester.tooltip": "MECHANISCHE ERNTEMASCHINE", "block.create.mechanical_harvester.tooltip": "MECHANISCHE ERNTEMASCHINE",
"block.create.mechanical_harvester.tooltip.summary": "Ein mechanischer Pflanzenschneider für die Automatisierung deiner Ernte.", "block.create.mechanical_harvester.tooltip.summary": "Ein mechanischer Pflanzenschneider für die Automatisierung deiner Ernte.",
"block.create.mechanical_harvester.tooltip.condition1": "Wenn durch einem Mechanischen Kolben bewegt", "block.create.mechanical_harvester.tooltip.condition1": "Wenn durch einem Mechanischen Kolben bewegt",
"block.create.mechanical_harvester.tooltip.behaviour1": "Werden alle _reifen_ _Pflanzen_ _geerntet_, die die Klinge treffen, und auf ihren anfänglichen Wachstumszustand zurückgesetzt.", "block.create.mechanical_harvester.tooltip.behaviour1": "Werden alle _reifen_ _Pflanzen_ _geerntet_, die die Klinge treffen, und auf ihren anfänglichen Wachstumszustand zurückgesetzt.",
"block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH",
"block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.",
@ -1687,7 +1698,7 @@
"block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.", "block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.",
"block.create.stockpile_switch.tooltip": "VORRATSSENSOR", "block.create.stockpile_switch.tooltip": "VORRATSSENSOR",
"block.create.stockpile_switch.tooltip.summary": "Schaltet ein Redstone-Signal ein oder aus, basierend auf der _Speichermenge_ im verbundenen Behälter.", "block.create.stockpile_switch.tooltip.summary": "Schaltet ein Redstone-Signal ein oder aus, basierend auf der _Speichermenge_ im verbundenen Behälter.",
"block.create.stockpile_switch.tooltip.condition1": "Wenn unter dem unteren Limit", "block.create.stockpile_switch.tooltip.condition1": "Wenn unter dem unteren Limit",
"block.create.stockpile_switch.tooltip.behaviour1": "Wird das Redstone-Signal ausgeschaltet.", "block.create.stockpile_switch.tooltip.behaviour1": "Wird das Redstone-Signal ausgeschaltet.",
@ -1695,13 +1706,13 @@
"block.create.content_observer.tooltip.summary": "UNLOCALIZED: _Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.", "block.create.content_observer.tooltip.summary": "UNLOCALIZED: _Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.",
"block.create.redstone_link.tooltip": "REDSTONE-VERBINDUNG", "block.create.redstone_link.tooltip": "REDSTONE-VERBINDUNG",
"block.create.redstone_link.tooltip.summary": "Endpunkte für _Drahtlose_ _Redstone-Verbindungen._ Mithilfe von Gegenständen kann die Frequenz eingestellt werden. Signalreichweite ist begrenzt, aber angemessen.", "block.create.redstone_link.tooltip.summary": "Endpunkte für _Drahtlose_ _Redstone-Verbindungen._ Mithilfe von Gegenständen kann die Frequenz eingestellt werden. Signalreichweite ist begrenzt, aber angemessen.",
"block.create.redstone_link.tooltip.condition1": "Wenn aktiv", "block.create.redstone_link.tooltip.condition1": "Wenn aktiv",
"block.create.redstone_link.tooltip.behaviour1": "Liefern eingehende Verbindungen mit derselben _Frequenz_ ein Redstone-Signal.", "block.create.redstone_link.tooltip.behaviour1": "Liefern eingehende Verbindungen mit derselben _Frequenz_ ein Redstone-Signal.",
"block.create.redstone_link.tooltip.control1": "Wenn mit einem Gegenstand R-geklickt", "block.create.redstone_link.tooltip.control1": "Wenn mit einem Gegenstand R-geklickt",
"block.create.redstone_link.tooltip.action1": "Setzt die _Frequenz_ auf diesen Gegenstand. Insgesamt können _zwei_ _verschiedene_ _Gegenstände_ benutzt werden, um die Frequenz zu definieren.", "block.create.redstone_link.tooltip.action1": "Setzt die _Frequenz_ auf diesen Gegenstand. Insgesamt können _zwei_ _verschiedene_ _Gegenstände_ benutzt werden, um die Frequenz zu definieren.",
"block.create.redstone_link.tooltip.control2": "Wenn während dem Schleichen R-geklickt", "block.create.redstone_link.tooltip.control2": "Wenn während dem Schleichen R-geklickt",
"block.create.redstone_link.tooltip.action2": "Schaltet zwischen _Empfänger-_ und _Transmittermodus_ um.", "block.create.redstone_link.tooltip.action2": "Schaltet zwischen _Empfänger-_ und _Transmittermodus_ um.",
"block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE",
"block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ and _Text Display_.", "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ and _Text Display_.",
@ -1711,19 +1722,19 @@
"block.create.nixie_tube.tooltip.behaviour2": "UNLOCALIZED: Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.", "block.create.nixie_tube.tooltip.behaviour2": "UNLOCALIZED: Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.",
"block.create.redstone_contact.tooltip": "REDSTONE-KONTAKT", "block.create.redstone_contact.tooltip": "REDSTONE-KONTAKT",
"block.create.redstone_contact.tooltip.summary": "Ein einfaches Gerät für fortgeschrittene Redstone-Apparate.", "block.create.redstone_contact.tooltip.summary": "Ein einfaches Gerät für fortgeschrittene Redstone-Apparate.",
"block.create.redstone_contact.tooltip.condition1": "Wenn gegenüber einem anderen Kontakt", "block.create.redstone_contact.tooltip.condition1": "Wenn gegenüber einem anderen Kontakt",
"block.create.redstone_contact.tooltip.behaviour1": "Liefert ein _Redstone-Signal._", "block.create.redstone_contact.tooltip.behaviour1": "Liefert ein _Redstone-Signal._",
"block.create.redstone_contact.tooltip.condition2": "Wenn durch einen Mechanischen Kolben bewegt", "block.create.redstone_contact.tooltip.condition2": "Wenn durch einen Mechanischen Kolben bewegt",
"block.create.redstone_contact.tooltip.behaviour2": "Löst im Vorbeifahren stationären Kontakte aus", "block.create.redstone_contact.tooltip.behaviour2": "Löst im Vorbeifahren stationären Kontakte aus",
"block.create.adjustable_crate.tooltip": "adjustable_crate", "block.create.adjustable_crate.tooltip": "adjustable_crate",
"block.create.adjustable_crate.tooltip.summary": "Dieser _Speicherbehälter_ erlaubt manuelle Kontrolle über seine Kapazität. Er kann bis zu _16_ _Stacks_ von jeglichem Gegenstand beinhalten.", "block.create.adjustable_crate.tooltip.summary": "Dieser _Speicherbehälter_ erlaubt manuelle Kontrolle über seine Kapazität. Er kann bis zu _16_ _Stacks_ von jeglichem Gegenstand beinhalten.",
"block.create.adjustable_crate.tooltip.control1": "Wenn R-geklickt", "block.create.adjustable_crate.tooltip.control1": "Wenn R-geklickt",
"block.create.adjustable_crate.tooltip.action1": "Ãffnet das _Menü_", "block.create.adjustable_crate.tooltip.action1": "Öffnet das _Menü_",
"block.create.creative_crate.tooltip": "BAUPLANKANONENMACHER", "block.create.creative_crate.tooltip": "BAUPLANKANONENMACHER",
"block.create.creative_crate.tooltip.summary": "Stellt einen unendlichen Vorrat an Blöcken für benachbarte _Bauplaenkanonen_ bereit.", "block.create.creative_crate.tooltip.summary": "Stellt einen unendlichen Vorrat an Blöcken für benachbarte _Bauplaenkanonen_ bereit.",
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
@ -1739,11 +1750,11 @@
"block.create.brass_casing.tooltip": "UNLOCALIZED: BRASS CASING", "block.create.brass_casing.tooltip": "UNLOCALIZED: BRASS CASING",
"block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._", "block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._",
"block.create.pulse_repeater.tooltip": "PULSIERENDER VERSTÄRKER", "block.create.pulse_repeater.tooltip": "PULSIERENDER VERSTÄRKER",
"block.create.pulse_repeater.tooltip.summary": "Ein einfacher Schaltkreis, um durchgehende Redstone-Signale auf eine Länge von _1_ _tick_ zu reduzieren.", "block.create.pulse_repeater.tooltip.summary": "Ein einfacher Schaltkreis, um durchgehende Redstone-Signale auf eine Länge von _1_ _tick_ zu reduzieren.",
"block.create.adjustable_repeater.tooltip": "VERZÃGERNDER VERSTÄRKER", "block.create.adjustable_repeater.tooltip": "VERZÖGERNDER VERSTÄRKER",
"block.create.adjustable_repeater.tooltip.summary": "Ein fortgeschrittener _Redstone-Verstärker_ mit einer _konfigurierbaren_ _Verzögerung_ von bis zu 30 Minuten.", "block.create.adjustable_repeater.tooltip.summary": "Ein fortgeschrittener _Redstone-Verstärker_ mit einer _konfigurierbaren_ _Verzögerung_ von bis zu 30 Minuten.",
"block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER", "block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER",
"block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse Repeater_ with a _configurable Delay_ up to 30 Minutes.", "block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse Repeater_ with a _configurable Delay_ up to 30 Minutes.",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1430", "_": "Missing Localizations: 1440",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -23,27 +23,27 @@
"block.create.andesite_encased_shaft": "Eje empotrado de Andesita", "block.create.andesite_encased_shaft": "Eje empotrado de Andesita",
"block.create.andesite_funnel": "Embudo de Andesita", "block.create.andesite_funnel": "Embudo de Andesita",
"block.create.andesite_pillar": "Pilar de Andesita", "block.create.andesite_pillar": "Pilar de Andesita",
"block.create.andesite_tunnel": "Túnel de Andesita", "block.create.andesite_tunnel": "Túnel de Andesita",
"block.create.basin": "Cuenco", "block.create.basin": "Cuenco",
"block.create.belt": "Correa", "block.create.belt": "Correa",
"block.create.birch_window": "Ventana de Abedul", "block.create.birch_window": "Ventana de Abedul",
"block.create.birch_window_pane": "Panel de Ventana de Abedul", "block.create.birch_window_pane": "Panel de Ventana de Abedul",
"block.create.black_sail": "Vela Negra", "block.create.black_sail": "Vela Negra",
"block.create.black_seat": "Asiento Negro", "block.create.black_seat": "Asiento Negro",
"block.create.black_valve_handle": "Manija de Válvula Negra", "block.create.black_valve_handle": "Manija de Válvula Negra",
"block.create.blaze_burner": "Quemador de Blaze", "block.create.blaze_burner": "Quemador de Blaze",
"block.create.blue_sail": "Vela Azul", "block.create.blue_sail": "Vela Azul",
"block.create.blue_seat": "Asiento Azul", "block.create.blue_seat": "Asiento Azul",
"block.create.blue_valve_handle": "Manija de Válvula Azul", "block.create.blue_valve_handle": "Manija de Válvula Azul",
"block.create.brass_belt_funnel": "UNLOCALIZED:Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED:Brass Belt Funnel",
"block.create.brass_block": "Bloque de Latón", "block.create.brass_block": "Bloque de Latón",
"block.create.brass_casing": "Carcasa de Latón", "block.create.brass_casing": "Carcasa de Latón",
"block.create.brass_encased_shaft": "Eje empotrado de Latón", "block.create.brass_encased_shaft": "Eje empotrado de Latón",
"block.create.brass_funnel": "Embudo de Latón", "block.create.brass_funnel": "Embudo de Latón",
"block.create.brass_tunnel": "Túnel de Latón", "block.create.brass_tunnel": "Túnel de Latón",
"block.create.brown_sail": "Vela Café", "block.create.brown_sail": "Vela Café",
"block.create.brown_seat": "Asiento Café ", "block.create.brown_seat": "Asiento Café ",
"block.create.brown_valve_handle": "Manija de Válvula Café", "block.create.brown_valve_handle": "Manija de Válvula Café",
"block.create.cart_assembler": "Ensamblador de Vagonetas", "block.create.cart_assembler": "Ensamblador de Vagonetas",
"block.create.chiseled_dark_scoria": "Escoria Oscura Grabada", "block.create.chiseled_dark_scoria": "Escoria Oscura Grabada",
"block.create.chiseled_dolomite": "Dolomita Grabada", "block.create.chiseled_dolomite": "Dolomita Grabada",
@ -57,24 +57,24 @@
"block.create.clutch": "Embrague", "block.create.clutch": "Embrague",
"block.create.cogwheel": "Rueda Dentada", "block.create.cogwheel": "Rueda Dentada",
"block.create.content_observer": "Observador de Contenido", "block.create.content_observer": "Observador de Contenido",
"block.create.controller_rail": "Vía de Control", "block.create.controller_rail": "Vía de Control",
"block.create.copper_block": "Bloque de Cobre", "block.create.copper_block": "Bloque de Cobre",
"block.create.copper_casing": "Carcasa de Cobre", "block.create.copper_casing": "Carcasa de Cobre",
"block.create.copper_ore": "Mineral de Cobre", "block.create.copper_ore": "Mineral de Cobre",
"block.create.copper_shingles": "Techado de Cobre", "block.create.copper_shingles": "Techado de Cobre",
"block.create.copper_tiles": "Baldosas de Cobre", "block.create.copper_tiles": "Baldosas de Cobre",
"block.create.copper_valve_handle": "Manija de Válvula de Cobre", "block.create.copper_valve_handle": "Manija de Válvula de Cobre",
"block.create.creative_crate": "Caja del Creativo", "block.create.creative_crate": "Caja del Creativo",
"block.create.creative_fluid_tank": "Tanque de Fluido del Creativo", "block.create.creative_fluid_tank": "Tanque de Fluido del Creativo",
"block.create.creative_motor": "Motor del Creativo", "block.create.creative_motor": "Motor del Creativo",
"block.create.crimson_window": "Ventana Carmesí", "block.create.crimson_window": "Ventana Carmesí",
"block.create.crimson_window_pane": "Panel de Ventana Carmesí", "block.create.crimson_window_pane": "Panel de Ventana Carmesí",
"block.create.crushing_wheel": "Rueda Trituradora", "block.create.crushing_wheel": "Rueda Trituradora",
"block.create.crushing_wheel_controller": "UNLOCALIZED:Crushing Wheel Controller", "block.create.crushing_wheel_controller": "UNLOCALIZED:Crushing Wheel Controller",
"block.create.cuckoo_clock": "Reloj Cuco", "block.create.cuckoo_clock": "Reloj Cuco",
"block.create.cyan_sail": "Vela Cian", "block.create.cyan_sail": "Vela Cian",
"block.create.cyan_seat": "Asiento Cian", "block.create.cyan_seat": "Asiento Cian",
"block.create.cyan_valve_handle": "Manija de Válvula Cian", "block.create.cyan_valve_handle": "Manija de Válvula Cian",
"block.create.dark_oak_window": "Ventana de Roble Oscuro", "block.create.dark_oak_window": "Ventana de Roble Oscuro",
"block.create.dark_oak_window_pane": "Panel de Ventana de Roble Oscuro", "block.create.dark_oak_window_pane": "Panel de Ventana de Roble Oscuro",
"block.create.dark_scoria": "Escoria Oscura", "block.create.dark_scoria": "Escoria Oscura",
@ -88,7 +88,7 @@
"block.create.dark_scoria_cobblestone_wall": "Pared de Piedra Labrada de Escoria Oscura", "block.create.dark_scoria_cobblestone_wall": "Pared de Piedra Labrada de Escoria Oscura",
"block.create.dark_scoria_pillar": "Pilar de Escoria Oscura", "block.create.dark_scoria_pillar": "Pilar de Escoria Oscura",
"block.create.deployer": "Desplegador", "block.create.deployer": "Desplegador",
"block.create.depot": "Depósito", "block.create.depot": "Depósito",
"block.create.diorite_bricks": "Ladrillos de Diorita", "block.create.diorite_bricks": "Ladrillos de Diorita",
"block.create.diorite_bricks_slab": "Losa de Ladrillos de Diorita", "block.create.diorite_bricks_slab": "Losa de Ladrillos de Diorita",
"block.create.diorite_bricks_stairs": "Escaleras de Ladrillos de Diorita", "block.create.diorite_bricks_stairs": "Escaleras de Ladrillos de Diorita",
@ -108,9 +108,9 @@
"block.create.dolomite_cobblestone_stairs": "Escaleras de Piedra Labrada de Dolomita", "block.create.dolomite_cobblestone_stairs": "Escaleras de Piedra Labrada de Dolomita",
"block.create.dolomite_cobblestone_wall": "Pared de Piedra Labrada de Dolomita", "block.create.dolomite_cobblestone_wall": "Pared de Piedra Labrada de Dolomita",
"block.create.dolomite_pillar": "Pilar de Dolomita", "block.create.dolomite_pillar": "Pilar de Dolomita",
"block.create.encased_chain_drive": "Transmisión de Cadena Empotrada", "block.create.encased_chain_drive": "Transmisión de Cadena Empotrada",
"block.create.encased_fan": "Ventilador Acoplado", "block.create.encased_fan": "Ventilador Acoplado",
"block.create.encased_fluid_pipe": "Tubería de Fluidos Recubierta", "block.create.encased_fluid_pipe": "Tubería de Fluidos Recubierta",
"block.create.fancy_andesite_bricks": "Ladrillos de Andesita Elegantes", "block.create.fancy_andesite_bricks": "Ladrillos de Andesita Elegantes",
"block.create.fancy_andesite_bricks_slab": "Losa de Ladrillos de Andesita Elegantes", "block.create.fancy_andesite_bricks_slab": "Losa de Ladrillos de Andesita Elegantes",
"block.create.fancy_andesite_bricks_stairs": "Escaleras de Ladrillos de Andesita Elegantes", "block.create.fancy_andesite_bricks_stairs": "Escaleras de Ladrillos de Andesita Elegantes",
@ -147,9 +147,9 @@
"block.create.fancy_weathered_limestone_bricks_slab": "Losa de Ladrillos de Caliza Meteorizada Elegantes", "block.create.fancy_weathered_limestone_bricks_slab": "Losa de Ladrillos de Caliza Meteorizada Elegantes",
"block.create.fancy_weathered_limestone_bricks_stairs": "Escaleras de Ladrillos de Caliza Meteorizada Elegantes", "block.create.fancy_weathered_limestone_bricks_stairs": "Escaleras de Ladrillos de Caliza Meteorizada Elegantes",
"block.create.fancy_weathered_limestone_bricks_wall": "Pared de Ladrillos de Caliza Meteorizada Elegantes", "block.create.fancy_weathered_limestone_bricks_wall": "Pared de Ladrillos de Caliza Meteorizada Elegantes",
"block.create.fluid_pipe": "Tubería de Fluidos", "block.create.fluid_pipe": "Tubería de Fluidos",
"block.create.fluid_tank": "Tanque de Fluidos", "block.create.fluid_tank": "Tanque de Fluidos",
"block.create.fluid_valve": "Válvula de Fluidos", "block.create.fluid_valve": "Válvula de Fluidos",
"block.create.flywheel": "Rueda de Inercia", "block.create.flywheel": "Rueda de Inercia",
"block.create.framed_glass": "Vidrio Enmarcado", "block.create.framed_glass": "Vidrio Enmarcado",
"block.create.framed_glass_pane": "Panel de Vidrio Enmarcado", "block.create.framed_glass_pane": "Panel de Vidrio Enmarcado",
@ -166,9 +166,9 @@
"block.create.gabbro_pillar": "Pilar de Gabro", "block.create.gabbro_pillar": "Pilar de Gabro",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Transmisión", "block.create.gearbox": "Transmisión",
"block.create.gearshift": "Cambio de Marcha", "block.create.gearshift": "Cambio de Marcha",
"block.create.glass_fluid_pipe": "Tubería de Fluidos de Vidrio", "block.create.glass_fluid_pipe": "Tubería de Fluidos de Vidrio",
"block.create.granite_bricks": "Ladrillos de Granito", "block.create.granite_bricks": "Ladrillos de Granito",
"block.create.granite_bricks_slab": "Losa de Ladrillos de Granito", "block.create.granite_bricks_slab": "Losa de Ladrillos de Granito",
"block.create.granite_bricks_stairs": "Escaleras de Ladrillos de Granito", "block.create.granite_bricks_stairs": "Escaleras de Ladrillos de Granito",
@ -180,10 +180,10 @@
"block.create.granite_pillar": "Pilar de Granito", "block.create.granite_pillar": "Pilar de Granito",
"block.create.gray_sail": "Vela Gris", "block.create.gray_sail": "Vela Gris",
"block.create.gray_seat": "Asiento Gris", "block.create.gray_seat": "Asiento Gris",
"block.create.gray_valve_handle": "Manija de Válvula Gris", "block.create.gray_valve_handle": "Manija de Válvula Gris",
"block.create.green_sail": "Vela Verde", "block.create.green_sail": "Vela Verde",
"block.create.green_seat": "Asiento Verde", "block.create.green_seat": "Asiento Verde",
"block.create.green_valve_handle": "Manija de Válvula Verde", "block.create.green_valve_handle": "Manija de Válvula Verde",
"block.create.hand_crank": "Manivela", "block.create.hand_crank": "Manivela",
"block.create.honey": "Miel", "block.create.honey": "Miel",
"block.create.horizontal_framed_glass": "Vidrio Enmarcado Horizontal", "block.create.horizontal_framed_glass": "Vidrio Enmarcado Horizontal",
@ -204,13 +204,13 @@
"block.create.layered_weathered_limestone": "Caliza Meteorizada en Capas", "block.create.layered_weathered_limestone": "Caliza Meteorizada en Capas",
"block.create.light_blue_sail": "Vela Azul Claro", "block.create.light_blue_sail": "Vela Azul Claro",
"block.create.light_blue_seat": "Asiento Azul Claro", "block.create.light_blue_seat": "Asiento Azul Claro",
"block.create.light_blue_valve_handle": "Manija de Válvula Azul Claro", "block.create.light_blue_valve_handle": "Manija de Válvula Azul Claro",
"block.create.light_gray_sail": "Vela Gris Claro", "block.create.light_gray_sail": "Vela Gris Claro",
"block.create.light_gray_seat": "Asiento Gris Claro", "block.create.light_gray_seat": "Asiento Gris Claro",
"block.create.light_gray_valve_handle": "Manija de Válvula Gris Claro", "block.create.light_gray_valve_handle": "Manija de Válvula Gris Claro",
"block.create.lime_sail": "Vela Verde Lima", "block.create.lime_sail": "Vela Verde Lima",
"block.create.lime_seat": "Asiento Verde Lima", "block.create.lime_seat": "Asiento Verde Lima",
"block.create.lime_valve_handle": "Manija de Válvula Verde Lima", "block.create.lime_valve_handle": "Manija de Válvula Verde Lima",
"block.create.limesand": "Arena de Caliza", "block.create.limesand": "Arena de Caliza",
"block.create.limestone": "Caliza", "block.create.limestone": "Caliza",
"block.create.limestone_bricks": "Ladrillos de Caliza", "block.create.limestone_bricks": "Ladrillos de Caliza",
@ -226,19 +226,19 @@
"block.create.lit_blaze_burner": "Quemador de Blaze Iluminado", "block.create.lit_blaze_burner": "Quemador de Blaze Iluminado",
"block.create.magenta_sail": "Vela Magenta", "block.create.magenta_sail": "Vela Magenta",
"block.create.magenta_seat": "Asiento Magenta", "block.create.magenta_seat": "Asiento Magenta",
"block.create.magenta_valve_handle": "Manija de Válvula Magenta", "block.create.magenta_valve_handle": "Manija de Válvula Magenta",
"block.create.mechanical_arm": "Brazo Mecánico", "block.create.mechanical_arm": "Brazo Mecánico",
"block.create.mechanical_bearing": "Rodamiento Mecánico", "block.create.mechanical_bearing": "Rodamiento Mecánico",
"block.create.mechanical_crafter": "Crafter Mecánico", "block.create.mechanical_crafter": "Crafter Mecánico",
"block.create.mechanical_drill": "Taladro Mecánico", "block.create.mechanical_drill": "Taladro Mecánico",
"block.create.mechanical_harvester": "Cosechador Mecánico", "block.create.mechanical_harvester": "Cosechador Mecánico",
"block.create.mechanical_mixer": "Mezcladora Mecánica", "block.create.mechanical_mixer": "Mezcladora Mecánica",
"block.create.mechanical_piston": "Pistón Mecánico", "block.create.mechanical_piston": "Pistón Mecánico",
"block.create.mechanical_piston_head": "Cabeza de Pistón Mecánico", "block.create.mechanical_piston_head": "Cabeza de Pistón Mecánico",
"block.create.mechanical_plough": "Arado Mecánico", "block.create.mechanical_plough": "Arado Mecánico",
"block.create.mechanical_press": "Prensa Mecánica", "block.create.mechanical_press": "Prensa Mecánica",
"block.create.mechanical_pump": "Bomba Mecánica", "block.create.mechanical_pump": "Bomba Mecánica",
"block.create.mechanical_saw": "Sierra Mecánica", "block.create.mechanical_saw": "Sierra Mecánica",
"block.create.metal_bracket": "Soporte de Metal", "block.create.metal_bracket": "Soporte de Metal",
"block.create.millstone": "Molino", "block.create.millstone": "Molino",
"block.create.minecart_anchor": "Ancla de Vagonetas", "block.create.minecart_anchor": "Ancla de Vagonetas",
@ -259,7 +259,7 @@
"block.create.oak_window_pane": "Panel de Ventana de Roble", "block.create.oak_window_pane": "Panel de Ventana de Roble",
"block.create.orange_sail": "Vela Naranja", "block.create.orange_sail": "Vela Naranja",
"block.create.orange_seat": "Asiento Naranja", "block.create.orange_seat": "Asiento Naranja",
"block.create.orange_valve_handle": "Manija de Válvula Naranja", "block.create.orange_valve_handle": "Manija de Válvula Naranja",
"block.create.ornate_iron_window": "Ventana Ornamentada", "block.create.ornate_iron_window": "Ventana Ornamentada",
"block.create.ornate_iron_window_pane": "Panel de Ventana Ornamentada", "block.create.ornate_iron_window_pane": "Panel de Ventana Ornamentada",
"block.create.overgrown_andesite": "Andesita Descuidada", "block.create.overgrown_andesite": "Andesita Descuidada",
@ -309,8 +309,8 @@
"block.create.paved_weathered_limestone_wall": "Pared de Caliza Meteorizada Pavimentada", "block.create.paved_weathered_limestone_wall": "Pared de Caliza Meteorizada Pavimentada",
"block.create.pink_sail": "Vela Rosa", "block.create.pink_sail": "Vela Rosa",
"block.create.pink_seat": "Asiento Rosa", "block.create.pink_seat": "Asiento Rosa",
"block.create.pink_valve_handle": "Manija de Válvula Rosa", "block.create.pink_valve_handle": "Manija de Válvula Rosa",
"block.create.piston_extension_pole": "Poste de Extensión de Pistón", "block.create.piston_extension_pole": "Poste de Extensión de Pistón",
"block.create.polished_dark_scoria": "Escoria Oscura Pulida", "block.create.polished_dark_scoria": "Escoria Oscura Pulida",
"block.create.polished_dark_scoria_slab": "Losa de Escoria Oscura Pulida", "block.create.polished_dark_scoria_slab": "Losa de Escoria Oscura Pulida",
"block.create.polished_dark_scoria_stairs": "Escaleras de Escoria Oscura Pulida", "block.create.polished_dark_scoria_stairs": "Escaleras de Escoria Oscura Pulida",
@ -339,25 +339,25 @@
"block.create.portable_storage_interface": "Interfaz de Almacenamiento Portable", "block.create.portable_storage_interface": "Interfaz de Almacenamiento Portable",
"block.create.powered_latch": "Cerradura Electrica", "block.create.powered_latch": "Cerradura Electrica",
"block.create.powered_toggle_latch": "Cerradura Electrica de Palanca", "block.create.powered_toggle_latch": "Cerradura Electrica de Palanca",
"block.create.pulley_magnet": "Polea con Imán", "block.create.pulley_magnet": "Polea con Imán",
"block.create.pulse_repeater": "Repetidor de Pulso", "block.create.pulse_repeater": "Repetidor de Pulso",
"block.create.purple_sail": "Vela Morada", "block.create.purple_sail": "Vela Morada",
"block.create.purple_seat": "Asiento Morado", "block.create.purple_seat": "Asiento Morado",
"block.create.purple_valve_handle": "Manija de Válvula Morada", "block.create.purple_valve_handle": "Manija de Válvula Morada",
"block.create.radial_chassis": "Chasis Radial", "block.create.radial_chassis": "Chasis Radial",
"block.create.red_sail": "Vela Roja", "block.create.red_sail": "Vela Roja",
"block.create.red_seat": "Asiento Rojo", "block.create.red_seat": "Asiento Rojo",
"block.create.red_valve_handle": "Manija de Válvula Roja", "block.create.red_valve_handle": "Manija de Válvula Roja",
"block.create.redstone_contact": "Contacto de Redstone", "block.create.redstone_contact": "Contacto de Redstone",
"block.create.redstone_link": "Enlace de Redstone", "block.create.redstone_link": "Enlace de Redstone",
"block.create.refined_radiance_casing": "Carcasa Radiante", "block.create.refined_radiance_casing": "Carcasa Radiante",
"block.create.reinforced_rail": "Vía Reforzada", "block.create.reinforced_rail": "Vía Reforzada",
"block.create.rope": "Cuerda", "block.create.rope": "Cuerda",
"block.create.rope_pulley": "Polea con Cuerda", "block.create.rope_pulley": "Polea con Cuerda",
"block.create.rotation_speed_controller": "Controlador de Velocidad de Rotación", "block.create.rotation_speed_controller": "Controlador de Velocidad de Rotación",
"block.create.sail_frame": "Marco de Vela", "block.create.sail_frame": "Marco de Vela",
"block.create.schematic_table": "Mesa de Esquemas", "block.create.schematic_table": "Mesa de Esquemas",
"block.create.schematicannon": "Esquemacañon", "block.create.schematicannon": "Esquemacañon",
"block.create.scoria": "Escoria", "block.create.scoria": "Escoria",
"block.create.scoria_bricks": "Ladrillos de Escoria", "block.create.scoria_bricks": "Ladrillos de Escoria",
"block.create.scoria_bricks_slab": "Losa de Ladrillos de Escoria", "block.create.scoria_bricks_slab": "Losa de Ladrillos de Escoria",
@ -370,18 +370,18 @@
"block.create.scoria_pillar": "Pilar de Escoria", "block.create.scoria_pillar": "Pilar de Escoria",
"block.create.secondary_linear_chassis": "Chasis Lineal Secundario", "block.create.secondary_linear_chassis": "Chasis Lineal Secundario",
"block.create.sequenced_gearshift": "Cambio de Marcha Secuenciado", "block.create.sequenced_gearshift": "Cambio de Marcha Secuenciado",
"block.create.shadow_steel_casing": "Carcasa Sombría", "block.create.shadow_steel_casing": "Carcasa Sombría",
"block.create.shaft": "Eje", "block.create.shaft": "Eje",
"block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_chute": "UNLOCALIZED: Smart Chute",
"block.create.smart_fluid_pipe": "Tubería de Fluidos Inteligente", "block.create.smart_fluid_pipe": "Tubería de Fluidos Inteligente",
"block.create.speedometer": "Velocímetro", "block.create.speedometer": "Velocímetro",
"block.create.spout": "Canaleta", "block.create.spout": "Canaleta",
"block.create.spruce_window": "Ventana de Abeto", "block.create.spruce_window": "Ventana de Abeto",
"block.create.spruce_window_pane": "Panel de Ventana de Abeto", "block.create.spruce_window_pane": "Panel de Ventana de Abeto",
"block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Pistón Mecánico Pegajoso", "block.create.sticky_mechanical_piston": "Pistón Mecánico Pegajoso",
"block.create.stockpile_switch": "Interruptor de Pila", "block.create.stockpile_switch": "Interruptor de Pila",
"block.create.stressometer": "Estresómetro", "block.create.stressometer": "Estresómetro",
"block.create.tiled_glass": "Vidrio de Azulejos", "block.create.tiled_glass": "Vidrio de Azulejos",
"block.create.tiled_glass_pane": "Panel de Vidrio de Azulejos", "block.create.tiled_glass_pane": "Panel de Vidrio de Azulejos",
"block.create.turntable": "Mesa Giratoria", "block.create.turntable": "Mesa Giratoria",
@ -389,7 +389,7 @@
"block.create.vertical_framed_glass_pane": "Panel de Vidrio Enmarcado Vertical", "block.create.vertical_framed_glass_pane": "Panel de Vidrio Enmarcado Vertical",
"block.create.warped_window": "Ventana Distorsionada", "block.create.warped_window": "Ventana Distorsionada",
"block.create.warped_window_pane": "Panel de ventana Distorsionada", "block.create.warped_window_pane": "Panel de ventana Distorsionada",
"block.create.water_wheel": "Rueda Hidráulica", "block.create.water_wheel": "Rueda Hidráulica",
"block.create.weathered_limestone": "Caliza Meteorizada", "block.create.weathered_limestone": "Caliza Meteorizada",
"block.create.weathered_limestone_bricks": "Ladrillos de Caliza Meteorizada", "block.create.weathered_limestone_bricks": "Ladrillos de Caliza Meteorizada",
"block.create.weathered_limestone_bricks_slab": "Losa de Caliza Meteorizada", "block.create.weathered_limestone_bricks_slab": "Losa de Caliza Meteorizada",
@ -400,14 +400,15 @@
"block.create.weathered_limestone_cobblestone_stairs": "Escaleras de Piedra Labrada de Caliza Meteorizada", "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_cobblestone_wall": "Pared de Piedra Labrada de Caliza Meteorizada",
"block.create.weathered_limestone_pillar": "Pilar 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_sail": "Vela Blanca",
"block.create.white_seat": "Asiento Blanco", "block.create.white_seat": "Asiento Blanco",
"block.create.white_valve_handle": "Manija de Válvula Blanca", "block.create.white_valve_handle": "Manija de Válvula Blanca",
"block.create.windmill_bearing": "Rodamiento de Molino de Viento", "block.create.windmill_bearing": "Rodamiento de Molino de Viento",
"block.create.wooden_bracket": "Soporte de Madera", "block.create.wooden_bracket": "Soporte de Madera",
"block.create.yellow_sail": "Vela Amarilla", "block.create.yellow_sail": "Vela Amarilla",
"block.create.yellow_seat": "Asiento Amarillo", "block.create.yellow_seat": "Asiento Amarillo",
"block.create.yellow_valve_handle": "Manija de Válvula Amarilla", "block.create.yellow_valve_handle": "Manija de Válvula Amarilla",
"block.create.zinc_block": "Bloque de Zinc", "block.create.zinc_block": "Bloque de Zinc",
"block.create.zinc_ore": "Mineral de Zinc", "block.create.zinc_ore": "Mineral de Zinc",
@ -418,31 +419,31 @@
"entity.create.super_glue": "Super Pegamento", "entity.create.super_glue": "Super Pegamento",
"fluid.create.milk": "Leche", "fluid.create.milk": "Leche",
"fluid.create.potion": "Poción", "fluid.create.potion": "Poción",
"fluid.create.tea": "Té del Constructor", "fluid.create.tea": "Té del Constructor",
"item.create.andesite_alloy": "Aleación de Andesita", "item.create.andesite_alloy": "Aleación de Andesita",
"item.create.attribute_filter": "Filtro por Atributos", "item.create.attribute_filter": "Filtro por Atributos",
"item.create.bar_of_chocolate": "Barra de Chocolate", "item.create.bar_of_chocolate": "Barra de Chocolate",
"item.create.belt_connector": "Conector de Correa", "item.create.belt_connector": "Conector de Correa",
"item.create.blaze_cake": "Pastel de Blaze", "item.create.blaze_cake": "Pastel de Blaze",
"item.create.blaze_cake_base": "Base de Pastel de Blaze", "item.create.blaze_cake_base": "Base de Pastel de Blaze",
"item.create.brass_hand": "Mano de Latón", "item.create.brass_hand": "Mano de Latón",
"item.create.brass_ingot": "Lingote de Latón", "item.create.brass_ingot": "Lingote de Latón",
"item.create.brass_nugget": "Pepita de Latón", "item.create.brass_nugget": "Pepita de Latón",
"item.create.brass_sheet": "Lámina de Latón", "item.create.brass_sheet": "Lámina de Latón",
"item.create.builders_tea": "Té del Constructor", "item.create.builders_tea": "Té del Constructor",
"item.create.chest_minecart_contraption": "Artefacto de Vagón con Cofre", "item.create.chest_minecart_contraption": "Artefacto de Vagón con Cofre",
"item.create.chocolate_bucket": "Cubeta de Chocolate", "item.create.chocolate_bucket": "Cubeta de Chocolate",
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "Compuesto Cromático", "item.create.chromatic_compound": "Compuesto Cromático",
"item.create.cinder_flour": "Ceniza Molida", "item.create.cinder_flour": "Ceniza Molida",
"item.create.copper_ingot": "Lingote de Cobre", "item.create.copper_ingot": "Lingote de Cobre",
"item.create.copper_nugget": "Pepita de Cobre", "item.create.copper_nugget": "Pepita de Cobre",
"item.create.copper_sheet": "Lámina de Cobre", "item.create.copper_sheet": "Lámina de Cobre",
"item.create.crafter_slot_cover": "Cubierta de Ranura del Crafter", "item.create.crafter_slot_cover": "Cubierta de Ranura del Crafter",
"item.create.crushed_aluminum_ore": "Mineral de Aluminio Molido", "item.create.crushed_aluminum_ore": "Mineral de Aluminio Molido",
"item.create.crushed_brass": "Latón Molido", "item.create.crushed_brass": "Latón Molido",
"item.create.crushed_copper_ore": "Mineral de Cobre Molido", "item.create.crushed_copper_ore": "Mineral de Cobre Molido",
"item.create.crushed_gold_ore": "Mineral de Oro Molido", "item.create.crushed_gold_ore": "Mineral de Oro Molido",
"item.create.crushed_iron_ore": "Mineral de Hierro Molido", "item.create.crushed_iron_ore": "Mineral de Hierro Molido",
@ -452,42 +453,42 @@
"item.create.crushed_platinum_ore": "Mineral de Platino Molido", "item.create.crushed_platinum_ore": "Mineral de Platino Molido",
"item.create.crushed_quicksilver_ore": "Mineral de Mercurio Molido", "item.create.crushed_quicksilver_ore": "Mineral de Mercurio Molido",
"item.create.crushed_silver_ore": "Mineral de Plata Molido", "item.create.crushed_silver_ore": "Mineral de Plata Molido",
"item.create.crushed_tin_ore": "Mineral de Estaño Molido", "item.create.crushed_tin_ore": "Mineral de Estaño Molido",
"item.create.crushed_uranium_ore": "Mineral de Uranio Molido", "item.create.crushed_uranium_ore": "Mineral de Uranio Molido",
"item.create.crushed_zinc_ore": "Mineral de Zinc Molido", "item.create.crushed_zinc_ore": "Mineral de Zinc Molido",
"item.create.deforester": "Deforestador", "item.create.deforester": "Deforestador",
"item.create.dough": "Masa", "item.create.dough": "Masa",
"item.create.electron_tube": "Válvula Electrónica", "item.create.electron_tube": "Válvula Electrónica",
"item.create.empty_blaze_burner": "Quemador de Blaze Vacío", "item.create.empty_blaze_burner": "Quemador de Blaze Vacío",
"item.create.empty_schematic": "Esquema Vacío", "item.create.empty_schematic": "Esquema Vacío",
"item.create.extendo_grip": "Brazo Extensor", "item.create.extendo_grip": "Brazo Extensor",
"item.create.filter": "Filtro", "item.create.filter": "Filtro",
"item.create.furnace_minecart_contraption": "Artefacto de Vagón con Horno", "item.create.furnace_minecart_contraption": "Artefacto de Vagón con Horno",
"item.create.goggles": "Gafas de Protección para Ingenieros", "item.create.goggles": "Gafas de Protección para Ingenieros",
"item.create.golden_sheet": "Lámina de Oro", "item.create.golden_sheet": "Lámina de Oro",
"item.create.handheld_blockzapper": "Pistola de Manipulación de Bloques", "item.create.handheld_blockzapper": "Pistola de Manipulación de Bloques",
"item.create.handheld_worldshaper": "Pistola de Manipulación de Mundo", "item.create.handheld_worldshaper": "Pistola de Manipulación de Mundo",
"item.create.honey_bucket": "Cubeta de Miel", "item.create.honey_bucket": "Cubeta de Miel",
"item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple",
"item.create.integrated_circuit": "Circuito Integrado", "item.create.integrated_circuit": "Circuito Integrado",
"item.create.iron_sheet": "Lámina de Hierro", "item.create.iron_sheet": "Lámina de Hierro",
"item.create.lapis_sheet": "Lámina de Lapislázuli", "item.create.lapis_sheet": "Lámina de Lapislázuli",
"item.create.minecart_contraption": "Artefacto de Vagón", "item.create.minecart_contraption": "Artefacto de Vagón",
"item.create.minecart_coupling": "Acoplamiento de Vagonetas", "item.create.minecart_coupling": "Acoplamiento de Vagonetas",
"item.create.polished_rose_quartz": "Cuarzo Rosa Pulido", "item.create.polished_rose_quartz": "Cuarzo Rosa Pulido",
"item.create.powdered_obsidian": "Polvo de Obsidiana", "item.create.powdered_obsidian": "Polvo de Obsidiana",
"item.create.propeller": "Hélice", "item.create.propeller": "Hélice",
"item.create.red_sand_paper": "Papel de Arena Roja", "item.create.red_sand_paper": "Papel de Arena Roja",
"item.create.refined_radiance": "Radiancia Refinada", "item.create.refined_radiance": "Radiancia Refinada",
"item.create.rose_quartz": "Cuarzo Rosa", "item.create.rose_quartz": "Cuarzo Rosa",
"item.create.sand_paper": "Papel de Arena", "item.create.sand_paper": "Papel de Arena",
"item.create.schematic": "Esquema", "item.create.schematic": "Esquema",
"item.create.schematic_and_quill": "Esquema y Pluma", "item.create.schematic_and_quill": "Esquema y Pluma",
"item.create.shadow_steel": "Acero Sombrío", "item.create.shadow_steel": "Acero Sombrío",
"item.create.super_glue": "Super Pegamento", "item.create.super_glue": "Super Pegamento",
"item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll",
"item.create.tree_fertilizer": "Fertilizador de Ã<EFBFBD>rboles", "item.create.tree_fertilizer": "Fertilizador de Árboles",
"item.create.vertical_gearbox": "Transmisión Vertical", "item.create.vertical_gearbox": "Transmisión Vertical",
"item.create.wand_of_symmetry": "Vara de la Simetria", "item.create.wand_of_symmetry": "Vara de la Simetria",
"item.create.wheat_flour": "Harina de Trigo", "item.create.wheat_flour": "Harina de Trigo",
"item.create.whisk": "Batidor", "item.create.whisk": "Batidor",
@ -1027,6 +1028,10 @@
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s",
"create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s",
"create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s",
@ -1088,6 +1093,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "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.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.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1166,105 +1177,105 @@
"item.create.example_item.tooltip.action1": "These controls are displayed.", "item.create.example_item.tooltip.action1": "These controls are displayed.",
"block.create.andesite_encased_shaft.tooltip": "EJE EMPOTRADO DE ANDESITA", "block.create.andesite_encased_shaft.tooltip": "EJE EMPOTRADO DE ANDESITA",
"block.create.andesite_encased_shaft.tooltip.summary": "Objeto _exclusivo_ _del_ _Creativo_ .Cubre los ejes _en_ _el_ _mundo_ usando Carcasa de _Andesita_ . Los bloques de carcasa no se consumirán.", "block.create.andesite_encased_shaft.tooltip.summary": "Objeto _exclusivo_ _del_ _Creativo_ .Cubre los ejes _en_ _el_ _mundo_ usando Carcasa de _Andesita_ . Los bloques de carcasa no se consumirán.",
"block.create.brass_encased_shaft.tooltip": "EJE EMPOTRADO DE LATÓN", "block.create.brass_encased_shaft.tooltip": "EJE EMPOTRADO DE LATÓN",
"block.create.brass_encased_shaft.tooltip.summary": "Objeto _exclusivo_ _del_ _Creativo_ .Cubre los ejes _en_ _el_ _mundo_ usando Carcasa de _Latón_ . Los bloques de carcasa no se consumirán.", "block.create.brass_encased_shaft.tooltip.summary": "Objeto _exclusivo_ _del_ _Creativo_ .Cubre los ejes _en_ _el_ _mundo_ usando Carcasa de _Latón_ . Los bloques de carcasa no se consumirán.",
"block.create.wooden_bracket.tooltip": "SOPORTE DE MADERA", "block.create.wooden_bracket.tooltip": "SOPORTE DE MADERA",
"block.create.wooden_bracket.tooltip.summary": "_Decora_ tus _ejes,_ _ruedas_ _dentadas_ y _tuberías_ con un pequeño y acogedor refuerzo de madera", "block.create.wooden_bracket.tooltip.summary": "_Decora_ tus _ejes,_ _ruedas_ _dentadas_ y _tuberías_ con un pequeño y acogedor refuerzo de madera",
"block.create.metal_bracket.tooltip": "SOPORTE DE METAL", "block.create.metal_bracket.tooltip": "SOPORTE DE METAL",
"block.create.metal_bracket.tooltip.summary": "_Decora_ tus _ejes,_ _ruedas_ _dentadas_ y _tuberías_ con un robusto refuerzo industrial de metal", "block.create.metal_bracket.tooltip.summary": "_Decora_ tus _ejes,_ _ruedas_ _dentadas_ y _tuberías_ con un robusto refuerzo industrial de metal",
"block.create.andesite_casing.tooltip": "CARCASA DE ANDESITA", "block.create.andesite_casing.tooltip": "CARCASA DE ANDESITA",
"block.create.andesite_casing.tooltip.summary": "Una simple carcasa para máquinas con una variedad de usos. Segura para la decoración. Se puede usar para cubrir _ejes_ y _correas_ _mecánicas_ .", "block.create.andesite_casing.tooltip.summary": "Una simple carcasa para máquinas con una variedad de usos. Segura para la decoración. Se puede usar para cubrir _ejes_ y _correas_ _mecánicas_ .",
"block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA", "block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA",
"block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de objetos generales, que hace la transición entre los medios de transporte. Puede ser controlado con una _señal_ _de_ _redstone_ .", "block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de objetos generales, que hace la transición entre los medios de transporte. Puede ser controlado con una _señal_ _de_ _redstone_ .",
"block.create.andesite_funnel.tooltip.condition1": "Comportamiento General", "block.create.andesite_funnel.tooltip.condition1": "Comportamiento General",
"block.create.andesite_funnel.tooltip.behaviour1": "La _cara_ _abierta_ recogerá los _objetos_ en el bloque que tiene delante y los _introducirá_ en cualquier contenedor en el lado opuesto del embudo.", "block.create.andesite_funnel.tooltip.behaviour1": "La _cara_ _abierta_ recogerá los _objetos_ en el bloque que tiene delante y los _introducirá_ en cualquier contenedor en el lado opuesto del embudo.",
"block.create.andesite_funnel.tooltip.condition2": "Cuando se monta en correas, depósitos y similares", "block.create.andesite_funnel.tooltip.condition2": "Cuando se monta en correas, depósitos y similares",
"block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ artículos en el componente montado, desde o hacia el _inventario_ _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, esta puede ser invertida usando una llave inglesa.", "block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ artículos en el componente montado, desde o hacia el _inventario_ _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, esta puede ser invertida usando una llave inglesa.",
"block.create.andesite_funnel.tooltip.condition3": "Cuando esta vertical entre dos inventarios", "block.create.andesite_funnel.tooltip.condition3": "Cuando esta vertical entre dos inventarios",
"block.create.andesite_funnel.tooltip.behaviour3": "_Transferirá_ los objetos _hacia abajo_ , como si fuera una tolva sin buffer.", "block.create.andesite_funnel.tooltip.behaviour3": "_Transferirá_ los objetos _hacia abajo_ , como si fuera una tolva sin buffer.",
"block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA", "block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA",
"block.create.andesite_tunnel.tooltip.summary": "Una cubierta protectora para sus _Correas_ y una gran manera de cubrir los agujeros dejados en su pared por ellas.", "block.create.andesite_tunnel.tooltip.summary": "Una cubierta protectora para sus _Correas_ y una gran manera de cubrir los agujeros dejados en su pared por ellas.",
"block.create.andesite_tunnel.tooltip.control1": "Click derecho a un lado con la llave inglesa", "block.create.andesite_tunnel.tooltip.control1": "Click derecho a un lado con la llave inglesa",
"block.create.andesite_tunnel.tooltip.action1": "Ajusta las percianas de la ventana si el túnel tiene una en esa cara.", "block.create.andesite_tunnel.tooltip.action1": "Ajusta las percianas de la ventana si el túnel tiene una en esa cara.",
"block.create.brass_funnel.tooltip": "EMBUDO DE LATÓN", "block.create.brass_funnel.tooltip": "EMBUDO DE LATÓN",
"block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de objetos generales, que hace la transición entre los medios de transporte. Puede ser controlado con una _señal_ _de_ _redstone_ . Viene con un practico _filtro_ .", "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de objetos generales, que hace la transición entre los medios de transporte. Puede ser controlado con una _señal_ _de_ _redstone_ . Viene con un practico _filtro_ .",
"block.create.brass_funnel.tooltip.condition1": "Comportamiento General", "block.create.brass_funnel.tooltip.condition1": "Comportamiento General",
"block.create.brass_funnel.tooltip.behaviour1": "La _cara_ _abierta_ recogerá los _objetos_ en el bloque que tiene delante y los _introducirá_ en cualquier contenedor en el lado opuesto del embudo.", "block.create.brass_funnel.tooltip.behaviour1": "La _cara_ _abierta_ recogerá los _objetos_ en el bloque que tiene delante y los _introducirá_ en cualquier contenedor en el lado opuesto del embudo.",
"block.create.brass_funnel.tooltip.condition2": "Cuando se monta en correas, depósitos y similares", "block.create.brass_funnel.tooltip.condition2": "Cuando se monta en correas, depósitos y similares",
"block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ artículos en el componente montado, desde o hacia el _inventario_ _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, esta puede ser invertida usando una llave inglesa.", "block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ artículos en el componente montado, desde o hacia el _inventario_ _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, esta puede ser invertida usando una llave inglesa.",
"block.create.brass_funnel.tooltip.condition3": "Cuando esta vertical entre dos inventarios", "block.create.brass_funnel.tooltip.condition3": "Cuando esta vertical entre dos inventarios",
"block.create.brass_funnel.tooltip.behaviour3": "_Transferirá_ los objetos _hacia abajo_ , como si fuera una tolva sin buffer.", "block.create.brass_funnel.tooltip.behaviour3": "_Transferirá_ los objetos _hacia abajo_ , como si fuera una tolva sin buffer.",
"block.create.brass_tunnel.tooltip": "TÚNEL DE LATÓN", "block.create.brass_tunnel.tooltip": "TÚNEL DE LATÓN",
"block.create.brass_tunnel.tooltip.summary": "El _Túnel_ _de_ _Latón_ vienen con un número de opciones de _filtrado_ y _separación_ de objetos para sus _correas_ .", "block.create.brass_tunnel.tooltip.summary": "El _Túnel_ _de_ _Latón_ vienen con un número de opciones de _filtrado_ y _separación_ de objetos para sus _correas_ .",
"block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro",
"block.create.brass_tunnel.tooltip.behaviour1": "Los _Túneles_ _de_ _Latón_ se conectan entre sí permitiendo que el contenido de una _correa_ sea redirigido a otra.", "block.create.brass_tunnel.tooltip.behaviour1": "Los _Túneles_ _de_ _Latón_ se conectan entre sí permitiendo que el contenido de una _correa_ sea redirigido a otra.",
"block.create.brass_tunnel.tooltip.condition2": "Filtraje", "block.create.brass_tunnel.tooltip.condition2": "Filtraje",
"block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles_ _de_ _ Latón_ vienen con filtros tanto para la entrada como para la salida. Si un _objeto_ no está permitido desde el filtro de salida de un _Túnel_ será transferido a la salida de otro _Túnel_ conectado.", "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles_ _de_ _ Latón_ vienen con filtros tanto para la entrada como para la salida. Si un _objeto_ no está permitido desde el filtro de salida de un _Túnel_ será transferido a la salida de otro _Túnel_ conectado.",
"block.create.brass_tunnel.tooltip.condition3": "Dividiendo", "block.create.brass_tunnel.tooltip.condition3": "Dividiendo",
"block.create.brass_tunnel.tooltip.behaviour3": "Los _Túneles_ _de_ _Latón_ de pueden ser configurados para cambiar el método en el que se ordenan los _objetos_ en las _correas_ conectadas.", "block.create.brass_tunnel.tooltip.behaviour3": "Los _Túneles_ _de_ _Latón_ de pueden ser configurados para cambiar el método en el que se ordenan los _objetos_ en las _correas_ conectadas.",
"block.create.brass_tunnel.tooltip.control1": "Click derecho a un lado con la llave inglesa", "block.create.brass_tunnel.tooltip.control1": "Click derecho a un lado con la llave inglesa",
"block.create.brass_tunnel.tooltip.action1": "Ajusta las percianas de la ventana si el túnel tiene una en esa cara.", "block.create.brass_tunnel.tooltip.action1": "Ajusta las percianas de la ventana si el túnel tiene una en esa cara.",
"block.create.brass_tunnel.tooltip.control2": "Girar la rueda del ratón con la llave inglesa en la parte superior", "block.create.brass_tunnel.tooltip.control2": "Girar la rueda del ratón con la llave inglesa en la parte superior",
"block.create.brass_tunnel.tooltip.action2": "Cambia el método de división de los _túneles_ conectados.", "block.create.brass_tunnel.tooltip.action2": "Cambia el método de división de los _túneles_ conectados.",
"block.create.copper_casing.tooltip": "CARCASA DE COBRE", "block.create.copper_casing.tooltip": "CARCASA DE COBRE",
"block.create.copper_casing.tooltip.summary": "Una simple carcasa para máquinas con una variedad de usos. Segura para la decoración.", "block.create.copper_casing.tooltip.summary": "Una simple carcasa para máquinas con una variedad de usos. Segura para la decoración.",
"block.create.copper_casing.tooltip.condition1": "Cuando se usa en una Tubería de Fluidos", "block.create.copper_casing.tooltip.condition1": "Cuando se usa en una Tubería de Fluidos",
"block.create.copper_casing.tooltip.behaviour1": "Recubre la _Tubería_ _de_ _Fluidos_ con la _Carcasa_ _de_ _Cobre._ Las tuberías recubiertas _bloquearán_ _sus_ _conexiones_ en su lugar, ya no reaccionarán a los cambios de las tuberías vecinas.", "block.create.copper_casing.tooltip.behaviour1": "Recubre la _Tubería_ _de_ _Fluidos_ con la _Carcasa_ _de_ _Cobre._ Las tuberías recubiertas _bloquearán_ _sus_ _conexiones_ en su lugar, ya no reaccionarán a los cambios de las tuberías vecinas.",
"block.create.encased_fluid_pipe.tooltip": "TUBERÃ<EFBFBD>A DE FLUIDOS RECUBIERTA", "block.create.encased_fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS RECUBIERTA",
"block.create.encased_fluid_pipe.tooltip.summary": "Una _Tubería_ _de_ _Fluidos_ recubierta con una _Carcasa_ _de_ _Cobre_", "block.create.encased_fluid_pipe.tooltip.summary": "Una _Tubería_ _de_ _Fluidos_ recubierta con una _Carcasa_ _de_ _Cobre_",
"block.create.copper_valve_handle.tooltip": "MANIJA DE VÃ<EFBFBD>LVULA DE COBRE", "block.create.copper_valve_handle.tooltip": "MANIJA DE VÁLVULA DE COBRE",
"block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _Fuerza_ _Rotacional_ que requiere la interacción de los jugadores. ¡Ten cuidado de no desgastarte!", "block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _Fuerza_ _Rotacional_ que requiere la interacción de los jugadores. ¡Ten cuidado de no desgastarte!",
"block.create.copper_valve_handle.tooltip.condition1": "Cuando se usa", "block.create.copper_valve_handle.tooltip.condition1": "Cuando se usa",
"block.create.copper_valve_handle.tooltip.behaviour1": "Proporciona _fuerza_ _rotacional_ a un artefacto adjunto. _agáchate_ _para_ _revertir_ la rotación.", "block.create.copper_valve_handle.tooltip.behaviour1": "Proporciona _fuerza_ _rotacional_ a un artefacto adjunto. _agáchate_ _para_ _revertir_ la rotación.",
"block.create.seat.tooltip": "ASIENTO", "block.create.seat.tooltip": "ASIENTO",
"block.create.seat.tooltip.summary": "¡Siéntese y disfrute del paseo! Anclará a un jugador en una _artefacto_ en movimiento. ¡También es Grandioso para las construcciones estáticas! Viene en una variedad de colores.", "block.create.seat.tooltip.summary": "¡Siéntese y disfrute del paseo! Anclará a un jugador en una _artefacto_ en movimiento. ¡También es Grandioso para las construcciones estáticas! Viene en una variedad de colores.",
"block.create.seat.tooltip.condition1": "Click Derecho en el asiento", "block.create.seat.tooltip.condition1": "Click Derecho en el asiento",
"block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _asiento_ . Presiona el shift izquierdo para salir del _asiento._", "block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _asiento_ . Presiona el shift izquierdo para salir del _asiento._",
"block.create.chute.tooltip": "VERTEDOR", "block.create.chute.tooltip": "VERTEDOR",
"block.create.chute.tooltip.summary": "_Recoge_ y transporta objetos en vertical o en diagonal. Puede llevar y colocar los objetos en _contenedores._ También puede interactuar con los vertedores desde el lado usando _tolvas_ o _embudos_ _montados._", "block.create.chute.tooltip.summary": "_Recoge_ y transporta objetos en vertical o en diagonal. Puede llevar y colocar los objetos en _contenedores._ También puede interactuar con los vertedores desde el lado usando _tolvas_ o _embudos_ _montados._",
"block.create.chute.tooltip.condition1": "Cuando es usado con un ventilador", "block.create.chute.tooltip.condition1": "Cuando es usado con un ventilador",
"block.create.chute.tooltip.behaviour1": "Los vertedores usados con _ventiladores_ pueden transportar _objetos_ hacia arriba y succionar _objetos_ de _depósitos_ y _correas._", "block.create.chute.tooltip.behaviour1": "Los vertedores usados con _ventiladores_ pueden transportar _objetos_ hacia arriba y succionar _objetos_ de _depósitos_ y _correas._",
"block.create.depot.tooltip": "DEPÓSITO", "block.create.depot.tooltip": "DEPÓSITO",
"block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _Objetos._ Proporciona un punto de interacción para varias máquinas", "block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _Objetos._ Proporciona un punto de interacción para varias máquinas",
"block.create.depot.tooltip.condition1": "Click Derecho en un Depósito", "block.create.depot.tooltip.condition1": "Click Derecho en un Depósito",
"block.create.depot.tooltip.behaviour1": "Coloca o toma un _objeto_ del _depósito._ Los _bloques_ y _artefactos_ que interactúan con una _correa_ también funcionan en un _depósito._", "block.create.depot.tooltip.behaviour1": "Coloca o toma un _objeto_ del _depósito._ Los _bloques_ y _artefactos_ que interactúan con una _correa_ también funcionan en un _depósito._",
"item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE",
"item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para tus grandiosos _quemadores_ _de_ _blaze._ ¡Los enciende a todos!", "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para tus grandiosos _quemadores_ _de_ _blaze._ ¡Los enciende a todos!",
"item.create.empty_blaze_burner.tooltip": "QUEMADOR DE BLAZE VACIO", "item.create.empty_blaze_burner.tooltip": "QUEMADOR DE BLAZE VACIO",
"item.create.empty_blaze_burner.tooltip.summary": "Un pequeño hogar de hierro para tus ardientes amigos. Estoy seguro de que podrías darles un buen uso.", "item.create.empty_blaze_burner.tooltip.summary": "Un pequeño hogar de hierro para tus ardientes amigos. Estoy seguro de que podrías darles un buen uso.",
"item.create.empty_blaze_burner.tooltip.condition1": "Cuando es usado en un generador de blaze", "item.create.empty_blaze_burner.tooltip.condition1": "Cuando es usado en un generador de blaze",
"item.create.empty_blaze_burner.tooltip.behaviour1": "_Captura_ un blaze en el objeto", "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captura_ un blaze en el objeto",
"block.create.fluid_pipe.tooltip": "TUBERÃ<EFBFBD>A DE FLUIDOS", "block.create.fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS",
"block.create.fluid_pipe.tooltip.summary": "Se usa para mover _fluidos._ Necesita una _bomba_ _mecánica_ para mover el fluido.", "block.create.fluid_pipe.tooltip.summary": "Se usa para mover _fluidos._ Necesita una _bomba_ _mecánica_ para mover el fluido.",
"block.create.fluid_pipe.tooltip.condition1": "Transferencia de fluidos", "block.create.fluid_pipe.tooltip.condition1": "Transferencia de fluidos",
"block.create.fluid_pipe.tooltip.behaviour1": "Puede conectarse a _contenedores_ _de_ _fluidos_ como _tanques_ o _cuencas._ Los extremos expuestos de las _tuberías_ también pueden drenar o colocar bloques de fluido. ¡Ten cuidado con las fugas!", "block.create.fluid_pipe.tooltip.behaviour1": "Puede conectarse a _contenedores_ _de_ _fluidos_ como _tanques_ o _cuencas._ Los extremos expuestos de las _tuberías_ también pueden drenar o colocar bloques de fluido. ¡Ten cuidado con las fugas!",
"block.create.fluid_pipe.tooltip.control1": "Click Derecho con una Llave Inglesa", "block.create.fluid_pipe.tooltip.control1": "Click Derecho con una Llave Inglesa",
"block.create.fluid_pipe.tooltip.action1": "Coloca una ventana en la tubería si está disponible", "block.create.fluid_pipe.tooltip.action1": "Coloca una ventana en la tubería si está disponible",
"block.create.hose_pulley.tooltip": "POLEA CON MANGUERA", "block.create.hose_pulley.tooltip": "POLEA CON MANGUERA",
"block.create.hose_pulley.tooltip.summary": "Se utiliza para _colocar_ o _drenar_ grandes _cuerpos_ _de_ _fluido_ en el mundo.", "block.create.hose_pulley.tooltip.summary": "Se utiliza para _colocar_ o _drenar_ grandes _cuerpos_ _de_ _fluido_ en el mundo.",
"block.create.hose_pulley.tooltip.condition1": "Cuando es impulsado por la cinética", "block.create.hose_pulley.tooltip.condition1": "Cuando es impulsado por la cinética",
"block.create.hose_pulley.tooltip.behaviour1": "_Sube_ o _baja_ la manguera, La ubicación de la manguera determina hasta qué _altura_ actuará la _extracción_ o el _llenado_ .", "block.create.hose_pulley.tooltip.behaviour1": "_Sube_ o _baja_ la manguera, La ubicación de la manguera determina hasta qué _altura_ actuará la _extracción_ o el _llenado_ .",
"block.create.hose_pulley.tooltip.condition2": "Cuando los fluidos son extraídos de la polea", "block.create.hose_pulley.tooltip.condition2": "Cuando los fluidos son extraídos de la polea",
"block.create.hose_pulley.tooltip.behaviour2": "Empieza a _extraer_ bloques de _líquido_ del cuerpo en el que se bajó la punta de la manguera. Los cuerpos de fluido _muy_ _grandes_ serán _considerados_ _infinitos_ .", "block.create.hose_pulley.tooltip.behaviour2": "Empieza a _extraer_ bloques de _líquido_ del cuerpo en el que se bajó la punta de la manguera. Los cuerpos de fluido _muy_ _grandes_ serán _considerados_ _infinitos_ .",
"block.create.hose_pulley.tooltip.condition3": "Cuando los fluidos son empujados a la polea", "block.create.hose_pulley.tooltip.condition3": "Cuando los fluidos son empujados a la polea",
"block.create.hose_pulley.tooltip.behaviour3": "Comienza a _llenar_ con _fluido_ en el mundo _hasta_ _arriba_ a la _altura_ de la _punta_ _de_ _la_ _manguera_ .", "block.create.hose_pulley.tooltip.behaviour3": "Comienza a _llenar_ con _fluido_ en el mundo _hasta_ _arriba_ a la _altura_ de la _punta_ _de_ _la_ _manguera_ .",
@ -1274,116 +1285,116 @@
"block.create.fluid_tank.tooltip.behaviour1": "Cambia la ventana opcional", "block.create.fluid_tank.tooltip.behaviour1": "Cambia la ventana opcional",
"block.create.creative_fluid_tank.tooltip": "TANQUE DE FLUIDOS DEL CREATIVO", "block.create.creative_fluid_tank.tooltip": "TANQUE DE FLUIDOS DEL CREATIVO",
"block.create.creative_fluid_tank.tooltip.summary": "Este _Tanque_ _de_ _Fluidos_ permite la replicación infinita de cualquier Fluido. Escala en anchura y altura.", "block.create.creative_fluid_tank.tooltip.summary": "Este _Tanque_ _de_ _Fluidos_ permite la replicación infinita de cualquier Fluido. Escala en anchura y altura.",
"block.create.creative_fluid_tank.tooltip.condition1": "Cuando hay fluido en el tanque", "block.create.creative_fluid_tank.tooltip.condition1": "Cuando hay fluido en el tanque",
"block.create.creative_fluid_tank.tooltip.behaviour1": "Cualquier cosa que _extraiga_ de este tanque proporcionará un _suministro_ _ilimitado_ del fluido especificado. Los fluidos _insertados_ en este tanque serán _eliminados._", "block.create.creative_fluid_tank.tooltip.behaviour1": "Cualquier cosa que _extraiga_ de este tanque proporcionará un _suministro_ _ilimitado_ del fluido especificado. Los fluidos _insertados_ en este tanque serán _eliminados._",
"block.create.creative_fluid_tank.tooltip.condition2": "Click Derecho con una Llave Inglesa", "block.create.creative_fluid_tank.tooltip.condition2": "Click Derecho con una Llave Inglesa",
"block.create.creative_fluid_tank.tooltip.behaviour2": "Cambia la ventana opcional", "block.create.creative_fluid_tank.tooltip.behaviour2": "Cambia la ventana opcional",
"block.create.fluid_valve.tooltip": "VÃ<EFBFBD>LVULAL DE FLUIDOS", "block.create.fluid_valve.tooltip": "VÁLVULAL DE FLUIDOS",
"block.create.fluid_valve.tooltip.summary": "Detiene el flujo de fluido por una tubería.", "block.create.fluid_valve.tooltip.summary": "Detiene el flujo de fluido por una tubería.",
"block.create.fluid_valve.tooltip.condition1": "Flujo controlable", "block.create.fluid_valve.tooltip.condition1": "Flujo controlable",
"block.create.fluid_valve.tooltip.behaviour1": "Aplicando una _fuerza_ _de_ _rotación_ forzará a la _válvula_ a cerrarse, cesando el flujo de _fluidos._ Invierte la dirección de la _fuerza_ _de_ _rotación_ para reabrir la válvula.", "block.create.fluid_valve.tooltip.behaviour1": "Aplicando una _fuerza_ _de_ _rotación_ forzará a la _válvula_ a cerrarse, cesando el flujo de _fluidos._ Invierte la dirección de la _fuerza_ _de_ _rotación_ para reabrir la válvula.",
"block.create.mechanical_pump.tooltip": "BOMBA MECÃ<EFBFBD>NICA", "block.create.mechanical_pump.tooltip": "BOMBA MECÁNICA",
"block.create.mechanical_pump.tooltip.summary": "Toma la _fuerza_ _de_ _rotación_ y la usa para mover el _fluido_ a lo largo de un _tubo._ Tiene un rango de efecto máximo en ambas direcciones. (16 bloques por defecto)", "block.create.mechanical_pump.tooltip.summary": "Toma la _fuerza_ _de_ _rotación_ y la usa para mover el _fluido_ a lo largo de un _tubo._ Tiene un rango de efecto máximo en ambas direcciones. (16 bloques por defecto)",
"block.create.mechanical_pump.tooltip.condition1": "Flujo de fluidos", "block.create.mechanical_pump.tooltip.condition1": "Flujo de fluidos",
"block.create.mechanical_pump.tooltip.behaviour1": "La _fuerza_ _de_ _rotación_ aplicada crea una presión que fuerza el _fluido_ a través de la red de _tuberías._ Invierte la dirección de la fuerza de rotación para cambiar la dirección en la que fluye el _fluido._", "block.create.mechanical_pump.tooltip.behaviour1": "La _fuerza_ _de_ _rotación_ aplicada crea una presión que fuerza el _fluido_ a través de la red de _tuberías._ Invierte la dirección de la fuerza de rotación para cambiar la dirección en la que fluye el _fluido._",
"block.create.mechanical_pump.tooltip.control1": "Click Derecho con una Llave Inglesa", "block.create.mechanical_pump.tooltip.control1": "Click Derecho con una Llave Inglesa",
"block.create.mechanical_pump.tooltip.action1": "Invierte la dirección de la _bomba,_ cambiando la dirección por defecto del flujo", "block.create.mechanical_pump.tooltip.action1": "Invierte la dirección de la _bomba,_ cambiando la dirección por defecto del flujo",
"block.create.smart_fluid_pipe.tooltip": "TUBERÃ<EFBFBD>A DE FLUIDOS INTELIGENTE", "block.create.smart_fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS INTELIGENTE",
"block.create.smart_fluid_pipe.tooltip.summary": "Una _tubería_ _de_ _fluidos_ con un filtro. Puede especificar que _fluidos_ pasan por ella.", "block.create.smart_fluid_pipe.tooltip.summary": "Una _tubería_ _de_ _fluidos_ con un filtro. Puede especificar que _fluidos_ pasan por ella.",
"block.create.smart_fluid_pipe.tooltip.condition1": "Cuando los fluidos son empujados hacia ella", "block.create.smart_fluid_pipe.tooltip.condition1": "Cuando los fluidos son empujados hacia ella",
"block.create.smart_fluid_pipe.tooltip.behaviour1": "Las tuberías inteligentes que reciben un fluido que no coincide con su filtro bloquearán el flujo.", "block.create.smart_fluid_pipe.tooltip.behaviour1": "Las tuberías inteligentes que reciben un fluido que no coincide con su filtro bloquearán el flujo.",
"block.create.smart_fluid_pipe.tooltip.condition2": "Cuando está adyacente a un recipiente de fluido", "block.create.smart_fluid_pipe.tooltip.condition2": "Cuando está adyacente a un recipiente de fluido",
"block.create.smart_fluid_pipe.tooltip.behaviour2": "Las tuberías inteligentes que _inicien_ un _flujo_ desde cualquier contenedor sólo extraerán los fluidos que _coincidan_ con su _filtro._", "block.create.smart_fluid_pipe.tooltip.behaviour2": "Las tuberías inteligentes que _inicien_ un _flujo_ desde cualquier contenedor sólo extraerán los fluidos que _coincidan_ con su _filtro._",
"block.create.spout.tooltip": "CANALETA", "block.create.spout.tooltip": "CANALETA",
"block.create.spout.tooltip.summary": "Un inyector para rellenar sus _objetos_ con _fluidos._", "block.create.spout.tooltip.summary": "Un inyector para rellenar sus _objetos_ con _fluidos._",
"block.create.spout.tooltip.condition1": "Transferencia de fluidos", "block.create.spout.tooltip.condition1": "Transferencia de fluidos",
"block.create.spout.tooltip.behaviour1": "Cuando se coloca un _objeto_ que puede _contener_ _fluidos_ como una _cubeta_ o _botella_ debajo, la canaleta intentará rellenarlo con su propio _fluido_ almacenado.", "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _objeto_ que puede _contener_ _fluidos_ como una _cubeta_ o _botella_ debajo, la canaleta intentará rellenarlo con su propio _fluido_ almacenado.",
"block.create.spout.tooltip.condition2": "Automatización de fluidos", "block.create.spout.tooltip.condition2": "Automatización de fluidos",
"block.create.spout.tooltip.behaviour2": "La canaleta colocada sobre una _correa_ o _depósito_ reaccionará automáticamente con un _contenedor_ _de_ _líquido_ que pase por debajo de él.", "block.create.spout.tooltip.behaviour2": "La canaleta colocada sobre una _correa_ o _depósito_ reaccionará automáticamente con un _contenedor_ _de_ _líquido_ que pase por debajo de él.",
"block.create.item_drain.tooltip": "ITEM DRAIN", "block.create.item_drain.tooltip": "ITEM DRAIN",
"block.create.item_drain.tooltip.summary": "Un depósito con rejilla para vaciar sus _objetos_ _con_ _fluidos._", "block.create.item_drain.tooltip.summary": "Un depósito con rejilla para vaciar sus _objetos_ _con_ _fluidos._",
"block.create.item_drain.tooltip.condition1": "Transferencia de fluidos", "block.create.item_drain.tooltip.condition1": "Transferencia de fluidos",
"block.create.item_drain.tooltip.behaviour1": "Cuando se inserta un _contenedor_ _de_ _fluidos_ como una _cubeta_ o _botella_ desde el lado, el extractor intentará vaciarlo en su propio _contenedor_ de _fluidos._ El objeto será entonces expulsado por el lado opuesto.", "block.create.item_drain.tooltip.behaviour1": "Cuando se inserta un _contenedor_ _de_ _fluidos_ como una _cubeta_ o _botella_ desde el lado, el extractor intentará vaciarlo en su propio _contenedor_ de _fluidos._ El objeto será entonces expulsado por el lado opuesto.",
"block.create.mechanical_arm.tooltip": "MECHANICAL ARM", "block.create.mechanical_arm.tooltip": "MECHANICAL ARM",
"block.create.mechanical_arm.tooltip.summary": "Un artefacto avanzado para reubicar _objetos._", "block.create.mechanical_arm.tooltip.summary": "Un artefacto avanzado para reubicar _objetos._",
"block.create.mechanical_arm.tooltip.condition1": "Transferencia de objetos", "block.create.mechanical_arm.tooltip.condition1": "Transferencia de objetos",
"block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar artículos en cualquier _inventario_ _accesible,_ como _Correas,_ _Depósitos,_ _Embudos_ y _Crafters_ _Mecánicos._", "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar artículos en cualquier _inventario_ _accesible,_ como _Correas,_ _Depósitos,_ _Embudos_ y _Crafters_ _Mecánicos._",
"block.create.mechanical_arm.tooltip.control1": "Mientras que este en la mano", "block.create.mechanical_arm.tooltip.control1": "Mientras que este en la mano",
"block.create.mechanical_arm.tooltip.action1": "Click Derecho en un _inventario_ _de_ _objetos_ _accesible_ para establecerlo como _fuente_ del _Brazo_ _Mecánico._ Haga clic derecho dos veces para establecerlo como el _destino._", "block.create.mechanical_arm.tooltip.action1": "Click Derecho en un _inventario_ _de_ _objetos_ _accesible_ para establecerlo como _fuente_ del _Brazo_ _Mecánico._ Haga clic derecho dos veces para establecerlo como el _destino._",
"block.create.mechanical_arm.tooltip.control2": "Girar la rueda del ratón con la llave inglesa", "block.create.mechanical_arm.tooltip.control2": "Girar la rueda del ratón con la llave inglesa",
"block.create.mechanical_arm.tooltip.action2": "Establece el criterio de comportamiento para la salida de los _objetos_ por el _Brazo_ _Mecánico._", "block.create.mechanical_arm.tooltip.action2": "Establece el criterio de comportamiento para la salida de los _objetos_ por el _Brazo_ _Mecánico._",
"item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND",
"item.create.wand_of_symmetry.tooltip.summary": "Crea un 'espejo' que refleja perfectamente la colocación de bloques a través de los planos configurados.", "item.create.wand_of_symmetry.tooltip.summary": "Crea un 'espejo' que refleja perfectamente la colocación de bloques a través de los planos configurados.",
"item.create.wand_of_symmetry.tooltip.condition1": "Cuando esta en la barra de ítems", "item.create.wand_of_symmetry.tooltip.condition1": "Cuando esta en la barra de ítems",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Se mantiene activo", "item.create.wand_of_symmetry.tooltip.behaviour1": "Se mantiene activo",
"item.create.wand_of_symmetry.tooltip.control1": "Click Derecho en el suelo", "item.create.wand_of_symmetry.tooltip.control1": "Click Derecho en el suelo",
"item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _mueve_ el 'espejo'.", "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _mueve_ el 'espejo'.",
"item.create.wand_of_symmetry.tooltip.control2": "Click Derecho en el aire", "item.create.wand_of_symmetry.tooltip.control2": "Click Derecho en el aire",
"item.create.wand_of_symmetry.tooltip.action2": "_Remueve_ el 'espejo' activo", "item.create.wand_of_symmetry.tooltip.action2": "_Remueve_ el 'espejo' activo",
"item.create.wand_of_symmetry.tooltip.control3": "Click Derecho cuando se esta agachado", "item.create.wand_of_symmetry.tooltip.control3": "Click Derecho cuando se esta agachado",
"item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración_", "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración_",
"item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER",
"item.create.handheld_blockzapper.tooltip.summary": "Novedoso artilugio para colocar o intercambiar bloques a distancia.", "item.create.handheld_blockzapper.tooltip.summary": "Novedoso artilugio para colocar o intercambiar bloques a distancia.",
"item.create.handheld_blockzapper.tooltip.control1": "Click Izquierdo a un bloque", "item.create.handheld_blockzapper.tooltip.control1": "Click Izquierdo a un bloque",
"item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques que serán colocados por la herramienta en el bloque objetivo.", "item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques que serán colocados por la herramienta en el bloque objetivo.",
"item.create.handheld_blockzapper.tooltip.control2": "Click Derecho en un bloque", "item.create.handheld_blockzapper.tooltip.control2": "Click Derecho en un bloque",
"item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ o _reemplaza_ el bloque objetivo.", "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ o _reemplaza_ el bloque objetivo.",
"item.create.handheld_blockzapper.tooltip.control3": "Click Derecho mientras se está agachado", "item.create.handheld_blockzapper.tooltip.control3": "Click Derecho mientras se está agachado",
"item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración._", "item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración._",
"item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER",
"item.create.handheld_worldshaper.tooltip.summary": "Una herramienta útil para crear _paisajes_ y _características_ en el _terreno._", "item.create.handheld_worldshaper.tooltip.summary": "Una herramienta útil para crear _paisajes_ y _características_ en el _terreno._",
"item.create.handheld_worldshaper.tooltip.control1": "Click Izquierdo a un bloque", "item.create.handheld_worldshaper.tooltip.control1": "Click Izquierdo a un bloque",
"item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques que serán colocados por la herramienta en el bloque objetivo.", "item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques que serán colocados por la herramienta en el bloque objetivo.",
"item.create.handheld_worldshaper.tooltip.control2": "Click Derecho en un bloque", "item.create.handheld_worldshaper.tooltip.control2": "Click Derecho en un bloque",
"item.create.handheld_worldshaper.tooltip.action2": "Aplica el _Pincel_ y la _Herramienta_ actualmente seleccionados en el lugar objetivo.", "item.create.handheld_worldshaper.tooltip.action2": "Aplica el _Pincel_ y la _Herramienta_ actualmente seleccionados en el lugar objetivo.",
"item.create.handheld_worldshaper.tooltip.control3": "Click Derecho mientras se está agachado", "item.create.handheld_worldshaper.tooltip.control3": "Click Derecho mientras se está agachado",
"item.create.handheld_worldshaper.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración._", "item.create.handheld_worldshaper.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración._",
"item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER",
"item.create.tree_fertilizer.tooltip.summary": "Una poderosa combinación de minerales adecuados para acelerar el crecimiento de los tipos de árboles comunes.", "item.create.tree_fertilizer.tooltip.summary": "Una poderosa combinación de minerales adecuados para acelerar el crecimiento de los tipos de árboles comunes.",
"item.create.tree_fertilizer.tooltip.condition1": "Cuando se usa en un retoño de árbol", "item.create.tree_fertilizer.tooltip.condition1": "Cuando se usa en un retoño de árbol",
"item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles, sin importar el espacio entre ellos.", "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles, sin importar el espacio entre ellos.",
"item.create.deforester.tooltip": "DEFORESTER", "item.create.deforester.tooltip": "DEFORESTER",
"item.create.deforester.tooltip.summary": "Un _hacha_ _radiante_ capaz de cortar árboles en una fracción de segundo.", "item.create.deforester.tooltip.summary": "Un _hacha_ _radiante_ capaz de cortar árboles en una fracción de segundo.",
"item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip": "EXTENDO GRIP",
"item.create.extendo_grip.tooltip.summary": "Boioioing! En gran medida, _aumenta_ _la_ _distancia_ _de_ _alcance_ del portador.", "item.create.extendo_grip.tooltip.summary": "Boioioing! En gran medida, _aumenta_ _la_ _distancia_ _de_ _alcance_ del portador.",
"item.create.extendo_grip.tooltip.condition1": "Cuando está en la mano secundaria", "item.create.extendo_grip.tooltip.condition1": "Cuando está en la mano secundaria",
"item.create.extendo_grip.tooltip.behaviour1": "Aumenta el rango de alcance de los objetos usados en la _mano_ _principal._", "item.create.extendo_grip.tooltip.behaviour1": "Aumenta el rango de alcance de los objetos usados en la _mano_ _principal._",
"item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip": "FILTER",
"item.create.filter.tooltip.summary": "_Controla_ las _salidas_ y _entradas_ de los dispositivos logísticos con más _precisión,_ comparándolas con un _conjunto_ _de_ _objetos_ o varios _filtros_ _anidados._", "item.create.filter.tooltip.summary": "_Controla_ las _salidas_ y _entradas_ de los dispositivos logísticos con más _precisión,_ comparándolas con un _conjunto_ _de_ _objetos_ o varios _filtros_ _anidados._",
"item.create.filter.tooltip.condition1": "Cuando está en la ranura del filtro", "item.create.filter.tooltip.condition1": "Cuando está en la ranura del filtro",
"item.create.filter.tooltip.behaviour1": "_Controla_ el flujo de objetos según su _configuración._", "item.create.filter.tooltip.behaviour1": "_Controla_ el flujo de objetos según su _configuración._",
"item.create.filter.tooltip.condition2": "Con Click Derecho", "item.create.filter.tooltip.condition2": "Con Click Derecho",
"item.create.filter.tooltip.behaviour2": "Abre la _Interfaz_ _de_ _Configuración._", "item.create.filter.tooltip.behaviour2": "Abre la _Interfaz_ _de_ _Configuración._",
"item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER",
"item.create.attribute_filter.tooltip.summary": "_Controla_ las _salidas_ y _entradas_ de los dispositivos logísticos con más _precisión,_ comparándolas con un _conjunto_ _de_ _atributos_ _de_ _objetos_ y _categorias._", "item.create.attribute_filter.tooltip.summary": "_Controla_ las _salidas_ y _entradas_ de los dispositivos logísticos con más _precisión,_ comparándolas con un _conjunto_ _de_ _atributos_ _de_ _objetos_ y _categorias._",
"item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura del filtro", "item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura del filtro",
"item.create.attribute_filter.tooltip.behaviour1": "_Controla_ el flujo de objetos según su _configuración._", "item.create.attribute_filter.tooltip.behaviour1": "_Controla_ el flujo de objetos según su _configuración._",
"item.create.attribute_filter.tooltip.condition2": "Con Click Derecho", "item.create.attribute_filter.tooltip.condition2": "Con Click Derecho",
"item.create.attribute_filter.tooltip.behaviour2": "Abre la _Interfaz_ _de_ _Configuración._", "item.create.attribute_filter.tooltip.behaviour2": "Abre la _Interfaz_ _de_ _Configuración._",
"item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC",
"item.create.empty_schematic.tooltip.summary": "Se usa como ingrediente en una receta y para escribir en la _Mesa_ _de_ _Esquemas._", "item.create.empty_schematic.tooltip.summary": "Se usa como ingrediente en una receta y para escribir en la _Mesa_ _de_ _Esquemas._",
"item.create.schematic.tooltip": "SCHEMATIC", "item.create.schematic.tooltip": "SCHEMATIC",
"item.create.schematic.tooltip.summary": "Sostiene una estructura para ser posicionada y colocada en el mundo. Posiciona el Holograma como se desee y usa un _Esquemacañon_ para construirlo.", "item.create.schematic.tooltip.summary": "Sostiene una estructura para ser posicionada y colocada en el mundo. Posiciona el Holograma como se desee y usa un _Esquemacañon_ para construirlo.",
"item.create.schematic.tooltip.condition1": "Cuando es sostenido", "item.create.schematic.tooltip.condition1": "Cuando es sostenido",
"item.create.schematic.tooltip.behaviour1": "Se puede posicionar usando las Herramientas en Pantalla.", "item.create.schematic.tooltip.behaviour1": "Se puede posicionar usando las Herramientas en Pantalla.",
"item.create.schematic.tooltip.control1": "Click Derecho mientras se está agachado", "item.create.schematic.tooltip.control1": "Click Derecho mientras se está agachado",
"item.create.schematic.tooltip.action1": "Abre una _interfaz_ para introducir las _coordenadas_ exactas.", "item.create.schematic.tooltip.action1": "Abre una _interfaz_ para introducir las _coordenadas_ exactas.",
"item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL",
@ -1391,81 +1402,81 @@
"item.create.schematic_and_quill.tooltip.condition1": "Paso 1", "item.create.schematic_and_quill.tooltip.condition1": "Paso 1",
"item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos esquinas con Click Derecho.", "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos esquinas con Click Derecho.",
"item.create.schematic_and_quill.tooltip.condition2": "Paso 2", "item.create.schematic_and_quill.tooltip.condition2": "Paso 2",
"item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl_ _+_ _girar_ _rueda_ _del_ _ratón_ en las caras para ajustar el tamaño. Click Derecho de nuevo para Guardar.", "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl_ _+_ _girar_ _rueda_ _del_ _ratón_ en las caras para ajustar el tamaño. Click Derecho de nuevo para Guardar.",
"item.create.schematic_and_quill.tooltip.control1": "Click Derecho", "item.create.schematic_and_quill.tooltip.control1": "Click Derecho",
"item.create.schematic_and_quill.tooltip.action1": "Selecciona una esquina / confirma el guardado.", "item.create.schematic_and_quill.tooltip.action1": "Selecciona una esquina / confirma el guardado.",
"item.create.schematic_and_quill.tooltip.control2": "Manteniendo la tecla Ctrl", "item.create.schematic_and_quill.tooltip.control2": "Manteniendo la tecla Ctrl",
"item.create.schematic_and_quill.tooltip.action2": "Selecciona los puntos en _medio_ _del_ _aire._ _Girar_ _rueda_ _del_ _ratón_ para ajustar la distancia.", "item.create.schematic_and_quill.tooltip.action2": "Selecciona los puntos en _medio_ _del_ _aire._ _Girar_ _rueda_ _del_ _ratón_ para ajustar la distancia.",
"item.create.schematic_and_quill.tooltip.control3": "Click Derecho mientras se está agachado", "item.create.schematic_and_quill.tooltip.control3": "Click Derecho mientras se está agachado",
"item.create.schematic_and_quill.tooltip.action3": "_Reinicia_ y quita la selección.", "item.create.schematic_and_quill.tooltip.action3": "_Reinicia_ y quita la selección.",
"block.create.schematicannon.tooltip": "SCHEMATICANNON", "block.create.schematicannon.tooltip": "SCHEMATICANNON",
"block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _esquema_ ya desplegado en el mundo. Utiliza objetos de los inventarios adyacentes y _Pólvora_ como combustible.", "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _esquema_ ya desplegado en el mundo. Utiliza objetos de los inventarios adyacentes y _Pólvora_ como combustible.",
"block.create.schematicannon.tooltip.control1": "Click Derecho sobre él", "block.create.schematicannon.tooltip.control1": "Click Derecho sobre él",
"block.create.schematicannon.tooltip.action1": "Abre la interfaz", "block.create.schematicannon.tooltip.action1": "Abre la interfaz",
"block.create.schematic_table.tooltip": "SCHEMATIC TABLE", "block.create.schematic_table.tooltip": "SCHEMATIC TABLE",
"block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _Esquema_ _Vacío._", "block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _Esquema_ _Vacío._",
"block.create.schematic_table.tooltip.condition1": "Cuando se le da un esquema vacío", "block.create.schematic_table.tooltip.condition1": "Cuando se le da un esquema vacío",
"block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de su carpeta de esquemas.", "block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de su carpeta de esquemas.",
"block.create.shaft.tooltip": "SHAFT", "block.create.shaft.tooltip": "SHAFT",
"block.create.shaft.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta.", "block.create.shaft.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta.",
"block.create.cogwheel.tooltip": "COGWHEEL", "block.create.cogwheel.tooltip": "COGWHEEL",
"block.create.cogwheel.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta, y a las _Ruedas_ _Dentadas_ adyacentes.", "block.create.cogwheel.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta, y a las _Ruedas_ _Dentadas_ adyacentes.",
"block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL",
"block.create.large_cogwheel.tooltip.summary": "Una versión más grande de la _Rueda_ _Dentada,_ que permite _cambiar_ _la_ _Velocidad_ _de_ _Rotación_ cuando se conecta a su Contraparte más pequeña.", "block.create.large_cogwheel.tooltip.summary": "Una versión más grande de la _Rueda_ _Dentada,_ que permite _cambiar_ _la_ _Velocidad_ _de_ _Rotación_ cuando se conecta a su Contraparte más pequeña.",
"block.create.encased_shaft.tooltip": "ENCASED SHAFT", "block.create.encased_shaft.tooltip": "ENCASED SHAFT",
"block.create.encased_shaft.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta. Adecuado para transmitir la rotación a través de las paredes.", "block.create.encased_shaft.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta. Adecuado para transmitir la rotación a través de las paredes.",
"block.create.gearbox.tooltip": "GEARBOX", "block.create.gearbox.tooltip": "GEARBOX",
"block.create.gearbox.tooltip.summary": "_Transmite_ la _rotación_ en _cuatro_ _direcciones._ Invierte las conexiones rectas.", "block.create.gearbox.tooltip.summary": "_Transmite_ la _rotación_ en _cuatro_ _direcciones._ Invierte las conexiones rectas.",
"block.create.gearshift.tooltip": "GEARSHIFT", "block.create.gearshift.tooltip": "GEARSHIFT",
"block.create.gearshift.tooltip.summary": "Un control para cambiar la dirección de rotación de los ejes conectados.", "block.create.gearshift.tooltip.summary": "Un control para cambiar la dirección de rotación de los ejes conectados.",
"block.create.gearshift.tooltip.condition1": "Cuando tiene una señal de Redstone", "block.create.gearshift.tooltip.condition1": "Cuando tiene una señal de Redstone",
"block.create.gearshift.tooltip.behaviour1": "_Invierte_ la rotación de salida.", "block.create.gearshift.tooltip.behaviour1": "_Invierte_ la rotación de salida.",
"block.create.clutch.tooltip": "CLUTCH", "block.create.clutch.tooltip": "CLUTCH",
"block.create.clutch.tooltip.summary": "Un control para activar/desactivar la rotación de los ejes conectados.", "block.create.clutch.tooltip.summary": "Un control para activar/desactivar la rotación de los ejes conectados.",
"block.create.clutch.tooltip.condition1": "Cuando tiene una señal de Redstone", "block.create.clutch.tooltip.condition1": "Cuando tiene una señal de Redstone",
"block.create.clutch.tooltip.behaviour1": "_Deja_ de transmitir la rotación hacia el otro lado.", "block.create.clutch.tooltip.behaviour1": "_Deja_ de transmitir la rotación hacia el otro lado.",
"block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE", "block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE",
"block.create.encased_chain_drive.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta y a las _Transmisiones_ _de_ _Cadena_ _Empotrada_ adyacentes. Las transmisiones de cadena se conectan en un grupo cuando se colocan juntas por cualquier cara sin un eje. Su orientación no tiene por qué coincidir.", "block.create.encased_chain_drive.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta y a las _Transmisiones_ _de_ _Cadena_ _Empotrada_ adyacentes. Las transmisiones de cadena se conectan en un grupo cuando se colocan juntas por cualquier cara sin un eje. Su orientación no tiene por qué coincidir.",
"block.create.encased_chain_drive.tooltip.condition1": "Cuando se conectan", "block.create.encased_chain_drive.tooltip.condition1": "Cuando se conectan",
"block.create.encased_chain_drive.tooltip.behaviour1": "Los bloques adjuntos transmitirán la _velocidad_ _de_ _rotación_ y el sentido de este componente.", "block.create.encased_chain_drive.tooltip.behaviour1": "Los bloques adjuntos transmitirán la _velocidad_ _de_ _rotación_ y el sentido de este componente.",
"block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT", "block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT",
"block.create.adjustable_chain_gearshift.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta y a las _Transmisiones_ _de_ _Cadena_ _Empotrada_ adyacentes. Una _señal_ _de_ _redstone_ proporcionada a este bloque controlará el tamaño de la rueda motriz que se acopla a las cadenas de transmisión.", "block.create.adjustable_chain_gearshift.tooltip.summary": "_Transmite_ la _rotación_ en una línea recta y a las _Transmisiones_ _de_ _Cadena_ _Empotrada_ adyacentes. Una _señal_ _de_ _redstone_ proporcionada a este bloque controlará el tamaño de la rueda motriz que se acopla a las cadenas de transmisión.",
"block.create.adjustable_chain_gearshift.tooltip.condition1": "Control por Redstone", "block.create.adjustable_chain_gearshift.tooltip.condition1": "Control por Redstone",
"block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Sin_ una señal, las cadenas adyacentes transmitirán la _misma_ _velocidad._ Con una señal a _máxima_ _potencia,_ las cadenas adyacentes transmitirán exactamente el _doble_ _de_ _su_ _velocidad._ Cualquier cosa intermedia dará resultados entre 1-2x su velocidad.", "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Sin_ una señal, las cadenas adyacentes transmitirán la _misma_ _velocidad._ Con una señal a _máxima_ _potencia,_ las cadenas adyacentes transmitirán exactamente el _doble_ _de_ _su_ _velocidad._ Cualquier cosa intermedia dará resultados entre 1-2x su velocidad.",
"item.create.belt_connector.tooltip": "BELT CONNECTOR", "item.create.belt_connector.tooltip": "BELT CONNECTOR",
"item.create.belt_connector.tooltip.summary": "Conecta dos o más _ejes_ con una _Correa_ _Mecánica._ Los ejes conectados tendrán exactamente la misma velocidad y dirección de rotación. La cinta puede actuar como un _transportador_ para _Objetos_ y _Entidades._", "item.create.belt_connector.tooltip.summary": "Conecta dos o más _ejes_ con una _Correa_ _Mecánica._ Los ejes conectados tendrán exactamente la misma velocidad y dirección de rotación. La cinta puede actuar como un _transportador_ para _Objetos_ y _Entidades._",
"item.create.belt_connector.tooltip.control1": "Click Derecho en un eje", "item.create.belt_connector.tooltip.control1": "Click Derecho en un eje",
"item.create.belt_connector.tooltip.action1": "Selecciona el eje como una polea del cinturón. Ambos ejes seleccionados tienen que _alinearse_ ya sea _Verticalmente,_ _Horizontalmente,_ o _Diagonalmente_ hacia la dirección de la Correa.", "item.create.belt_connector.tooltip.action1": "Selecciona el eje como una polea del cinturón. Ambos ejes seleccionados tienen que _alinearse_ ya sea _Verticalmente,_ _Horizontalmente,_ o _Diagonalmente_ hacia la dirección de la Correa.",
"item.create.belt_connector.tooltip.control2": "Click Derecho mientras se está agachado", "item.create.belt_connector.tooltip.control2": "Click Derecho mientras se está agachado",
"item.create.belt_connector.tooltip.action2": "_Reinicia_ la primera posición seleccionada para la correa.", "item.create.belt_connector.tooltip.action2": "_Reinicia_ la primera posición seleccionada para la correa.",
"item.create.goggles.tooltip": "GOGGLES", "item.create.goggles.tooltip": "GOGGLES",
"item.create.goggles.tooltip.summary": "Un par de gafas para aumentar la visión con _información_ _cinética_ útil.", "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar la visión con _información_ _cinética_ útil.",
"item.create.goggles.tooltip.condition1": "Cuando se usan", "item.create.goggles.tooltip.condition1": "Cuando se usan",
"item.create.goggles.tooltip.behaviour1": "Muestra _indicadores_ _con_ _colores_ correspondientes al _Nivel_ _de_ _Velocidad_ de un componente cinético colocado, así como _Impacto_ _de_ _Estrés_ y _Capacidad_ de los componentes individuales.", "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores_ _con_ _colores_ correspondientes al _Nivel_ _de_ _Velocidad_ de un componente cinético colocado, así como _Impacto_ _de_ _Estrés_ y _Capacidad_ de los componentes individuales.",
"item.create.goggles.tooltip.condition2": "Al mirar el medidor", "item.create.goggles.tooltip.condition2": "Al mirar el medidor",
"item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre la _velocidad_ o el _estrés_ de la red a la que está conectado el medidor.", "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre la _velocidad_ o el _estrés_ de la red a la que está conectado el medidor.",
"item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers",
"item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.",
"item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip": "WRENCH",
"item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artefactos cinéticos. Se puede utilizar para _Rotar,_ _Desmantelar_ y _Configurar_ componentes.", "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artefactos cinéticos. Se puede utilizar para _Rotar,_ _Desmantelar_ y _Configurar_ componentes.",
"item.create.wrench.tooltip.control1": "Click Derecho en un bloqueo cinético", "item.create.wrench.tooltip.control1": "Click Derecho en un bloqueo cinético",
"item.create.wrench.tooltip.action1": "_Gira_ los componentes hacia o en contra de la cara con la que interactuó.", "item.create.wrench.tooltip.action1": "_Gira_ los componentes hacia o en contra de la cara con la que interactuó.",
"item.create.wrench.tooltip.control2": "Click Derecho mientras se está agachado", "item.create.wrench.tooltip.control2": "Click Derecho mientras se está agachado",
"item.create.wrench.tooltip.action2": "_Desmonta_ los _componentes_ _cinéticos_ y los coloca de nuevo en _tú_ _inventario._", "item.create.wrench.tooltip.action2": "_Desmonta_ los _componentes_ _cinéticos_ y los coloca de nuevo en _tú_ _inventario._",
"block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR", "block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR",
"block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.", "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1703", "_": "Missing Localizations: 1713",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -400,6 +400,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "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_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Verweerde Kalksteen Pilaar", "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_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -737,11 +738,11 @@
"create.gui.scrollInput.scrollToSelect": "Scroll om te selecteren", "create.gui.scrollInput.scrollToSelect": "Scroll om te selecteren",
"create.gui.scrollInput.shiftScrollsFaster": "Shift om sneller te Scrollen", "create.gui.scrollInput.shiftScrollsFaster": "Shift om sneller te Scrollen",
"create.gui.toolmenu.focusKey": "Hou [%1$s] ingedrukt om te Focusen", "create.gui.toolmenu.focusKey": "Hou [%1$s] ingedrukt om te Focusen",
"create.gui.toolmenu.cycle": "[SCROLL] om te Cycleën", "create.gui.toolmenu.cycle": "[SCROLL] om te Cycleën",
"create.gui.symmetryWand.mirrorType": "Spiegelen", "create.gui.symmetryWand.mirrorType": "Spiegelen",
"create.gui.symmetryWand.orientation": "Orientatie", "create.gui.symmetryWand.orientation": "Orientatie",
"create.symmetry.mirror.plane": "Spiegel één keer", "create.symmetry.mirror.plane": "Spiegel één keer",
"create.symmetry.mirror.doublePlane": "Rechthoekig", "create.symmetry.mirror.doublePlane": "Rechthoekig",
"create.symmetry.mirror.triplePlane": "Achthoekig", "create.symmetry.mirror.triplePlane": "Achthoekig",
@ -1027,6 +1028,10 @@
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s",
"create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s",
"create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s",
@ -1088,6 +1093,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "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.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.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1325,7 +1336,7 @@
"item.create.wand_of_symmetry.tooltip.condition1": "Waneer in de Actiebalk", "item.create.wand_of_symmetry.tooltip.condition1": "Waneer in de Actiebalk",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Blijft actief", "item.create.wand_of_symmetry.tooltip.behaviour1": "Blijft actief",
"item.create.wand_of_symmetry.tooltip.control1": "R-Klik op de Grond", "item.create.wand_of_symmetry.tooltip.control1": "R-Klik op de Grond",
"item.create.wand_of_symmetry.tooltip.action1": "_Creëerd_ of _Beweegt_ de Spiegel", "item.create.wand_of_symmetry.tooltip.action1": "_Creëerd_ of _Beweegt_ de Spiegel",
"item.create.wand_of_symmetry.tooltip.control2": "R-Klik in de Lucht", "item.create.wand_of_symmetry.tooltip.control2": "R-Klik in de Lucht",
"item.create.wand_of_symmetry.tooltip.action2": "_Verwijderd_ de actieve Spiegel", "item.create.wand_of_symmetry.tooltip.action2": "_Verwijderd_ de actieve Spiegel",
"item.create.wand_of_symmetry.tooltip.control3": "R-Klik terwijl je Sluipt", "item.create.wand_of_symmetry.tooltip.control3": "R-Klik terwijl je Sluipt",
@ -1400,7 +1411,7 @@
"item.create.schematic_and_quill.tooltip.action3": "_Resets_ en verwijderd de selectie.", "item.create.schematic_and_quill.tooltip.action3": "_Resets_ en verwijderd de selectie.",
"block.create.schematicannon.tooltip": "BOUWTEKENINGKANNON", "block.create.schematicannon.tooltip": "BOUWTEKENINGKANNON",
"block.create.schematicannon.tooltip.summary": "Schiet blokken om een gepostioneerde _Bouwtekening_ in de Wereld te creëeren. Gebruikt blokken uit naastgelegen inventarissen en _Buskruit_ als brandstof.", "block.create.schematicannon.tooltip.summary": "Schiet blokken om een gepostioneerde _Bouwtekening_ in de Wereld te creëeren. Gebruikt blokken uit naastgelegen inventarissen en _Buskruit_ als brandstof.",
"block.create.schematicannon.tooltip.control1": "Wanneer R-Geklikt", "block.create.schematicannon.tooltip.control1": "Wanneer R-Geklikt",
"block.create.schematicannon.tooltip.action1": "Opent de _Interface_", "block.create.schematicannon.tooltip.action1": "Opent de _Interface_",
@ -1447,7 +1458,7 @@
"item.create.belt_connector.tooltip": "TRANSPORTBAND CONNECTOR", "item.create.belt_connector.tooltip": "TRANSPORTBAND CONNECTOR",
"item.create.belt_connector.tooltip.summary": "Verbind twee _Drijfassen_ met een _Mechanische_ _Transportband._ Verbonden drijfassen zullen dezelfde rotatiesneheid en richting hebben. De Transportband kan ook Entiteiten transporteren", "item.create.belt_connector.tooltip.summary": "Verbind twee _Drijfassen_ met een _Mechanische_ _Transportband._ Verbonden drijfassen zullen dezelfde rotatiesneheid en richting hebben. De Transportband kan ook Entiteiten transporteren",
"item.create.belt_connector.tooltip.control1": "R-Klikken op drijfas", "item.create.belt_connector.tooltip.control1": "R-Klikken op drijfas",
"item.create.belt_connector.tooltip.action1": "Selecteer de Drijfas als een katrol van de transportband. Beide geselecteerde drijfassen moeten _verticaal_, _horizontaal_ of _diagonaal_ in _één_ _lijn_ staan in de richting van de Transportbanden.", "item.create.belt_connector.tooltip.action1": "Selecteer de Drijfas als een katrol van de transportband. Beide geselecteerde drijfassen moeten _verticaal_, _horizontaal_ of _diagonaal_ in _één_ _lijn_ staan in de richting van de Transportbanden.",
"item.create.belt_connector.tooltip.control2": "R-Klikken terwijl je sluipt", "item.create.belt_connector.tooltip.control2": "R-Klikken terwijl je sluipt",
"item.create.belt_connector.tooltip.action2": "_Reset_ de eerste geselecteerde positie van de Transportband", "item.create.belt_connector.tooltip.action2": "_Reset_ de eerste geselecteerde positie van de Transportband",
@ -1508,7 +1519,7 @@
"block.create.crushing_wheel.tooltip": "VERPULVERAAR", "block.create.crushing_wheel.tooltip": "VERPULVERAAR",
"block.create.crushing_wheel.tooltip.summary": "Grote draaibare wielen die alles _verpulveren_ wat hun tegen houdt.", "block.create.crushing_wheel.tooltip.summary": "Grote draaibare wielen die alles _verpulveren_ wat hun tegen houdt.",
"block.create.crushing_wheel.tooltip.condition1": "Wanneer aangesloten op een andere Verpulveraar", "block.create.crushing_wheel.tooltip.condition1": "Wanneer aangesloten op een andere Verpulveraar",
"block.create.crushing_wheel.tooltip.behaviour1": "Creëert een verpulverende installatie voor het verwerken van verschillende dingen. De tanden van de wielen moeten met elkaar in redstone_contact staan en beweken met _dezelfde_ _snelheid_ in _tegenovergestelde_ _richting._", "block.create.crushing_wheel.tooltip.behaviour1": "Creëert een verpulverende installatie voor het verwerken van verschillende dingen. De tanden van de wielen moeten met elkaar in redstone_contact staan en beweken met _dezelfde_ _snelheid_ in _tegenovergestelde_ _richting._",
"block.create.mechanical_press.tooltip": "MECHANISCHE PERS", "block.create.mechanical_press.tooltip": "MECHANISCHE PERS",
"block.create.mechanical_press.tooltip.summary": "Een krachtige zuiger voor het samenpersen van objecten onder zich. Heeft een constante _Rotatiekracht_ nodig.", "block.create.mechanical_press.tooltip.summary": "Een krachtige zuiger voor het samenpersen van objecten onder zich. Heeft een constante _Rotatiekracht_ nodig.",
@ -1537,7 +1548,7 @@
"block.create.mechanical_mixer.tooltip": "MECHANISCHE MIXER", "block.create.mechanical_mixer.tooltip": "MECHANISCHE MIXER",
"block.create.mechanical_mixer.tooltip.summary": "Een kinetische garde voor het toepassen van vormloze recepten op objecten eronder. Vereist constante _Rotatiekracht_ en een _Bekken_ hieronder geplaatst (met een tussenruimte).", "block.create.mechanical_mixer.tooltip.summary": "Een kinetische garde voor het toepassen van vormloze recepten op objecten eronder. Vereist constante _Rotatiekracht_ en een _Bekken_ hieronder geplaatst (met een tussenruimte).",
"block.create.mechanical_mixer.tooltip.condition1": "Wanneer boven een Bekken", "block.create.mechanical_mixer.tooltip.condition1": "Wanneer boven een Bekken",
"block.create.mechanical_mixer.tooltip.behaviour1": "Begint objecten in het bekken te mengen wanneer alle benodigde ingrediënten aanwezig zijn.", "block.create.mechanical_mixer.tooltip.behaviour1": "Begint objecten in het bekken te mengen wanneer alle benodigde ingrediënten aanwezig zijn.",
"block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER",
"block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped crafting_ recipe. Place _multiple in a grid_ corresponding to your recipe, and _arrange their belts_ to create a _flow_ that exits the grid on one of the crafters.", "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped crafting_ recipe. Place _multiple in a grid_ corresponding to your recipe, and _arrange their belts_ to create a _flow_ that exits the grid on one of the crafters.",
@ -1580,7 +1591,7 @@
"block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.", "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.",
"block.create.mechanical_piston.tooltip": "MECHANISCHE ZUIGER", "block.create.mechanical_piston.tooltip": "MECHANISCHE ZUIGER",
"block.create.mechanical_piston.tooltip.summary": "Een meer geavanceerde versie van de _Zuiger,_ die _Rotatiekracht_ gebruikt om gekoppelde constructies nauwkeurig te verplaatsen. _Zuiger_ _Verlgenpaalen_ aan de achterzijde definiëren het _Bereik_ van dit apparaat. Zonder verlengingen zal de zuiger niet bewegen. Gebruik _Lineaar_ _Frame_ om meer dan een enkele rij blokken te verplaatsen.", "block.create.mechanical_piston.tooltip.summary": "Een meer geavanceerde versie van de _Zuiger,_ die _Rotatiekracht_ gebruikt om gekoppelde constructies nauwkeurig te verplaatsen. _Zuiger_ _Verlgenpaalen_ aan de achterzijde definiëren het _Bereik_ van dit apparaat. Zonder verlengingen zal de zuiger niet bewegen. Gebruik _Lineaar_ _Frame_ om meer dan een enkele rij blokken te verplaatsen.",
"block.create.mechanical_piston.tooltip.condition1": "Wanneer gedraaid", "block.create.mechanical_piston.tooltip.condition1": "Wanneer gedraaid",
"block.create.mechanical_piston.tooltip.behaviour1": "Begint de bijgevoegde structuur te verplaatsen. Snelheid en richting correleren met de inkomende rotatiesnelheid.", "block.create.mechanical_piston.tooltip.behaviour1": "Begint de bijgevoegde structuur te verplaatsen. Snelheid en richting correleren met de inkomende rotatiesnelheid.",
@ -1642,7 +1653,7 @@
"block.create.linear_chassis.tooltip": "LINEAAR FRAME", "block.create.linear_chassis.tooltip": "LINEAAR FRAME",
"block.create.linear_chassis.tooltip.summary": "A configurable base for Structures moved by a _Mechanische_ _Zuiger._ These Blocks have to form the first Layer of blocks in front of the Zuiger.", "block.create.linear_chassis.tooltip.summary": "A configurable base for Structures moved by a _Mechanische_ _Zuiger._ These Blocks have to form the first Layer of blocks in front of the Zuiger.",
"block.create.linear_chassis.tooltip.condition1": "Wanneer bewogen door een Mechanische Zuiger", "block.create.linear_chassis.tooltip.condition1": "Wanneer bewogen door een Mechanische Zuiger",
"block.create.linear_chassis.tooltip.behaviour1": "_Beweegt_ alle _aangesloten_ _Frames_ met dezelfde oriëntatie, en daaraan bevestigde blokken. Wanneer de Zuiger wordt ingetrokken, worden blokken alleen getrokken als het framevlak _Kleverig_ (zie [Ctrl]).", "block.create.linear_chassis.tooltip.behaviour1": "_Beweegt_ alle _aangesloten_ _Frames_ met dezelfde oriëntatie, en daaraan bevestigde blokken. Wanneer de Zuiger wordt ingetrokken, worden blokken alleen getrokken als het framevlak _Kleverig_ (zie [Ctrl]).",
"block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench",
"block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.",
"block.create.linear_chassis.tooltip.control1": "Wanneer R-Geklikt met een slijmbal", "block.create.linear_chassis.tooltip.control1": "Wanneer R-Geklikt met een slijmbal",
@ -1699,7 +1710,7 @@
"block.create.redstone_link.tooltip.condition1": "Wanneer aangestuurd", "block.create.redstone_link.tooltip.condition1": "Wanneer aangestuurd",
"block.create.redstone_link.tooltip.behaviour1": "Het ontvangen van verbindingen met dezelfde frequentie levert een Redstone-signaal.", "block.create.redstone_link.tooltip.behaviour1": "Het ontvangen van verbindingen met dezelfde frequentie levert een Redstone-signaal.",
"block.create.redstone_link.tooltip.control1": "Wanneer R-Geklikt met een object", "block.create.redstone_link.tooltip.control1": "Wanneer R-Geklikt met een object",
"block.create.redstone_link.tooltip.action1": "Stelt de _Frequentie_ in op dat object. Een totaal van _twee_ _verschillende_ _objecten_ kan in combinatie worden gebruikt voor het definiëren van een frequentie", "block.create.redstone_link.tooltip.action1": "Stelt de _Frequentie_ in op dat object. Een totaal van _twee_ _verschillende_ _objecten_ kan in combinatie worden gebruikt voor het definiëren van een frequentie",
"block.create.redstone_link.tooltip.control2": "Wanneer R-Geklikt terwijl je sluipt", "block.create.redstone_link.tooltip.control2": "Wanneer R-Geklikt terwijl je sluipt",
"block.create.redstone_link.tooltip.action2": "Schakelt tussen _ontvanger_ en _zender_modus.", "block.create.redstone_link.tooltip.action2": "Schakelt tussen _ontvanger_ en _zender_modus.",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1769", "_": "Missing Localizations: 1779",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,7 @@
"block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar",
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "UNLOCALIZED: Basin", "block.create.basin": "UNLOCALIZED: Basin",
"block.create.belt": "Esteira Mecânica", "block.create.belt": "Esteira Mecânica",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_sail": "UNLOCALIZED: Black Sail",
@ -166,8 +166,8 @@
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Caixa de Transmissão", "block.create.gearbox": "Caixa de Transmissão",
"block.create.gearshift": "Câmbio", "block.create.gearshift": "Câmbio",
"block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe",
"block.create.granite_bricks": "Tijolos de Granito", "block.create.granite_bricks": "Tijolos de Granito",
"block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab",
@ -211,32 +211,32 @@
"block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_sail": "UNLOCALIZED: Lime Sail",
"block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_seat": "UNLOCALIZED: Lime Seat",
"block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle",
"block.create.limesand": "Areia Calcária", "block.create.limesand": "Areia Calcária",
"block.create.limestone": "Calcário", "block.create.limestone": "Calcário",
"block.create.limestone_bricks": "Tijolos de Calcário", "block.create.limestone_bricks": "Tijolos de Calcário",
"block.create.limestone_bricks_slab": "Lajotas de Tijolos de Calcário", "block.create.limestone_bricks_slab": "Lajotas de Tijolos de Calcário",
"block.create.limestone_bricks_stairs": "Escadas de Tijolos de Calcário", "block.create.limestone_bricks_stairs": "Escadas de Tijolos de Calcário",
"block.create.limestone_bricks_wall": "Muro de Tijolos de Calcário", "block.create.limestone_bricks_wall": "Muro de Tijolos de Calcário",
"block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone",
"block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab",
"block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs",
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Pilar de Calcário", "block.create.limestone_pillar": "Pilar de Calcário",
"block.create.linear_chassis": "Chassis de Translado", "block.create.linear_chassis": "Chassis de Translado",
"block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner", "block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner",
"block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "Rolamento Mecânico", "block.create.mechanical_bearing": "Rolamento Mecânico",
"block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter",
"block.create.mechanical_drill": "Furadeira Mecânica", "block.create.mechanical_drill": "Furadeira Mecânica",
"block.create.mechanical_harvester": "Coletor Mecânico", "block.create.mechanical_harvester": "Coletor Mecânico",
"block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer", "block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer",
"block.create.mechanical_piston": "Pistão Mecânico", "block.create.mechanical_piston": "Pistão Mecânico",
"block.create.mechanical_piston_head": "Cabeça do Pistão Mecânico", "block.create.mechanical_piston_head": "Cabeça do Pistão Mecânico",
"block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough",
"block.create.mechanical_press": "Prensa Mecânico", "block.create.mechanical_press": "Prensa Mecânico",
"block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump",
"block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw",
"block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket",
@ -310,7 +310,7 @@
"block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_sail": "UNLOCALIZED: Pink Sail",
"block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_seat": "UNLOCALIZED: Pink Seat",
"block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle",
"block.create.piston_extension_pole": "Vara de Extensão do Pistão", "block.create.piston_extension_pole": "Vara de Extensão do Pistão",
"block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria",
"block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab",
"block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs",
@ -323,16 +323,16 @@
"block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab",
"block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs",
"block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall",
"block.create.polished_limestone": "Calcário Polido", "block.create.polished_limestone": "Calcário Polido",
"block.create.polished_limestone_slab": "Lajotas de Calcário Polido", "block.create.polished_limestone_slab": "Lajotas de Calcário Polido",
"block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs",
"block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall",
"block.create.polished_scoria": "UNLOCALIZED: Polished Scoria", "block.create.polished_scoria": "UNLOCALIZED: Polished Scoria",
"block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab", "block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab",
"block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs",
"block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall",
"block.create.polished_weathered_limestone": "Calcário Polido Resistido", "block.create.polished_weathered_limestone": "Calcário Polido Resistido",
"block.create.polished_weathered_limestone_slab": "Lajota de Calcário Polido Resistido", "block.create.polished_weathered_limestone_slab": "Lajota de Calcário Polido Resistido",
"block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs",
"block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall",
"block.create.portable_fluid_interface": "UNLOCALIZED: Portable Fluid Interface", "block.create.portable_fluid_interface": "UNLOCALIZED: Portable Fluid Interface",
@ -344,12 +344,12 @@
"block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_sail": "UNLOCALIZED: Purple Sail",
"block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_seat": "UNLOCALIZED: Purple Seat",
"block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle",
"block.create.radial_chassis": "Chassis de Rotação", "block.create.radial_chassis": "Chassis de Rotação",
"block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_sail": "UNLOCALIZED: Red Sail",
"block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_seat": "UNLOCALIZED: Red Seat",
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
"block.create.redstone_contact": "Contato de Redstone", "block.create.redstone_contact": "Contato de Redstone",
"block.create.redstone_link": "Conexão de Redstone", "block.create.redstone_link": "Conexão de Redstone",
"block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing",
"block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail",
"block.create.rope": "UNLOCALIZED: Rope", "block.create.rope": "UNLOCALIZED: Rope",
@ -379,27 +379,28 @@
"block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento", "block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento",
"block.create.stockpile_switch": "Disjuntor de Armazenamento", "block.create.stockpile_switch": "Disjuntor de Armazenamento",
"block.create.stressometer": "UNLOCALIZED: Stressometer", "block.create.stressometer": "UNLOCALIZED: Stressometer",
"block.create.tiled_glass": "Vidro Entalhado", "block.create.tiled_glass": "Vidro Entalhado",
"block.create.tiled_glass_pane": "Vidraça Entalhada", "block.create.tiled_glass_pane": "Vidraça Entalhada",
"block.create.turntable": "Mesa giratória", "block.create.turntable": "Mesa giratória",
"block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane",
"block.create.warped_window": "UNLOCALIZED: Warped Window", "block.create.warped_window": "UNLOCALIZED: Warped Window",
"block.create.warped_window_pane": "UNLOCALIZED: Warped Window Pane", "block.create.warped_window_pane": "UNLOCALIZED: Warped Window Pane",
"block.create.water_wheel": "Roda de Ã<EFBFBD>gua", "block.create.water_wheel": "Roda de Água",
"block.create.weathered_limestone": "Calcário Resistido", "block.create.weathered_limestone": "Calcário Resistido",
"block.create.weathered_limestone_bricks": "Tijolos de Calcário Resistido", "block.create.weathered_limestone_bricks": "Tijolos de Calcário Resistido",
"block.create.weathered_limestone_bricks_slab": "Lajota de Tijolos de Calcário Resistido", "block.create.weathered_limestone_bricks_slab": "Lajota de Tijolos de Calcário Resistido",
"block.create.weathered_limestone_bricks_stairs": "Escadas de Tijolos de Calcário Resistido", "block.create.weathered_limestone_bricks_stairs": "Escadas de Tijolos de Calcário Resistido",
"block.create.weathered_limestone_bricks_wall": "Muro de Tijolos de Calcário Resistido", "block.create.weathered_limestone_bricks_wall": "Muro de Tijolos de Calcário Resistido",
"block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone",
"block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab",
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "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_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Pilar de Calcário Resistido", "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_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -424,7 +425,7 @@
"item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy",
"item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter",
"item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate", "item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate",
"item.create.belt_connector": "Esteira Mecânica", "item.create.belt_connector": "Esteira Mecânica",
"item.create.blaze_cake": "UNLOCALIZED: Blaze Cake", "item.create.blaze_cake": "UNLOCALIZED: Blaze Cake",
"item.create.blaze_cake_base": "UNLOCALIZED: Blaze Cake Base", "item.create.blaze_cake_base": "UNLOCALIZED: Blaze Cake Base",
"item.create.brass_hand": "UNLOCALIZED: Brass Hand", "item.create.brass_hand": "UNLOCALIZED: Brass Hand",
@ -465,7 +466,7 @@
"item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption",
"item.create.goggles": "UNLOCALIZED: Engineer's Goggles", "item.create.goggles": "UNLOCALIZED: Engineer's Goggles",
"item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet",
"item.create.handheld_blockzapper": "Blockzapper Portátil", "item.create.handheld_blockzapper": "Blockzapper Portátil",
"item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper",
"item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket",
"item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple",
@ -476,7 +477,7 @@
"item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling",
"item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz",
"item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian",
"item.create.propeller": "Hélice", "item.create.propeller": "Hélice",
"item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper",
"item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance",
"item.create.rose_quartz": "Quartzo Rosa", "item.create.rose_quartz": "Quartzo Rosa",
@ -486,7 +487,7 @@
"item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel",
"item.create.super_glue": "UNLOCALIZED: Super Glue", "item.create.super_glue": "UNLOCALIZED: Super Glue",
"item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll",
"item.create.tree_fertilizer": "Fertilizante de Ã<EFBFBD>rvore", "item.create.tree_fertilizer": "Fertilizante de Árvore",
"item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox",
"item.create.wand_of_symmetry": "Varinha de Simetria", "item.create.wand_of_symmetry": "Varinha de Simetria",
"item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour",
@ -668,7 +669,7 @@
"death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer", "death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer",
"death.attack.create.fan_fire": "%1$s foi queimado por ar quente", "death.attack.create.fan_fire": "%1$s foi queimado por ar quente",
"death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava", "death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava",
"death.attack.create.mechanical_drill": "%1$s foi empalado pela Furadeira Mecânica", "death.attack.create.mechanical_drill": "%1$s foi empalado pela Furadeira Mecânica",
"death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock",
@ -683,7 +684,7 @@
"create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire",
"create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting",
"create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava",
"create.recipe.pressing": "Prensa Mecânica", "create.recipe.pressing": "Prensa Mecânica",
"create.recipe.mixing": "UNLOCALIZED: Mixing", "create.recipe.mixing": "UNLOCALIZED: Mixing",
"create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting",
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
@ -694,7 +695,7 @@
"create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting",
"create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting",
"create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting",
"create.recipe.blockzapper_upgrade": "Blockzapper Portátil", "create.recipe.blockzapper_upgrade": "Blockzapper Portátil",
"create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing",
"create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion",
"create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout", "create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout",
@ -704,7 +705,7 @@
"create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated",
"create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated",
"create.generic.range": "Ã<EFBFBD>rea", "create.generic.range": "Área",
"create.generic.radius": "Raio", "create.generic.radius": "Raio",
"create.generic.width": "UNLOCALIZED: Width", "create.generic.width": "UNLOCALIZED: Width",
"create.generic.height": "UNLOCALIZED: Height", "create.generic.height": "UNLOCALIZED: Height",
@ -731,7 +732,7 @@
"create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)",
"create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)",
"create.gui.scrollInput.defaultTitle": "Escolha uma Opção:", "create.gui.scrollInput.defaultTitle": "Escolha uma Opção:",
"create.gui.scrollInput.scrollToModify": "Role o mouse para Modificar", "create.gui.scrollInput.scrollToModify": "Role o mouse para Modificar",
"create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount", "create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount",
"create.gui.scrollInput.scrollToSelect": "Role o mouse para Selecionar", "create.gui.scrollInput.scrollToSelect": "Role o mouse para Selecionar",
@ -739,7 +740,7 @@
"create.gui.toolmenu.focusKey": "Segure [%1$s] para Focar", "create.gui.toolmenu.focusKey": "Segure [%1$s] para Focar",
"create.gui.toolmenu.cycle": "[SCROLL] para Circular", "create.gui.toolmenu.cycle": "[SCROLL] para Circular",
"create.gui.symmetryWand.mirrorType": "Espelhar", "create.gui.symmetryWand.mirrorType": "Espelhar",
"create.gui.symmetryWand.orientation": "Orientação", "create.gui.symmetryWand.orientation": "Orientação",
"create.symmetry.mirror.plane": "Espelhar uma vez", "create.symmetry.mirror.plane": "Espelhar uma vez",
"create.symmetry.mirror.doublePlane": "Retangular", "create.symmetry.mirror.doublePlane": "Retangular",
@ -748,17 +749,17 @@
"create.orientation.orthogonal": "Ortogonal", "create.orientation.orthogonal": "Ortogonal",
"create.orientation.diagonal": "Diagonal", "create.orientation.diagonal": "Diagonal",
"create.orientation.horizontal": "Horizontal", "create.orientation.horizontal": "Horizontal",
"create.orientation.alongZ": "Através de Z", "create.orientation.alongZ": "Através de Z",
"create.orientation.alongX": "Através de X", "create.orientation.alongX": "Através de X",
"create.gui.blockzapper.title": "Blockzapper Portátil", "create.gui.blockzapper.title": "Blockzapper Portátil",
"create.gui.blockzapper.replaceMode": "Modo de Substituição", "create.gui.blockzapper.replaceMode": "Modo de Substituição",
"create.gui.blockzapper.searchDiagonal": "Seguir as Diagonais", "create.gui.blockzapper.searchDiagonal": "Seguir as Diagonais",
"create.gui.blockzapper.searchFuzzy": "Ignorar Material nas Bordas", "create.gui.blockzapper.searchFuzzy": "Ignorar Material nas Bordas",
"create.gui.blockzapper.range": "Raio de Expansão", "create.gui.blockzapper.range": "Raio de Expansão",
"create.gui.blockzapper.needsUpgradedAmplifier": "UNLOCALIZED: Requires Upgraded Amplifier", "create.gui.blockzapper.needsUpgradedAmplifier": "UNLOCALIZED: Requires Upgraded Amplifier",
"create.gui.blockzapper.patternSection": "Padrões", "create.gui.blockzapper.patternSection": "Padrões",
"create.gui.blockzapper.pattern.solid": "Sólido", "create.gui.blockzapper.pattern.solid": "Sólido",
"create.gui.blockzapper.pattern.checkered": "Xadrez", "create.gui.blockzapper.pattern.checkered": "Xadrez",
"create.gui.blockzapper.pattern.inversecheckered": "Xadrez invertido", "create.gui.blockzapper.pattern.inversecheckered": "Xadrez invertido",
"create.gui.blockzapper.pattern.chance25": "25% de chance", "create.gui.blockzapper.pattern.chance25": "25% de chance",
@ -793,7 +794,7 @@
"create.blockzapper.componentTier.none": "Nada", "create.blockzapper.componentTier.none": "Nada",
"create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass",
"create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic",
"create.blockzapper.leftClickToSet": "Botão-Esquerdo em um Bloco para selecionar Material", "create.blockzapper.leftClickToSet": "Botão-Esquerdo em um Bloco para selecionar Material",
"create.blockzapper.empty": "Sem Blocos!", "create.blockzapper.empty": "Sem Blocos!",
"create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each",
@ -850,7 +851,7 @@
"create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.",
"create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.",
"create.gui.adjustable_crate.title": "adjustable_crate", "create.gui.adjustable_crate.title": "adjustable_crate",
"create.gui.adjustable_crate.storageSpace": "Espaço de Armazenamento", "create.gui.adjustable_crate.storageSpace": "Espaço de Armazenamento",
"create.gui.stockpile_switch.title": "Disjuntor de Armazenamento", "create.gui.stockpile_switch.title": "Disjuntor de Armazenamento",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
@ -877,25 +878,25 @@
"create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed", "create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed",
"create.schematicAndQuill.dimensions": "Tamanho Esquema: %1$sx%2$sx%3$s", "create.schematicAndQuill.dimensions": "Tamanho Esquema: %1$sx%2$sx%3$s",
"create.schematicAndQuill.firstPos": "Primeira posição feita.", "create.schematicAndQuill.firstPos": "Primeira posição feita.",
"create.schematicAndQuill.secondPos": "Segunda posição feita.", "create.schematicAndQuill.secondPos": "Segunda posição feita.",
"create.schematicAndQuill.noTarget": "Seguro [Ctrl] para selecionar Blocos de Ar.", "create.schematicAndQuill.noTarget": "Seguro [Ctrl] para selecionar Blocos de Ar.",
"create.schematicAndQuill.abort": "Seleção removida.", "create.schematicAndQuill.abort": "Seleção removida.",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Meu Esquema", "create.schematicAndQuill.fallbackName": "Meu Esquema",
"create.schematicAndQuill.saved": "Salvo como %1$s", "create.schematicAndQuill.saved": "Salvo como %1$s",
"create.schematic.invalid": "[!] Item Inválido - Use a Mesa de Desenho no lugar", "create.schematic.invalid": "[!] Item Inválido - Use a Mesa de Desenho no lugar",
"create.schematic.position": "Posição", "create.schematic.position": "Posição",
"create.schematic.rotation": "Rotação", "create.schematic.rotation": "Rotação",
"create.schematic.rotation.none": "Nada", "create.schematic.rotation.none": "Nada",
"create.schematic.rotation.cw90": "Sentido horário 90", "create.schematic.rotation.cw90": "Sentido horário 90",
"create.schematic.rotation.cw180": "Sentido horário 180", "create.schematic.rotation.cw180": "Sentido horário 180",
"create.schematic.rotation.cw270": "Sentido horário 270", "create.schematic.rotation.cw270": "Sentido horário 270",
"create.schematic.mirror": "Espelhar", "create.schematic.mirror": "Espelhar",
"create.schematic.mirror.none": "Nada", "create.schematic.mirror.none": "Nada",
"create.schematic.mirror.frontBack": "Frente para Trás", "create.schematic.mirror.frontBack": "Frente para Trás",
"create.schematic.mirror.leftRight": "Esquerda para Direita", "create.schematic.mirror.leftRight": "Esquerda para Direita",
"create.schematic.tool.deploy": "Concluir", "create.schematic.tool.deploy": "Concluir",
"create.schematic.tool.move": "Mover XZ", "create.schematic.tool.move": "Mover XZ",
@ -904,9 +905,9 @@
"create.schematic.tool.print": "Imprimir", "create.schematic.tool.print": "Imprimir",
"create.schematic.tool.flip": "Virar", "create.schematic.tool.flip": "Virar",
"create.schematic.tool.deploy.description.0": "Move o lugar da estrutura.", "create.schematic.tool.deploy.description.0": "Move o lugar da estrutura.",
"create.schematic.tool.deploy.description.1": "Botão-direito no chão para colocar.", "create.schematic.tool.deploy.description.1": "Botão-direito no chão para colocar.",
"create.schematic.tool.deploy.description.2": "Segure [Ctrl] para selecionar em uma distância fixa.", "create.schematic.tool.deploy.description.2": "Segure [Ctrl] para selecionar em uma distância fixa.",
"create.schematic.tool.deploy.description.3": "[Ctrl]-Rolar para mudar a distância.", "create.schematic.tool.deploy.description.3": "[Ctrl]-Rolar para mudar a distância.",
"create.schematic.tool.move.description.0": "Vira o Esquema Horizontalmente", "create.schematic.tool.move.description.0": "Vira o Esquema Horizontalmente",
"create.schematic.tool.move.description.1": "Aponte ao Esquema e [CTRL]-Rolar para empurrar.", "create.schematic.tool.move.description.1": "Aponte ao Esquema e [CTRL]-Rolar para empurrar.",
"create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.2": "",
@ -920,17 +921,17 @@
"create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.2": "",
"create.schematic.tool.rotate.description.3": "", "create.schematic.tool.rotate.description.3": "",
"create.schematic.tool.print.description.0": "Coloca estrutura no mundo instantaneamente", "create.schematic.tool.print.description.0": "Coloca estrutura no mundo instantaneamente",
"create.schematic.tool.print.description.1": "[Botão-Direito] para confirmar a posição atual.", "create.schematic.tool.print.description.1": "[Botão-Direito] para confirmar a posição atual.",
"create.schematic.tool.print.description.2": "Esta ferramenta é para o Modo Criativo apenas.", "create.schematic.tool.print.description.2": "Esta ferramenta é para o Modo Criativo apenas.",
"create.schematic.tool.print.description.3": "", "create.schematic.tool.print.description.3": "",
"create.schematic.tool.flip.description.0": "Gira o Esquema ao longo da face que você selecionar.", "create.schematic.tool.flip.description.0": "Gira o Esquema ao longo da face que você selecionar.",
"create.schematic.tool.flip.description.1": "Aponte para o Esquema e [CTRL]-Rolar para virá-lo.", "create.schematic.tool.flip.description.1": "Aponte para o Esquema e [CTRL]-Rolar para virá-lo.",
"create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.2": "",
"create.schematic.tool.flip.description.3": "", "create.schematic.tool.flip.description.3": "",
"create.schematics.synchronizing": "Sincronizando...", "create.schematics.synchronizing": "Sincronizando...",
"create.schematics.uploadTooLarge": "Seu esquema é muito grande", "create.schematics.uploadTooLarge": "Seu esquema é muito grande",
"create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:", "create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
@ -938,47 +939,47 @@
"create.gui.schematicTable.availableSchematics": "UNLOCALIZED: Available Schematics", "create.gui.schematicTable.availableSchematics": "UNLOCALIZED: Available Schematics",
"create.gui.schematicTable.noSchematics": "UNLOCALIZED: No Schematics Saved", "create.gui.schematicTable.noSchematics": "UNLOCALIZED: No Schematics Saved",
"create.gui.schematicTable.uploading": "Importando...", "create.gui.schematicTable.uploading": "Importando...",
"create.gui.schematicTable.finished": "Envio Concluído!", "create.gui.schematicTable.finished": "Envio Concluído!",
"create.gui.schematicannon.title": "Esquemaannon", "create.gui.schematicannon.title": "Esquemaannon",
"create.gui.schematicannon.listPrinter": "Impressora de Lista de Materiais", "create.gui.schematicannon.listPrinter": "Impressora de Lista de Materiais",
"create.gui.schematicannon.gunpowderLevel": "Pólvora em %1$s%%", "create.gui.schematicannon.gunpowderLevel": "Pólvora em %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Disparos faltantes: %1$s", "create.gui.schematicannon.shotsRemaining": "Disparos faltantes: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "Com backup: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "Com backup: %1$s",
"create.gui.schematicannon.optionEnabled": "Habilitado Atualmente", "create.gui.schematicannon.optionEnabled": "Habilitado Atualmente",
"create.gui.schematicannon.optionDisabled": "Desabilitado Atualmente", "create.gui.schematicannon.optionDisabled": "Desabilitado Atualmente",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Não Substituir Blocos Sólidos", "create.gui.schematicannon.option.dontReplaceSolid": "Não Substituir Blocos Sólidos",
"create.gui.schematicannon.option.replaceWithSolid": "Substituir Blocos Sólidos", "create.gui.schematicannon.option.replaceWithSolid": "Substituir Blocos Sólidos",
"create.gui.schematicannon.option.replaceWithAny": "Substituir Sólidos com Qualquer", "create.gui.schematicannon.option.replaceWithAny": "Substituir Sólidos com Qualquer",
"create.gui.schematicannon.option.replaceWithEmpty": "Substituir Sólidos com Vazio", "create.gui.schematicannon.option.replaceWithEmpty": "Substituir Sólidos com Vazio",
"create.gui.schematicannon.option.skipMissing": "Pulando Blocos faltantes", "create.gui.schematicannon.option.skipMissing": "Pulando Blocos faltantes",
"create.gui.schematicannon.option.skipTileEntities": "Proteger Entidades Entalhadas", "create.gui.schematicannon.option.skipTileEntities": "Proteger Entidades Entalhadas",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Se o Esquemaannon não encontrar o Bloco para colocar, ele irá continuar para a próx. Posição.", "create.gui.schematicannon.option.skipMissing.description": "Se o Esquemaannon não encontrar o Bloco para colocar, ele irá continuar para a próx. Posição.",
"create.gui.schematicannon.option.skipTileEntities.description": "O Esquemaannon vai evitar substituir blocos que contêm dados como Baus.", "create.gui.schematicannon.option.skipTileEntities.description": "O Esquemaannon vai evitar substituir blocos que contêm dados como Baus.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "O canhão irá nunca substituir Blocos sólidos na área em trabalho, apenas não-Sólidos e Ar.", "create.gui.schematicannon.option.dontReplaceSolid.description": "O canhão irá nunca substituir Blocos sólidos na área em trabalho, apenas não-Sólidos e Ar.",
"create.gui.schematicannon.option.replaceWithSolid.description": "O canhão irá apenas substituir Blocos sólidos na área de trabalho, se o Esquema conter um bloco Sólido naquela posição.", "create.gui.schematicannon.option.replaceWithSolid.description": "O canhão irá apenas substituir Blocos sólidos na área de trabalho, se o Esquema conter um bloco Sólido naquela posição.",
"create.gui.schematicannon.option.replaceWithAny.description": "O canhão irá substituir Blocos sólidos na área de trabalho, se o Esquema conter qualquer Bloco naquela posição.", "create.gui.schematicannon.option.replaceWithAny.description": "O canhão irá substituir Blocos sólidos na área de trabalho, se o Esquema conter qualquer Bloco naquela posição.",
"create.gui.schematicannon.option.replaceWithEmpty.description": "O canhão irá limpar todos os blocos na área de trabalho, incluindo os substituídos por Ar.", "create.gui.schematicannon.option.replaceWithEmpty.description": "O canhão irá limpar todos os blocos na área de trabalho, incluindo os substituídos por Ar.",
"create.schematicannon.status.idle": "Ocioso", "create.schematicannon.status.idle": "Ocioso",
"create.schematicannon.status.ready": "Pronto", "create.schematicannon.status.ready": "Pronto",
"create.schematicannon.status.running": "Trabalhando", "create.schematicannon.status.running": "Trabalhando",
"create.schematicannon.status.finished": "Concluído", "create.schematicannon.status.finished": "Concluído",
"create.schematicannon.status.paused": "Pausado", "create.schematicannon.status.paused": "Pausado",
"create.schematicannon.status.stopped": "Parada", "create.schematicannon.status.stopped": "Parada",
"create.schematicannon.status.noGunpowder": "UNLOCALIZED: Out of Gunpowder", "create.schematicannon.status.noGunpowder": "UNLOCALIZED: Out of Gunpowder",
"create.schematicannon.status.targetNotLoaded": "Bloco não carregado", "create.schematicannon.status.targetNotLoaded": "Bloco não carregado",
"create.schematicannon.status.targetOutsideRange": "Alvo está muito Longe", "create.schematicannon.status.targetOutsideRange": "Alvo está muito Longe",
"create.schematicannon.status.searching": "Procurando", "create.schematicannon.status.searching": "Procurando",
"create.schematicannon.status.skipping": "Pulando", "create.schematicannon.status.skipping": "Pulando",
"create.schematicannon.status.missingBlock": "Bloco Faltante:", "create.schematicannon.status.missingBlock": "Bloco Faltante:",
"create.schematicannon.status.placing": "Colocando", "create.schematicannon.status.placing": "Colocando",
"create.schematicannon.status.clearing": "Limpando Blocos", "create.schematicannon.status.clearing": "Limpando Blocos",
"create.schematicannon.status.schematicInvalid": "Esquema Inválido", "create.schematicannon.status.schematicInvalid": "Esquema Inválido",
"create.schematicannon.status.schematicNotPlaced": "Esquema não Colocado", "create.schematicannon.status.schematicNotPlaced": "Esquema não Colocado",
"create.schematicannon.status.schematicExpired": "Arquivo de Esquema Expirado", "create.schematicannon.status.schematicExpired": "Arquivo de Esquema Expirado",
"create.materialChecklist": "UNLOCALIZED: Material Checklist", "create.materialChecklist": "UNLOCALIZED: Material Checklist",
@ -1027,6 +1028,10 @@
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s",
"create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s",
"create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s",
@ -1088,6 +1093,12 @@
"create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "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.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.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1321,24 +1332,24 @@
"block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical Arm_.", "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical Arm_.",
"item.create.wand_of_symmetry.tooltip": "VARINHA DE SIMETRIA", "item.create.wand_of_symmetry.tooltip": "VARINHA DE SIMETRIA",
"item.create.wand_of_symmetry.tooltip.summary": "Espelhar perfeitamente a colocação de blocos nos planos configurados.", "item.create.wand_of_symmetry.tooltip.summary": "Espelhar perfeitamente a colocação de blocos nos planos configurados.",
"item.create.wand_of_symmetry.tooltip.condition1": "Quando na Hotbar", "item.create.wand_of_symmetry.tooltip.condition1": "Quando na Hotbar",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Mantem-se Ativo", "item.create.wand_of_symmetry.tooltip.behaviour1": "Mantem-se Ativo",
"item.create.wand_of_symmetry.tooltip.control1": "B-Direito no Chão", "item.create.wand_of_symmetry.tooltip.control1": "B-Direito no Chão",
"item.create.wand_of_symmetry.tooltip.action1": "_Cria_ ou _Move_ o Espelho", "item.create.wand_of_symmetry.tooltip.action1": "_Cria_ ou _Move_ o Espelho",
"item.create.wand_of_symmetry.tooltip.control2": "B-Direito no Ar", "item.create.wand_of_symmetry.tooltip.control2": "B-Direito no Ar",
"item.create.wand_of_symmetry.tooltip.action2": "_Remove_ o Espelho ativo", "item.create.wand_of_symmetry.tooltip.action2": "_Remove_ o Espelho ativo",
"item.create.wand_of_symmetry.tooltip.control3": "B-Direito enquanto Abaixado", "item.create.wand_of_symmetry.tooltip.control3": "B-Direito enquanto Abaixado",
"item.create.wand_of_symmetry.tooltip.action3": "Abre _Interface_ de _Configuração_", "item.create.wand_of_symmetry.tooltip.action3": "Abre _Interface_ de _Configuração_",
"item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER",
"item.create.handheld_blockzapper.tooltip.summary": "Gadget imaginário para colocar ou substituir blocos a distância.", "item.create.handheld_blockzapper.tooltip.summary": "Gadget imaginário para colocar ou substituir blocos a distância.",
"item.create.handheld_blockzapper.tooltip.control1": "B-Esquerdo no Bloco", "item.create.handheld_blockzapper.tooltip.control1": "B-Esquerdo no Bloco",
"item.create.handheld_blockzapper.tooltip.action1": "Define os blocos colocados pela ferramenta no bloco de destino.", "item.create.handheld_blockzapper.tooltip.action1": "Define os blocos colocados pela ferramenta no bloco de destino.",
"item.create.handheld_blockzapper.tooltip.control2": "B-Direito em Bloco", "item.create.handheld_blockzapper.tooltip.control2": "B-Direito em Bloco",
"item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ ou _Substitui_ o bloco alvo.", "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ ou _Substitui_ o bloco alvo.",
"item.create.handheld_blockzapper.tooltip.control3": "B-Direito equando Abaixado", "item.create.handheld_blockzapper.tooltip.control3": "B-Direito equando Abaixado",
"item.create.handheld_blockzapper.tooltip.action3": "Abre _Interface_ de _Configuração_", "item.create.handheld_blockzapper.tooltip.action3": "Abre _Interface_ de _Configuração_",
"item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER",
"item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain features_.",
@ -1350,9 +1361,9 @@
"item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration Interface_", "item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration Interface_",
"item.create.tree_fertilizer.tooltip": "FERTILIZANTE DE ARVORE", "item.create.tree_fertilizer.tooltip": "FERTILIZANTE DE ARVORE",
"item.create.tree_fertilizer.tooltip.summary": "Uma combinação poderosa de minerais para tipos comuns de arvores", "item.create.tree_fertilizer.tooltip.summary": "Uma combinação poderosa de minerais para tipos comuns de arvores",
"item.create.tree_fertilizer.tooltip.condition1": "Quando usada em Mudas", "item.create.tree_fertilizer.tooltip.condition1": "Quando usada em Mudas",
"item.create.tree_fertilizer.tooltip.behaviour1": "Cresce Arvores independentemente das suas Regras de espaço", "item.create.tree_fertilizer.tooltip.behaviour1": "Cresce Arvores independentemente das suas Regras de espaço",
"item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER",
"item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant axe_ able to chop down trees in a split second.", "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant axe_ able to chop down trees in a split second.",
@ -1380,8 +1391,8 @@
"item.create.empty_schematic.tooltip.summary": "Usado como ingrediente em receitas e para escrever na _Mesa_ _de_ _Esquematizar_", "item.create.empty_schematic.tooltip.summary": "Usado como ingrediente em receitas e para escrever na _Mesa_ _de_ _Esquematizar_",
"item.create.schematic.tooltip": "ESQUEMA", "item.create.schematic.tooltip": "ESQUEMA",
"item.create.schematic.tooltip.summary": "Contem uma estrutura para ser posicionada e colocada no mundo. Posicione o Holograma como desejar e use um _Esquemaannon_ para construí-lo.", "item.create.schematic.tooltip.summary": "Contem uma estrutura para ser posicionada e colocada no mundo. Posicione o Holograma como desejar e use um _Esquemaannon_ para construí-lo.",
"item.create.schematic.tooltip.condition1": "Quando Em mãos", "item.create.schematic.tooltip.condition1": "Quando Em mãos",
"item.create.schematic.tooltip.behaviour1": "Pode ser posicionado usando as Ferramentas em Tela", "item.create.schematic.tooltip.behaviour1": "Pode ser posicionado usando as Ferramentas em Tela",
"item.create.schematic.tooltip.control1": "B-Direito enquanto Abaixado", "item.create.schematic.tooltip.control1": "B-Direito enquanto Abaixado",
"item.create.schematic.tooltip.action1": "Abre uma _Interface_ para informar as _Coordenadas_ exatas.", "item.create.schematic.tooltip.action1": "Abre uma _Interface_ para informar as _Coordenadas_ exatas.",
@ -1395,12 +1406,12 @@
"item.create.schematic_and_quill.tooltip.control1": "B-Direito", "item.create.schematic_and_quill.tooltip.control1": "B-Direito",
"item.create.schematic_and_quill.tooltip.action1": "Selecione um canto / confirmar salvamento", "item.create.schematic_and_quill.tooltip.action1": "Selecione um canto / confirmar salvamento",
"item.create.schematic_and_quill.tooltip.control2": "Ctrl Pressionado", "item.create.schematic_and_quill.tooltip.control2": "Ctrl Pressionado",
"item.create.schematic_and_quill.tooltip.action2": "Selecione pontos no _meio_ _do_ _ar_. _Rolar_ para ajustar a distância.", "item.create.schematic_and_quill.tooltip.action2": "Selecione pontos no _meio_ _do_ _ar_. _Rolar_ para ajustar a distância.",
"item.create.schematic_and_quill.tooltip.control3": "B-Direito enquanto Abaixado", "item.create.schematic_and_quill.tooltip.control3": "B-Direito enquanto Abaixado",
"item.create.schematic_and_quill.tooltip.action3": "_Cancela_ e remove a seleção.", "item.create.schematic_and_quill.tooltip.action3": "_Cancela_ e remove a seleção.",
"block.create.schematicannon.tooltip": "ESQUEMAANNON", "block.create.schematicannon.tooltip": "ESQUEMAANNON",
"block.create.schematicannon.tooltip.summary": "Dispara blocos para recriar um _Esquema_ no Mundo. Usa itens de Inventários adjacentes e _Pólvora_ como combustível.", "block.create.schematicannon.tooltip.summary": "Dispara blocos para recriar um _Esquema_ no Mundo. Usa itens de Inventários adjacentes e _Pólvora_ como combustível.",
"block.create.schematicannon.tooltip.control1": "Quando Apertado com B-Direito", "block.create.schematicannon.tooltip.control1": "Quando Apertado com B-Direito",
"block.create.schematicannon.tooltip.action1": "Abre a _Interface_", "block.create.schematicannon.tooltip.action1": "Abre a _Interface_",
@ -1410,29 +1421,29 @@
"block.create.schematic_table.tooltip.behaviour1": "Importa um Arquivo escolhido da sua Pasta de Esquemas", "block.create.schematic_table.tooltip.behaviour1": "Importa um Arquivo escolhido da sua Pasta de Esquemas",
"block.create.shaft.tooltip": "EIXO", "block.create.shaft.tooltip": "EIXO",
"block.create.shaft.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta.", "block.create.shaft.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta.",
"block.create.cogwheel.tooltip": "RODA DENTADA", "block.create.cogwheel.tooltip": "RODA DENTADA",
"block.create.cogwheel.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta, e para _Rodas_ _Dentadas_ adjacentes.", "block.create.cogwheel.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta, e para _Rodas_ _Dentadas_ adjacentes.",
"block.create.large_cogwheel.tooltip": "RODA DENTADA GRADE", "block.create.large_cogwheel.tooltip": "RODA DENTADA GRADE",
"block.create.large_cogwheel.tooltip.summary": "Uma versão maior da _Roda_ _Dentada,_ permitindo mudança na _Velocidade_ de _Rotação_ quando conectada a sua Contraparte.", "block.create.large_cogwheel.tooltip.summary": "Uma versão maior da _Roda_ _Dentada,_ permitindo mudança na _Velocidade_ de _Rotação_ quando conectada a sua Contraparte.",
"block.create.encased_shaft.tooltip": "EIXO REVESTIDO", "block.create.encased_shaft.tooltip": "EIXO REVESTIDO",
"block.create.encased_shaft.tooltip.summary": " _Transmite_ _Rotação_ em uma linha reta. Apropriada para propagar Rotação através de Muros.", "block.create.encased_shaft.tooltip.summary": " _Transmite_ _Rotação_ em uma linha reta. Apropriada para propagar Rotação através de Muros.",
"block.create.gearbox.tooltip": "CAIXA DE TRANSMISSÃO", "block.create.gearbox.tooltip": "CAIXA DE TRANSMISSÃO",
"block.create.gearbox.tooltip.summary": "_Transmite_ _Rotação_ em _Quatro_ _direções._ Reverte conexões diretas.", "block.create.gearbox.tooltip.summary": "_Transmite_ _Rotação_ em _Quatro_ _direções._ Reverte conexões diretas.",
"block.create.gearshift.tooltip": "CÂMBIO", "block.create.gearshift.tooltip": "CÂMBIO",
"block.create.gearshift.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para eixos conectados.", "block.create.gearshift.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para eixos conectados.",
"block.create.gearshift.tooltip.condition1": "Quando Ligado", "block.create.gearshift.tooltip.condition1": "Quando Ligado",
"block.create.gearshift.tooltip.behaviour1": "_Inverte_ a rotação de saída.", "block.create.gearshift.tooltip.behaviour1": "_Inverte_ a rotação de saída.",
"block.create.clutch.tooltip": "EMBREAGEM", "block.create.clutch.tooltip": "EMBREAGEM",
"block.create.clutch.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para os eixos conectados.", "block.create.clutch.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para os eixos conectados.",
"block.create.clutch.tooltip.condition1": "Quando Ligado", "block.create.clutch.tooltip.condition1": "Quando Ligado",
"block.create.clutch.tooltip.behaviour1": "_Para_ de prover rotação para o outro lado.", "block.create.clutch.tooltip.behaviour1": "_Para_ de prover rotação para o outro lado.",
"block.create.encased_chain_drive.tooltip": "UNLOCALIZED: ENCASED_CHAIN_DRIVE", "block.create.encased_chain_drive.tooltip": "UNLOCALIZED: ENCASED_CHAIN_DRIVE",
"block.create.encased_chain_drive.tooltip.summary": "UNLOCALIZED: _Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. Chain drives connect in a group when placed next to another on any face without a shaft. Their orientation does not have to match.", "block.create.encased_chain_drive.tooltip.summary": "UNLOCALIZED: _Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. Chain drives connect in a group when placed next to another on any face without a shaft. Their orientation does not have to match.",
@ -1444,12 +1455,12 @@
"block.create.adjustable_chain_gearshift.tooltip.condition1": "UNLOCALIZED: Redstone Control", "block.create.adjustable_chain_gearshift.tooltip.condition1": "UNLOCALIZED: Redstone Control",
"block.create.adjustable_chain_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Without_ a signal, adjacent chain drives will relay the _same speed._ With a _full strength_ signal, adjacent chain drives will relay exactly _twice its speed._ Anything inbetween will give results between 1-2x its speed.", "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Without_ a signal, adjacent chain drives will relay the _same speed._ With a _full strength_ signal, adjacent chain drives will relay exactly _twice its speed._ Anything inbetween will give results between 1-2x its speed.",
"item.create.belt_connector.tooltip": "ESTEIRA MECÂNICA", "item.create.belt_connector.tooltip": "ESTEIRA MECÂNICA",
"item.create.belt_connector.tooltip.summary": "Conecta dois _Eixos_ com uma _Esteira_ _Mecânica._ Eixos conectados irá ter exatamente a mesma velocidade e direção de rotação. A Esteira pode atuar como um _Transporte_ para _Entidades._", "item.create.belt_connector.tooltip.summary": "Conecta dois _Eixos_ com uma _Esteira_ _Mecânica._ Eixos conectados irá ter exatamente a mesma velocidade e direção de rotação. A Esteira pode atuar como um _Transporte_ para _Entidades._",
"item.create.belt_connector.tooltip.control1": "B-Direito em um Eixo", "item.create.belt_connector.tooltip.control1": "B-Direito em um Eixo",
"item.create.belt_connector.tooltip.action1": "Seleciona o eixo como uma polia da Esteira. Os dois Eixos selecionadas precisam estar _alinhados_ seja na _Vertical,_ _Horizontal_ ou _Diagonal_ na direção da Esteira.", "item.create.belt_connector.tooltip.action1": "Seleciona o eixo como uma polia da Esteira. Os dois Eixos selecionadas precisam estar _alinhados_ seja na _Vertical,_ _Horizontal_ ou _Diagonal_ na direção da Esteira.",
"item.create.belt_connector.tooltip.control2": "B-Direito enquanto Abaixado", "item.create.belt_connector.tooltip.control2": "B-Direito enquanto Abaixado",
"item.create.belt_connector.tooltip.action2": "_Cancela_ a seleção da Posição para a Esteira", "item.create.belt_connector.tooltip.action2": "_Cancela_ a seleção da Posição para a Esteira",
"item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES", "item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES",
"item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic information_.", "item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic information_.",
@ -1470,17 +1481,17 @@
"block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR", "block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR",
"block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.", "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.",
"block.create.water_wheel.tooltip": "RODA DE Ã<EFBFBD>GUA", "block.create.water_wheel.tooltip": "RODA DE ÁGUA",
"block.create.water_wheel.tooltip.summary": "Prove _Força_ _Rotacional_ tirada de _Correntes_ de _Ã<5F>gua_ próximas.", "block.create.water_wheel.tooltip.summary": "Prove _Força_ _Rotacional_ tirada de _Correntes_ de _Água_ próximas.",
"block.create.encased_fan.tooltip": "VENTILADO REVESTIDO", "block.create.encased_fan.tooltip": "VENTILADO REVESTIDO",
"block.create.encased_fan.tooltip.summary": "Converte _Força_ _Rotacional_ em _Correntes_ de _Ar_ e vice-versa. Muitos usos.", "block.create.encased_fan.tooltip.summary": "Converte _Força_ _Rotacional_ em _Correntes_ de _Ar_ e vice-versa. Muitos usos.",
"block.create.encased_fan.tooltip.condition1": "Quando sobre Fogo", "block.create.encased_fan.tooltip.condition1": "Quando sobre Fogo",
"block.create.encased_fan.tooltip.behaviour1": "Prove _Força_ _Rotacional_ (precisa ser na vertical)", "block.create.encased_fan.tooltip.behaviour1": "Prove _Força_ _Rotacional_ (precisa ser na vertical)",
"block.create.encased_fan.tooltip.condition2": "Quando Invertido", "block.create.encased_fan.tooltip.condition2": "Quando Invertido",
"block.create.encased_fan.tooltip.behaviour2": "_Empurra_ Entidades em um lado, _Puxa_ entidades no outro. Força e Velocidade dependem da Rotação de entrada.", "block.create.encased_fan.tooltip.behaviour2": "_Empurra_ Entidades em um lado, _Puxa_ entidades no outro. Força e Velocidade dependem da Rotação de entrada.",
"block.create.encased_fan.tooltip.condition3": "Quando ar flui através de blocos especiais", "block.create.encased_fan.tooltip.condition3": "Quando ar flui através de blocos especiais",
"block.create.encased_fan.tooltip.behaviour3": "Processa itens na frente do Bloco: _Ã<EFBFBD>gua_ alva, _Fogo_ defuma, e _Lava_ derrete o ingrediente.", "block.create.encased_fan.tooltip.behaviour3": "Processa itens na frente do Bloco: _Água_ alva, _Fogo_ defuma, e _Lava_ derrete o ingrediente.",
"block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE", "block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE",
"block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.", "block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.",
@ -1495,8 +1506,8 @@
"block.create.cuckoo_clock.tooltip.condition1": "UNLOCALIZED: When Powered by Kinetics", "block.create.cuckoo_clock.tooltip.condition1": "UNLOCALIZED: When Powered by Kinetics",
"block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.", "block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.",
"block.create.turntable.tooltip": "MESA GIRATÓRIA", "block.create.turntable.tooltip": "MESA GIRATÓRIA",
"block.create.turntable.tooltip.summary": "Muda a _Força_ _Rotacional_ em uma forma refinada de Enjoo.", "block.create.turntable.tooltip.summary": "Muda a _Força_ _Rotacional_ em uma forma refinada de Enjoo.",
"block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE",
"block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.",
@ -1506,15 +1517,15 @@
"block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.",
"block.create.crushing_wheel.tooltip": "RODA DE MOER", "block.create.crushing_wheel.tooltip": "RODA DE MOER",
"block.create.crushing_wheel.tooltip.summary": "Grandes rodas giratórias que _esmagam_ qualquer coisa que impeça seu movimento.", "block.create.crushing_wheel.tooltip.summary": "Grandes rodas giratórias que _esmagam_ qualquer coisa que impeça seu movimento.",
"block.create.crushing_wheel.tooltip.condition1": "Quando conectado a outras Rodas de Moer", "block.create.crushing_wheel.tooltip.condition1": "Quando conectado a outras Rodas de Moer",
"block.create.crushing_wheel.tooltip.behaviour1": "Forma uma estrutura de esmagamento para processar uma variedade de coisas. Os Dentes da rota precisam estar conectados e se movimentando com a _mesma_ _velocidade_ em _direções_ _opostas._", "block.create.crushing_wheel.tooltip.behaviour1": "Forma uma estrutura de esmagamento para processar uma variedade de coisas. Os Dentes da rota precisam estar conectados e se movimentando com a _mesma_ _velocidade_ em _direções_ _opostas._",
"block.create.mechanical_press.tooltip": "PRENSA MECÂNICA", "block.create.mechanical_press.tooltip": "PRENSA MECÂNICA",
"block.create.mechanical_press.tooltip.summary": "Um forte pistão usado para comprimir itens abaixo dele. Precisa de _Força_ _Rotacional_ constante", "block.create.mechanical_press.tooltip.summary": "Um forte pistão usado para comprimir itens abaixo dele. Precisa de _Força_ _Rotacional_ constante",
"block.create.mechanical_press.tooltip.condition1": "Quando Ligado com Redstone", "block.create.mechanical_press.tooltip.condition1": "Quando Ligado com Redstone",
"block.create.mechanical_press.tooltip.behaviour1": "_Inicia_ compressão de itens jogados abaixo dele.", "block.create.mechanical_press.tooltip.behaviour1": "_Inicia_ compressão de itens jogados abaixo dele.",
"block.create.mechanical_press.tooltip.condition2": "Quando Sobre uma Esteira Mecânica", "block.create.mechanical_press.tooltip.condition2": "Quando Sobre uma Esteira Mecânica",
"block.create.mechanical_press.tooltip.behaviour2": "_Automaticamente_ comprime itens que passando na Esteira.", "block.create.mechanical_press.tooltip.behaviour2": "_Automaticamente_ comprime itens que passando na Esteira.",
"block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin",
"block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact items_ in the basin whenever all necessary ingredients are present.", "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact items_ in the basin whenever all necessary ingredients are present.",
@ -1579,20 +1590,20 @@
"block.create.rotation_speed_controller.tooltip.condition1": "UNLOCALIZED: When Attached to Large Cogwheel", "block.create.rotation_speed_controller.tooltip.condition1": "UNLOCALIZED: When Attached to Large Cogwheel",
"block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.", "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.",
"block.create.mechanical_piston.tooltip": "PISTÃO MECÃNICO", "block.create.mechanical_piston.tooltip": "PISTÃO MECÂNICO",
"block.create.mechanical_piston.tooltip.summary": "Uma verão melhorada do _Pistão,_ usando _Força_ _Rotacional_ para mover estruturas de forma precisa. _Varas_ de _Extensão_ do _Pistão_ na traseira definem o _Alcance_ deste Dispositivo. Sem extensões o pistão não se move. Use __Chassis_ de _Translado_ para mover mais de uma linha de blocos.", "block.create.mechanical_piston.tooltip.summary": "Uma verão melhorada do _Pistão,_ usando _Força_ _Rotacional_ para mover estruturas de forma precisa. _Varas_ de _Extensão_ do _Pistão_ na traseira definem o _Alcance_ deste Dispositivo. Sem extensões o pistão não se move. Use __Chassis_ de _Translado_ para mover mais de uma linha de blocos.",
"block.create.mechanical_piston.tooltip.condition1": "Quando Rodado", "block.create.mechanical_piston.tooltip.condition1": "Quando Rodado",
"block.create.mechanical_piston.tooltip.behaviour1": "Começa a mover blocos presos na estrutura. Velocidade e direção diretamente relacionados a Velocidade Rotação de entrada.", "block.create.mechanical_piston.tooltip.behaviour1": "Começa a mover blocos presos na estrutura. Velocidade e direção diretamente relacionados a Velocidade Rotação de entrada.",
"block.create.piston_extension_pole.tooltip": "VARA DE EXTENSÃO DO PISTÃO", "block.create.piston_extension_pole.tooltip": "VARA DE EXTENSÃO DO PISTÃO",
"block.create.piston_extension_pole.tooltip.summary": "Aumenta o alcance de _Pistões_ _Mecânicos_", "block.create.piston_extension_pole.tooltip.summary": "Aumenta o alcance de _Pistões_ _Mecânicos_",
"block.create.piston_extension_pole.tooltip.condition1": "Quando preso a um Pistão Mecânico", "block.create.piston_extension_pole.tooltip.condition1": "Quando preso a um Pistão Mecânico",
"block.create.piston_extension_pole.tooltip.behaviour1": "Aumenta a extensão dos pistões em 1 bloco", "block.create.piston_extension_pole.tooltip.behaviour1": "Aumenta a extensão dos pistões em 1 bloco",
"block.create.mechanical_bearing.tooltip": "ROLAMENTO MECÂNICO", "block.create.mechanical_bearing.tooltip": "ROLAMENTO MECÂNICO",
"block.create.mechanical_bearing.tooltip.summary": "Usado para rotacionar _estruturas_ _grandes_ ou geração de _Força_ _Rotacional_ do vento.", "block.create.mechanical_bearing.tooltip.summary": "Usado para rotacionar _estruturas_ _grandes_ ou geração de _Força_ _Rotacional_ do vento.",
"block.create.mechanical_bearing.tooltip.condition1": "Quando Rodado", "block.create.mechanical_bearing.tooltip.condition1": "Quando Rodado",
"block.create.mechanical_bearing.tooltip.behaviour1": "Começa a rotacionar _Chassis_ de _Rotação_ conectados e blocos conectados a eles.", "block.create.mechanical_bearing.tooltip.behaviour1": "Começa a rotacionar _Chassis_ de _Rotação_ conectados e blocos conectados a eles.",
"block.create.windmill_bearing.tooltip": "UNLOCALIZED: WINDMILL BEARING", "block.create.windmill_bearing.tooltip": "UNLOCALIZED: WINDMILL BEARING",
"block.create.windmill_bearing.tooltip.summary": "UNLOCALIZED: Used for harnessing _Rotational Force_ from wind. Attach your own design and watch it spin!", "block.create.windmill_bearing.tooltip.summary": "UNLOCALIZED: Used for harnessing _Rotational Force_ from wind. Attach your own design and watch it spin!",
@ -1640,37 +1651,37 @@
"block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", "block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.",
"block.create.linear_chassis.tooltip": "CHASSIS DE TRANSLADO", "block.create.linear_chassis.tooltip": "CHASSIS DE TRANSLADO",
"block.create.linear_chassis.tooltip.summary": "Uma base configurável para Estruturas serem movidas por um _Pistão_ _Mecânico._ Esses Blocos precisam formas uma camada de blocos na frente do Pistão.", "block.create.linear_chassis.tooltip.summary": "Uma base configurável para Estruturas serem movidas por um _Pistão_ _Mecânico._ Esses Blocos precisam formas uma camada de blocos na frente do Pistão.",
"block.create.linear_chassis.tooltip.condition1": "Quando movido por Pistão Mecânico", "block.create.linear_chassis.tooltip.condition1": "Quando movido por Pistão Mecânico",
"block.create.linear_chassis.tooltip.behaviour1": "_Move_ todos os _Chassis_ _conectados_ na mesma orientação, e Blocos conectados a frente dele. Quando o Pistão volta, blocos apenas serão puxados se a face do chassis for _Grudenta_ (Ver [Ctrl]).", "block.create.linear_chassis.tooltip.behaviour1": "_Move_ todos os _Chassis_ _conectados_ na mesma orientação, e Blocos conectados a frente dele. Quando o Pistão volta, blocos apenas serão puxados se a face do chassis for _Grudenta_ (Ver [Ctrl]).",
"block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench",
"block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.",
"block.create.linear_chassis.tooltip.control1": "Quando clicado com B-Direito com Gosma de Slime", "block.create.linear_chassis.tooltip.control1": "Quando clicado com B-Direito com Gosma de Slime",
"block.create.linear_chassis.tooltip.action1": "Torna a face clicada _Grudenta._ Quando o pistão volta, o chassis irá _puxar_ _junto_ todos os Blocos conectados na sua coluna e no Alcance configurado.", "block.create.linear_chassis.tooltip.action1": "Torna a face clicada _Grudenta._ Quando o pistão volta, o chassis irá _puxar_ _junto_ todos os Blocos conectados na sua coluna e no Alcance configurado.",
"block.create.secondary_linear_chassis.tooltip": "UNLOCALIZED: SECONDARY LINEAR CHASSIS", "block.create.secondary_linear_chassis.tooltip": "UNLOCALIZED: SECONDARY LINEAR CHASSIS",
"block.create.secondary_linear_chassis.tooltip.summary": "UNLOCALIZED: A second type of _Linear Chassis_ that does not connect to the other.", "block.create.secondary_linear_chassis.tooltip.summary": "UNLOCALIZED: A second type of _Linear Chassis_ that does not connect to the other.",
"block.create.radial_chassis.tooltip": "CHASSIS DE ROTAÇÃO", "block.create.radial_chassis.tooltip": "CHASSIS DE ROTAÇÃO",
"block.create.radial_chassis.tooltip.summary": "Nessário para rotacionar estruturas om um _Rolamento_ _Mecânico._ ", "block.create.radial_chassis.tooltip.summary": "Nessário para rotacionar estruturas om um _Rolamento_ _Mecânico._ ",
"block.create.radial_chassis.tooltip.condition1": "Quando Rotacionado por Rolamento", "block.create.radial_chassis.tooltip.condition1": "Quando Rotacionado por Rolamento",
"block.create.radial_chassis.tooltip.behaviour1": "_Rotaciona_ todos os blocos conectados a lados _Grudentos_ (Veja [Ctrl]) dentro do alcance configurado no seu entorno. _Propaga_ a rotação para outros Chassis de Rotação conectados.", "block.create.radial_chassis.tooltip.behaviour1": "_Rotaciona_ todos os blocos conectados a lados _Grudentos_ (Veja [Ctrl]) dentro do alcance configurado no seu entorno. _Propaga_ a rotação para outros Chassis de Rotação conectados.",
"block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench",
"block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.",
"block.create.radial_chassis.tooltip.control1": "Quando clicado com B-Direito com Goma de Slime", "block.create.radial_chassis.tooltip.control1": "Quando clicado com B-Direito com Goma de Slime",
"block.create.radial_chassis.tooltip.action1": "Torna face clicada em _Grudenta._ Quando o Chassis girar, todos os blocos conectados nesse lado irão girar junto.", "block.create.radial_chassis.tooltip.action1": "Torna face clicada em _Grudenta._ Quando o Chassis girar, todos os blocos conectados nesse lado irão girar junto.",
"block.create.mechanical_drill.tooltip": "FURADEIRA MECÂNICA", "block.create.mechanical_drill.tooltip": "FURADEIRA MECÂNICA",
"block.create.mechanical_drill.tooltip.summary": "Um dispositivo mecânido feito para _quebrar_ _blocos._", "block.create.mechanical_drill.tooltip.summary": "Um dispositivo mecânido feito para _quebrar_ _blocos._",
"block.create.mechanical_drill.tooltip.condition1": "Quando Rodado", "block.create.mechanical_drill.tooltip.condition1": "Quando Rodado",
"block.create.mechanical_drill.tooltip.behaviour1": "Atua como um Bloco Quebrador _estacionário._ Também _machuca_ _entidades_ na sua área de efeito.", "block.create.mechanical_drill.tooltip.behaviour1": "Atua como um Bloco Quebrador _estacionário._ Também _machuca_ _entidades_ na sua área de efeito.",
"block.create.mechanical_drill.tooltip.condition2": "Quando Empurrado por Pistão Mecânico", "block.create.mechanical_drill.tooltip.condition2": "Quando Empurrado por Pistão Mecânico",
"block.create.mechanical_drill.tooltip.behaviour2": "Quebra os Blocos na direção do avanço da broca.", "block.create.mechanical_drill.tooltip.behaviour2": "Quebra os Blocos na direção do avanço da broca.",
"block.create.mechanical_harvester.tooltip": "COLETOR MECÂNICO", "block.create.mechanical_harvester.tooltip": "COLETOR MECÂNICO",
"block.create.mechanical_harvester.tooltip.summary": "Um cortador de plantas mecânico indicado para automação de culturas de médio porte", "block.create.mechanical_harvester.tooltip.summary": "Um cortador de plantas mecânico indicado para automação de culturas de médio porte",
"block.create.mechanical_harvester.tooltip.condition1": "Quando Empurrado por Pistão Mecânico", "block.create.mechanical_harvester.tooltip.condition1": "Quando Empurrado por Pistão Mecânico",
"block.create.mechanical_harvester.tooltip.behaviour1": "_Colhe_ todas as _safra_ _madura_ que a lâmina passar sobre, e os retorna a estado de crescimento inicial.", "block.create.mechanical_harvester.tooltip.behaviour1": "_Colhe_ todas as _safra_ _madura_ que a lâmina passar sobre, e os retorna a estado de crescimento inicial.",
"block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH",
"block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.",
@ -1687,19 +1698,19 @@
"block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.", "block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.",
"block.create.stockpile_switch.tooltip": "DISJUNTOR DE ARMAZENAMENTO", "block.create.stockpile_switch.tooltip": "DISJUNTOR DE ARMAZENAMENTO",
"block.create.stockpile_switch.tooltip.summary": "Alterna um sinal de Redstone com base no _Espaço_ de _Armazenamento_ do Reciente conectado.", "block.create.stockpile_switch.tooltip.summary": "Alterna um sinal de Redstone com base no _Espaço_ de _Armazenamento_ do Reciente conectado.",
"block.create.stockpile_switch.tooltip.condition1": "Quando abaixo do Limite Mínimo", "block.create.stockpile_switch.tooltip.condition1": "Quando abaixo do Limite Mínimo",
"block.create.stockpile_switch.tooltip.behaviour1": "Para de enviar _Sinal_ de _Redstone_", "block.create.stockpile_switch.tooltip.behaviour1": "Para de enviar _Sinal_ de _Redstone_",
"block.create.content_observer.tooltip": "UNLOCALIZED: CONTENT OBSERVER", "block.create.content_observer.tooltip": "UNLOCALIZED: CONTENT OBSERVER",
"block.create.content_observer.tooltip.summary": "UNLOCALIZED: _Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.", "block.create.content_observer.tooltip.summary": "UNLOCALIZED: _Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.",
"block.create.redstone_link.tooltip": "CONEXÃO DE REDSTONE", "block.create.redstone_link.tooltip": "CONEXÃO DE REDSTONE",
"block.create.redstone_link.tooltip.summary": "Saida para conexões _Redstone_ _Sem-Fio._ Pode ter _Frequências_ usando qualquer item. Distancia do Sinal é limitada, mas resoavelmente justa.", "block.create.redstone_link.tooltip.summary": "Saida para conexões _Redstone_ _Sem-Fio._ Pode ter _Frequências_ usando qualquer item. Distancia do Sinal é limitada, mas resoavelmente justa.",
"block.create.redstone_link.tooltip.condition1": "Quando Ligado", "block.create.redstone_link.tooltip.condition1": "Quando Ligado",
"block.create.redstone_link.tooltip.behaviour1": "Recebendo Conexões da mesma _Frequência_ irá gerar um sinal de Redstone.", "block.create.redstone_link.tooltip.behaviour1": "Recebendo Conexões da mesma _Frequência_ irá gerar um sinal de Redstone.",
"block.create.redstone_link.tooltip.control1": "Quando clicado com B-Direito com um Item", "block.create.redstone_link.tooltip.control1": "Quando clicado com B-Direito com um Item",
"block.create.redstone_link.tooltip.action1": "Altera a _Frequência_ para aquele item. Até _dois_ _itens_ _diferentes_ podem ser combinados para definir uma Frequência.", "block.create.redstone_link.tooltip.action1": "Altera a _Frequência_ para aquele item. Até _dois_ _itens_ _diferentes_ podem ser combinados para definir uma Frequência.",
"block.create.redstone_link.tooltip.control2": "Quando clicado com B-Direito enquanto Abaixado", "block.create.redstone_link.tooltip.control2": "Quando clicado com B-Direito enquanto Abaixado",
"block.create.redstone_link.tooltip.action2": "Muda entre Modo _Receptor_ e _Transmissor_ .", "block.create.redstone_link.tooltip.action2": "Muda entre Modo _Receptor_ e _Transmissor_ .",
@ -1711,19 +1722,19 @@
"block.create.nixie_tube.tooltip.behaviour2": "UNLOCALIZED: Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.", "block.create.nixie_tube.tooltip.behaviour2": "UNLOCALIZED: Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.",
"block.create.redstone_contact.tooltip": "CONTATO DE REDSTONE", "block.create.redstone_contact.tooltip": "CONTATO DE REDSTONE",
"block.create.redstone_contact.tooltip.summary": "Um dispositivo simples para Mecanimos de Redstone avançados.", "block.create.redstone_contact.tooltip.summary": "Um dispositivo simples para Mecanimos de Redstone avançados.",
"block.create.redstone_contact.tooltip.condition1": "Quando apontando para outro Contato", "block.create.redstone_contact.tooltip.condition1": "Quando apontando para outro Contato",
"block.create.redstone_contact.tooltip.behaviour1": "Provê um _Sinal_ de _Redstone_", "block.create.redstone_contact.tooltip.behaviour1": "Provê um _Sinal_ de _Redstone_",
"block.create.redstone_contact.tooltip.condition2": "Quando movido por Pistão Mecânico", "block.create.redstone_contact.tooltip.condition2": "Quando movido por Pistão Mecânico",
"block.create.redstone_contact.tooltip.behaviour2": "Ativa todos os Contatos imóveis na passagem", "block.create.redstone_contact.tooltip.behaviour2": "Ativa todos os Contatos imóveis na passagem",
"block.create.adjustable_crate.tooltip": "adjustable_crate", "block.create.adjustable_crate.tooltip": "adjustable_crate",
"block.create.adjustable_crate.tooltip.summary": "Este _Recipiente_ de _Armazenamento_ permite controle Manual da sua capacidade. Pode conter até _16_ _Pilhas_ de qualquer Item", "block.create.adjustable_crate.tooltip.summary": "Este _Recipiente_ de _Armazenamento_ permite controle Manual da sua capacidade. Pode conter até _16_ _Pilhas_ de qualquer Item",
"block.create.adjustable_crate.tooltip.control1": "Quando clicado com B-Direito", "block.create.adjustable_crate.tooltip.control1": "Quando clicado com B-Direito",
"block.create.adjustable_crate.tooltip.action1": "Abre a _Interface_", "block.create.adjustable_crate.tooltip.action1": "Abre a _Interface_",
"block.create.creative_crate.tooltip": "CRIATIVADOR ESQUEMAANNON", "block.create.creative_crate.tooltip": "CRIATIVADOR ESQUEMAANNON",
"block.create.creative_crate.tooltip.summary": "Provê um suprimento infinito de blocos para _Esquemaannons_ próximos", "block.create.creative_crate.tooltip.summary": "Provê um suprimento infinito de blocos para _Esquemaannons_ próximos",
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
@ -1740,10 +1751,10 @@
"block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._", "block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._",
"block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSO", "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSO",
"block.create.pulse_repeater.tooltip.summary": "Um circuito simples para cortar pulsos de Redstone até um comprimento de _1_ _tick._", "block.create.pulse_repeater.tooltip.summary": "Um circuito simples para cortar pulsos de Redstone até um comprimento de _1_ _tick._",
"block.create.adjustable_repeater.tooltip": "REPETIDOR FLEX", "block.create.adjustable_repeater.tooltip": "REPETIDOR FLEX",
"block.create.adjustable_repeater.tooltip.summary": "Um um _Repetidor_ de _Redstone_ avançado com um _Delay_ _configurável_ de até 30 Minutos.", "block.create.adjustable_repeater.tooltip.summary": "Um um _Repetidor_ de _Redstone_ avançado com um _Delay_ _configurável_ de até 30 Minutos.",
"block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER", "block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER",
"block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse Repeater_ with a _configurable Delay_ up to 30 Minutes.", "block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse Repeater_ with a _configurable Delay_ up to 30 Minutes.",

View file

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

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"), GOGGLES = get("goggles"),
EJECTOR_TOP = get("weighted_ejector/top"),
COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"),
COUPLING_RING = getEntity("minecart_coupling/ring"), COUPLING_RING = getEntity("minecart_coupling/ring"),
COUPLING_CONNECTOR = getEntity("minecart_coupling/connector") COUPLING_CONNECTOR = getEntity("minecart_coupling/connector")

View file

@ -1,10 +1,29 @@
package com.simibubi.create; 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.AllBlockTags;
import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.AllTags.AllItemTags;
import com.simibubi.create.content.AllSections; import com.simibubi.create.content.AllSections;
import com.simibubi.create.content.contraptions.base.CasingBlock; 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.clock.CuckooClockBlock;
import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour; import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock; 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.press.MechanicalPressBlock;
import com.simibubi.create.content.contraptions.components.saw.SawBlock; 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.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;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; 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.HosePulleyBlock;
import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainBlock; 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.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.FluidTankBlock;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankGenerator; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankGenerator;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankItem; 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.CogWheelBlock;
import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem; 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.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.GaugeBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator; import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator;
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock;
@ -84,18 +121,47 @@ 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.ChuteItem;
import com.simibubi.create.content.logistics.block.chute.SmartChuteBlock; 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.depot.DepotBlock;
import com.simibubi.create.content.logistics.block.diodes.*; import com.simibubi.create.content.logistics.block.depot.EjectorBlock;
import com.simibubi.create.content.logistics.block.funnel.*; 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.AdjustableCrateBlock;
import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock; 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.ArmBlock;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem; 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.schematics.block.SchematicTableBlock; import com.simibubi.create.content.schematics.block.SchematicTableBlock;
import com.simibubi.create.content.schematics.block.SchematicannonBlock; import com.simibubi.create.content.schematics.block.SchematicannonBlock;
import com.simibubi.create.foundation.block.ItemUseOverrides; import com.simibubi.create.foundation.block.ItemUseOverrides;
import com.simibubi.create.foundation.config.StressConfigDefaults; 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.item.TooltipHelper;
import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.utility.DyeHelper;
import com.simibubi.create.foundation.worldgen.OxidizingBlock; import com.simibubi.create.foundation.worldgen.OxidizingBlock;
@ -121,15 +187,6 @@ import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
import net.minecraftforge.common.ToolType; 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 { public class AllBlocks {
private static final CreateRegistrate REGISTRATE = Create.registrate() private static final CreateRegistrate REGISTRATE = Create.registrate()
@ -425,6 +482,15 @@ public class AllBlocks {
.transform(customItemModel("_", "block")) .transform(customItemModel("_", "block"))
.register(); .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) public static final BlockEntry<ChuteBlock> CHUTE = REGISTRATE.block("chute", ChuteBlock::new)
.initialProperties(SharedProperties::softMetal) .initialProperties(SharedProperties::softMetal)
.addLayer(() -> RenderType::getCutoutMipped) .addLayer(() -> RenderType::getCutoutMipped)

View file

@ -1,7 +1,18 @@
package com.simibubi.create; package com.simibubi.create;
import com.simibubi.create.content.contraptions.base.*; import com.simibubi.create.content.contraptions.base.BackHalfShaftInstance;
import com.simibubi.create.content.contraptions.components.actors.*; 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.CuckooClockRenderer;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterInstance; 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.PumpCogInstance;
import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpRenderer;
import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity;
import com.simibubi.create.content.contraptions.fluids.actors.*; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer;
import com.simibubi.create.content.contraptions.fluids.pipes.*; 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.CreativeFluidTankTileEntity;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; 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.BeltRenderer;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; 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.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.GaugeInstance;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer;
import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity;
@ -94,8 +122,7 @@ import com.simibubi.create.content.logistics.block.chute.ChuteRenderer;
import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity;
import com.simibubi.create.content.logistics.block.chute.SmartChuteRenderer; 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.chute.SmartChuteTileEntity;
import com.simibubi.create.content.logistics.block.depot.DepotRenderer; import com.simibubi.create.content.logistics.block.depot.*;
import com.simibubi.create.content.logistics.block.depot.DepotTileEntity;
import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterInstance; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterInstance;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer;
@ -108,7 +135,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.ArmInstance;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer; 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.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.SchematicTableTileEntity;
import com.simibubi.create.content.schematics.block.SchematicannonInstance; import com.simibubi.create.content.schematics.block.SchematicannonInstance;
import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonRenderer;
@ -578,6 +612,13 @@ public class AllTileEntities {
.renderer(() -> DepotRenderer::new) .renderer(() -> DepotRenderer::new)
.register(); .register();
public static final TileEntityEntry<EjectorTileEntity> WEIGHTED_EJECTOR = Create.registrate()
.tileEntity("weighted_ejector", EjectorTileEntity::new)
.instance(() -> EjectorInstance::new)
.validBlocks(AllBlocks.WEIGHTED_EJECTOR)
.renderer(() -> EjectorRenderer::new)
.register();
public static final TileEntityEntry<FunnelTileEntity> FUNNEL = Create.registrate() public static final TileEntityEntry<FunnelTileEntity> FUNNEL = Create.registrate()
.tileEntity("funnel", FunnelTileEntity::new) .tileEntity("funnel", FunnelTileEntity::new)
.instance(() -> FunnelInstance::new) .instance(() -> FunnelInstance::new)

View file

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

View file

@ -19,16 +19,6 @@ public class KineticData extends BasicData {
super(owner); super(owner);
} }
public KineticData setTileEntity(KineticTileEntity te) {
setPosition(te.getPos());
if (te.hasSource()) {
setColor(te.network);
}else {
setColor(0xFF, 0xFF, 0x00);
}
return this;
}
public KineticData setPosition(BlockPos pos) { public KineticData setPosition(BlockPos pos) {
return setPosition(pos.getX(), pos.getY(), pos.getZ()); return setPosition(pos.getX(), pos.getY(), pos.getZ());
} }
@ -38,11 +28,9 @@ public class KineticData extends BasicData {
} }
public KineticData setPosition(int x, int y, int z) { public KineticData setPosition(int x, int y, int z) {
BlockPos origin = owner.renderer.getOriginCoordinate(); return setPosition((float) (x),
(float) (y),
return setPosition((float) (x - origin.getX()), (float) (z));
(float) (y - origin.getY()),
(float) (z - origin.getZ()));
} }
public KineticData setPosition(float x, float y, float z) { public KineticData setPosition(float x, float y, float z) {
@ -59,6 +47,15 @@ public class KineticData extends BasicData {
return this; return this;
} }
public KineticData setColor(KineticTileEntity te) {
if (te.hasSource()) {
setColor(te.network);
}else {
setColor(0xFF, 0xFF, 0x00);
}
return this;
}
public KineticData setColor(Long l) { public KineticData setColor(Long l) {
if (l != null) if (l != null)
return setColor(l.longValue()); return setColor(l.longValue());

View file

@ -6,41 +6,55 @@ import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.*;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.world.LightType;
public abstract class KineticTileInstance<T extends KineticTileEntity> extends TileEntityInstance<T> { public abstract class KineticTileInstance<T extends KineticTileEntity> extends TileEntityInstance<T> {
protected final Direction.Axis axis;
public KineticTileInstance(InstancedTileRenderer<?> modelManager, T tile) { public KineticTileInstance(InstancedTileRenderer<?> modelManager, T tile) {
super(modelManager, tile); super(modelManager, tile);
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
} }
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis) { protected final void updateRotation(RotatingData instance) {
updateRotation(key, axis, tile.getSpeed()); updateRotation(instance, getRotationAxis(), getTileSpeed());
} }
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis, float speed) { protected final void updateRotation(RotatingData instance, Direction.Axis axis) {
updateRotation(key.getInstance(), axis, speed); updateRotation(instance, axis, getTileSpeed());
} }
protected final void updateRotation(RotatingData key, Direction.Axis axis, float speed) { protected final void updateRotation(RotatingData instance, float speed) {
key.setRotationAxis(axis) updateRotation(instance, getRotationAxis(), speed);
}
protected final void updateRotation(RotatingData instance, Direction.Axis axis, float speed) {
instance.setRotationAxis(axis)
.setRotationOffset(getRotationOffset(axis)) .setRotationOffset(getRotationOffset(axis))
.setRotationalSpeed(speed) .setRotationalSpeed(speed)
.setColor(tile.network); .setColor(tile);
} }
protected final void updateRotation(RotatingData key, Direction.Axis axis) { protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key) {
updateRotation(key, axis, tile.getSpeed()); return setup(key, getRotationAxis(), getTileSpeed());
} }
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, float speed, Direction.Axis axis) { protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, Direction.Axis axis) {
return setup(key, axis, getTileSpeed());
}
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, float speed) {
return setup(key, getRotationAxis(), speed);
}
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, Direction.Axis axis, float speed) {
key.getInstance() key.getInstance()
.setRotationAxis(axis) .setRotationAxis(axis)
.setRotationalSpeed(speed) .setRotationalSpeed(speed)
.setRotationOffset(getRotationOffset(axis)) .setRotationOffset(getRotationOffset(axis))
.setTileEntity(tile) .setColor(tile)
.setSkyLight(world.getLightLevel(LightType.SKY, pos)) .setPosition(getInstancePosition());
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos));
return key; return key;
} }
@ -55,16 +69,24 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
return offset; return offset;
} }
protected Direction.Axis getRotationAxis() {
return axis;
}
protected float getTileSpeed() {
return tile.getSpeed();
}
protected BlockState shaft() {
return shaft(getRotationAxis());
}
protected final RenderMaterial<?, InstancedModel<RotatingData>> getRotatingMaterial() {
return renderer.getMaterial(KineticRenderMaterials.ROTATING);
}
public static BlockState shaft(Direction.Axis axis) { public static BlockState shaft(Direction.Axis axis) {
return AllBlocks.SHAFT.getDefaultState() return AllBlocks.SHAFT.getDefaultState()
.with(ShaftBlock.AXIS, axis); .with(ShaftBlock.AXIS, axis);
} }
public Direction.Axis getRotationAxis() {
return ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
}
protected final RenderMaterial<?, InstancedModel<RotatingData>> rotatingMaterial() {
return modelManager.getMaterial(KineticRenderMaterials.ROTATING);
}
} }

View file

@ -12,6 +12,6 @@ public class ShaftlessCogInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(modelManager, tile.getBlockState()); return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(renderer, tile.getBlockState());
} }
} }

View file

@ -4,35 +4,32 @@ import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.util.Direction;
import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE; import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE;
public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntity> { public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntity> {
protected final InstanceKey<RotatingData> rotatingModelKey; protected final InstanceKey<RotatingData> rotatingModel;
public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) { public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState); rotatingModel = setup(getModel().createInstance());
rotatingModelKey = setup(getModel().createInstance(), tile.getSpeed(), axis);
} }
@Override @Override
public void update() { public void update() {
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState); updateRotation(rotatingModel.getInstance());
updateRotation(rotatingModelKey, axis);
} }
@Override @Override
public void updateLight() { public void updateLight() {
relight(pos, rotatingModelKey.getInstance()); relight(pos, rotatingModel.getInstance());
} }
@Override @Override
public void remove() { public void remove() {
rotatingModelKey.delete(); rotatingModel.delete();
} }
protected BlockState getRenderedBlockState() { protected BlockState getRenderedBlockState() {
@ -40,6 +37,6 @@ public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntit
} }
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
return rotatingMaterial().getModel(KINETIC_TILE, getRenderedBlockState()); return getRotatingMaterial().getModel(getRenderedBlockState());
} }
} }

View file

@ -15,6 +15,6 @@ public class DrillInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(renderer, tile.getBlockState());
} }
} }

View file

@ -36,7 +36,7 @@ public class HarvesterActorInstance extends ActorInstance {
public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context); super(modelManager, context);
RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.transformMaterial(); RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.getTransformMaterial();
BlockState state = context.state; BlockState state = context.state;

View file

@ -34,6 +34,6 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance {
stacker.unCentre(); stacker.unCentre();
return stack; return stack;
}; };
return rotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState, facing, ms); return getRotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState, facing, ms);
} }
} }

View file

@ -33,8 +33,6 @@ public class HandCrankInstance extends SingleRotatingInstance implements IDynami
facing = blockState.get(BlockStateProperties.FACING); facing = blockState.get(BlockStateProperties.FACING);
InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, blockState, facing.getOpposite()); InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, blockState, facing.getOpposite());
crank = model.createInstance(); crank = model.createInstance();
updateLight();
} }
@Override @Override
@ -48,7 +46,7 @@ public class HandCrankInstance extends SingleRotatingInstance implements IDynami
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker.of(ms) MatrixStacker.of(ms)
.translate(getFloatingPos()) .translate(getInstancePosition())
.centre() .centre()
.rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle) .rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle)
.unCentre(); .unCentre();

View file

@ -37,7 +37,7 @@ public class DeployerActorInstance extends ActorInstance {
public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context); super(modelManager, context);
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.transformMaterial(); RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.getTransformMaterial();
BlockState state = context.state; BlockState state = context.state;
DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class); DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class);
@ -56,7 +56,7 @@ public class DeployerActorInstance extends ActorInstance {
Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state); Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state);
shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING) shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING)
.getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileInstance.shaft(axis)) .getModel(KineticTileInstance.shaft(axis))
.createInstance(); .createInstance();
int blockLight = localBlockLight(); int blockLight = localBlockLight();

View file

@ -6,7 +6,6 @@ import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.OrientedData; import com.simibubi.create.foundation.render.backend.instancing.impl.OrientedData;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
@ -16,7 +15,6 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3i; import net.minecraft.util.math.vector.Vector3i;
import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE;
@ -50,7 +48,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0;
zRotPole = rotatePole ? 90 : 0; zRotPole = rotatePole ? 90 : 0;
pole = RenderMaterials.ORIENTED.get(modelManager).getModel(AllBlockPartials.DEPLOYER_POLE, blockState).createInstance(); pole = getOrientedMaterial().getModel(AllBlockPartials.DEPLOYER_POLE, blockState).createInstance();
updateHandPose(); updateHandPose();
relight(pos, pole.getInstance()); relight(pos, pole.getInstance());
@ -77,7 +75,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
: currentHand == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; : currentHand == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f;
float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f); float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f);
Vector3i facingVec = facing.getDirectionVec(); Vector3i facingVec = facing.getDirectionVec();
BlockPos blockPos = getFloatingPos(); BlockPos blockPos = getInstancePosition();
float x = blockPos.getX() + ((float) facingVec.getX()) * distance; float x = blockPos.getX() + ((float) facingVec.getX()) * distance;
float y = blockPos.getY() + ((float) facingVec.getY()) * distance; float y = blockPos.getY() + ((float) facingVec.getY()) * distance;
@ -111,7 +109,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
if (hand != null) hand.delete(); if (hand != null) hand.delete();
hand = RenderMaterials.ORIENTED.get(modelManager).getModel(currentHand, blockState).createInstance(); hand = getOrientedMaterial().getModel(currentHand, blockState).createInstance();
relight(pos, hand.getInstance()); relight(pos, hand.getInstance());
updateRotation(pole, hand, yRot, zRot, zRotPole); updateRotation(pole, hand, yRot, zRot, zRotPole);

View file

@ -16,27 +16,18 @@ public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
protected final InstanceKey<RotatingData> shaft; protected final InstanceKey<RotatingData> shaft;
protected final InstanceKey<RotatingData> fan; protected final InstanceKey<RotatingData> fan;
final Direction.Axis axis;
final Direction direction; final Direction direction;
public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) { public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
direction = blockState.get(FACING); direction = blockState.get(FACING);
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance(); shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
fan = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance(); fan = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
RotatingData shaftInstance = shaft.getInstance(); setup(shaft);
shaftInstance.setTileEntity(tile); setup(fan, getFanSpeed());
updateRotation(shaftInstance, axis);
RotatingData fanInstance = fan.getInstance();
fanInstance.setTileEntity(tile);
updateRotation(fanInstance, axis, getFanSpeed());
updateLight();
} }
private float getFanSpeed() { private float getFanSpeed() {
@ -50,8 +41,8 @@ public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
@Override @Override
protected void update() { protected void update() {
updateRotation(shaft, axis); updateRotation(shaft.getInstance());
updateRotation(fan, axis, getFanSpeed()); updateRotation(fan.getInstance(), getFanSpeed());
} }
@Override @Override

View file

@ -6,10 +6,8 @@ import java.util.List;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.KineticTileInstance;
import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
@ -48,8 +46,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState); shaft = setup(shaftModel().createInstance());
shaft = setup(shaftModel().createInstance(), tile.getSpeed(), axis);
wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontalModel(modelManager, blockState.rotate(Rotation.CLOCKWISE_90)).createInstance(); wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontalModel(modelManager, blockState.rotate(Rotation.CLOCKWISE_90)).createInstance();
@ -61,7 +58,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
connectorAngleMult = flipAngle ? -1 : 1; connectorAngleMult = flipAngle ? -1 : 1;
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED); RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance(); upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance();
lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance(); lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance();
@ -72,8 +69,6 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
} else { } else {
connectors = Collections.emptyList(); connectors = Collections.emptyList();
} }
updateLight();
} }
@Override @Override
@ -89,7 +84,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms); MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos()); msr.translate(getInstancePosition());
if (connection != null) { if (connection != null) {
float rotation = angle * connectorAngleMult; float rotation = angle * connectorAngleMult;
@ -132,8 +127,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
@Override @Override
protected void update() { protected void update() {
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState); updateRotation(shaft.getInstance());
updateRotation(shaft, axis);
} }
@Override @Override
@ -155,7 +149,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
} }
protected InstancedModel<RotatingData> shaftModel() { protected InstancedModel<RotatingData> shaftModel() {
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, facing.getOpposite()); return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(renderer, blockState, facing.getOpposite());
} }
protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) { protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) {

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance; import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance;
@ -30,14 +29,14 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
Direction facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); Direction facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
this.frame = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(frame, blockState).createInstance(); this.frame = getTransformMaterial().getModel(frame, blockState).createInstance();
float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing)); float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing));
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms); MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos()) msr.translate(getInstancePosition())
.nudge(tile.hashCode()) .nudge(tile.hashCode())
.centre() .centre()
.rotate(Direction.UP, angle) .rotate(Direction.UP, angle)
@ -46,8 +45,6 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
this.frame.getInstance() this.frame.getInstance()
.setTransform(ms); .setTransform(ms);
updateLight();
} }
@Override @Override

View file

@ -15,6 +15,6 @@ public class MillStoneCogInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
return AllBlockPartials.MILLSTONE_COG.renderOnRotating(modelManager, tile.getBlockState()); return AllBlockPartials.MILLSTONE_COG.renderOnRotating(renderer, tile.getBlockState());
} }
} }

View file

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

View file

@ -5,9 +5,7 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance; import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
@ -23,13 +21,13 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
public MixerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { public MixerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
mixerHead = rotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState) mixerHead = getRotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState)
.createInstance(); .createInstance();
mixerHead.getInstance() mixerHead.getInstance()
.setRotationAxis(Direction.Axis.Y); .setRotationAxis(Direction.Axis.Y);
mixerPole = modelManager.getMaterial(RenderMaterials.TRANSFORMED) mixerPole = getTransformMaterial()
.getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState) .getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState)
.createInstance(); .createInstance();
@ -39,7 +37,6 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
transformPole(renderedHeadOffset); transformPole(renderedHeadOffset);
transformHead(mixer, renderedHeadOffset); transformHead(mixer, renderedHeadOffset);
updateLight();
} }
@Override @Override
@ -59,7 +56,7 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
float speed = mixer.getRenderedHeadRotationSpeed(AnimationTickHolder.getPartialTicks()); float speed = mixer.getRenderedHeadRotationSpeed(AnimationTickHolder.getPartialTicks());
mixerHead.getInstance() mixerHead.getInstance()
.setPosition(pos) .setPosition(getInstancePosition())
.nudge(0, -renderedHeadOffset, 0) .nudge(0, -renderedHeadOffset, 0)
.setRotationalSpeed(speed * 2); .setRotationalSpeed(speed * 2);
} }
@ -68,7 +65,7 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms); MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos()); msr.translate(getInstancePosition());
msr.translate(0, -renderedHeadOffset, 0); msr.translate(0, -renderedHeadOffset, 0);
mixerPole.getInstance().setTransform(ms); mixerPole.getInstance().setTransform(ms);

View file

@ -1,18 +1,16 @@
package com.simibubi.create.content.contraptions.components.press; package com.simibubi.create.content.contraptions.components.press;
import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult.HOLD;
import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult.PASS;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import net.minecraft.item.ItemStack; import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult.HOLD;
import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult.PASS;
public class BeltPressingCallbacks { public class BeltPressingCallbacks {
@ -45,13 +43,25 @@ public class BeltPressingCallbacks {
if (!recipe.isPresent()) if (!recipe.isPresent())
return PASS; return PASS;
ItemStack out = recipe.get() List<TransportedItemStack> collect = InWorldProcessing.applyRecipeOn(transported.stack, recipe.get())
.stream()
.map(stack -> {
TransportedItemStack copy = transported.copy();
copy.stack = stack;
return copy;
}).collect(Collectors.toList());
if (collect.isEmpty())
handler.handleProcessingOnItem(transported, TransportedItemStackHandlerBehaviour.TransportedResult.removeItem());
else
handler.handleProcessingOnItem(transported, TransportedItemStackHandlerBehaviour.TransportedResult.convertTo(collect));
/*ItemStack out = recipe.get()
.getRecipeOutput() .getRecipeOutput()
.copy(); .copy();
List<ItemStack> multipliedOutput = ItemHelper.multipliedOutput(transported.stack, out); List<ItemStack> multipliedOutput = ItemHelper.multipliedOutput(transported.stack, out);
if (multipliedOutput.isEmpty()) if (multipliedOutput.isEmpty())
transported.stack = ItemStack.EMPTY; transported.stack = ItemStack.EMPTY;
transported.stack = multipliedOutput.get(0); transported.stack = multipliedOutput.get(0);*/
pressTe.sendData(); pressTe.sendData();
return HOLD; return HOLD;
} }

View file

@ -20,7 +20,6 @@ public class PressInstance extends ShaftInstance implements IDynamicInstance {
pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance(); pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance();
updateLight();
transformModels((MechanicalPressTileEntity) tile); transformModels((MechanicalPressTileEntity) tile);
} }
@ -39,7 +38,7 @@ public class PressInstance extends ShaftInstance implements IDynamicInstance {
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms); MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos()); msr.translate(getInstancePosition());
msr.translate(0, -renderedHeadOffset, 0); msr.translate(0, -renderedHeadOffset, 0);
pressHead.getInstance() pressHead.getInstance()

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.saw;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
@ -20,8 +19,8 @@ public class SawInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
if (blockState.get(FACING).getAxis().isHorizontal()) if (blockState.get(FACING).getAxis().isHorizontal())
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180)); return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(renderer, blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180));
else else
return rotatingMaterial().getModel(KineticTileEntityRenderer.KINETIC_TILE, shaft(getRotationAxis())); return getRotatingMaterial().getModel(shaft());
} }
} }

View file

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

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ch
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
@ -27,13 +26,11 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> imple
public StickerInstance(InstancedTileRenderer<?> modelManager, StickerTileEntity tile) { public StickerInstance(InstancedTileRenderer<?> modelManager, StickerTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
head = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.STICKER_HEAD, blockState).createInstance(); head = getTransformMaterial().getModel(AllBlockPartials.STICKER_HEAD, blockState).createInstance();
fakeWorld = tile.getWorld() != Minecraft.getInstance().world; fakeWorld = tile.getWorld() != Minecraft.getInstance().world;
facing = blockState.get(StickerBlock.FACING); facing = blockState.get(StickerBlock.FACING);
offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0; offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0;
updateLight();
} }
@Override @Override
@ -48,7 +45,7 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> imple
MatrixStack stack = new MatrixStack(); MatrixStack stack = new MatrixStack();
MatrixStacker.of(stack) MatrixStacker.of(stack)
.translate(getFloatingPos()) .translate(getInstancePosition())
.nudge(tile.hashCode()) .nudge(tile.hashCode())
.centre() .centre()
.rotateY(AngleHelper.horizontalAngle(facing)) .rotateY(AngleHelper.horizontalAngle(facing))

View file

@ -5,7 +5,6 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
@ -29,7 +28,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
public GantryCarriageInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) { public GantryCarriageInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
super(dispatcher, tile); super(dispatcher, tile);
gantryCogs = modelManager.getMaterial(RenderMaterials.TRANSFORMED) gantryCogs = getTransformMaterial()
.getModel(AllBlockPartials.GANTRY_COGS, blockState) .getModel(AllBlockPartials.GANTRY_COGS, blockState)
.createInstance(); .createInstance();
@ -40,8 +39,6 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos() visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos()
: tile.getPos() : tile.getPos()
.offset(facing.getOpposite()); .offset(facing.getOpposite());
updateLight();
} }
@Override @Override
@ -62,7 +59,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker.of(ms) MatrixStacker.of(ms)
.translate(getFloatingPos()) .translate(getInstancePosition())
.centre() .centre()
.rotateY(AngleHelper.horizontalAngle(facing)) .rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90)
@ -77,7 +74,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
@Override @Override
public void updateLight() { public void updateLight() {
relight(pos, gantryCogs.getInstance()); relight(pos, gantryCogs.getInstance(), rotatingModel.getInstance());
} }
@Override @Override

View file

@ -27,7 +27,7 @@ import java.util.ArrayList;
public class ContraptionKineticRenderer extends InstancedTileRenderer<ContraptionProgram> { public class ContraptionKineticRenderer extends InstancedTileRenderer<ContraptionProgram> {
protected ArrayList<com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance> actors = new ArrayList<>(); protected ArrayList<ActorInstance> actors = new ArrayList<>();
private final WeakReference<RenderedContraption> contraption; private final WeakReference<RenderedContraption> contraption;
@ -48,25 +48,25 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer<Contraptio
@Override @Override
public void tick() { public void tick() {
actors.forEach(com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance::tick); actors.forEach(ActorInstance::tick);
} }
@Override @Override
public void beginFrame(double cameraX, double cameraY, double cameraZ) { public void beginFrame(double cameraX, double cameraY, double cameraZ) {
super.beginFrame(cameraX, cameraY, cameraZ); super.beginFrame(cameraX, cameraY, cameraZ);
actors.forEach(com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance::beginFrame); actors.forEach(ActorInstance::beginFrame);
} }
@Nullable @Nullable
public com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance createActor(Pair<Template.BlockInfo, MovementContext> actor) { public ActorInstance createActor(Pair<Template.BlockInfo, MovementContext> actor) {
Template.BlockInfo blockInfo = actor.getLeft(); Template.BlockInfo blockInfo = actor.getLeft();
MovementContext context = actor.getRight(); MovementContext context = actor.getRight();
MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state);
if (movementBehaviour != null && movementBehaviour.hasSpecialInstancedRendering()) { if (movementBehaviour != null && movementBehaviour.hasSpecialInstancedRendering()) {
com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance instance = movementBehaviour.createInstance(this, context); ActorInstance instance = movementBehaviour.createInstance(this, context);
actors.add(instance); actors.add(instance);

View file

@ -15,6 +15,6 @@ public class PumpCogInstance extends SingleRotatingInstance {
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(renderer, tile.getBlockState());
} }
} }

View file

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

View file

@ -37,9 +37,8 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc
boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical(); boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical();
pointerRotationOffset = twist ? 90 : 0; pointerRotationOffset = twist ? 90 : 0;
pointer = modelManager.transformMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance(); pointer = renderer.getTransformMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance();
updateLight();
transformPointer((FluidValveTileEntity) tile); transformPointer((FluidValveTileEntity) tile);
} }
@ -58,7 +57,7 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker.of(ms) MatrixStacker.of(ms)
.translate(getFloatingPos()) .translate(getInstancePosition())
.centre() .centre()
.rotateY(yRot) .rotateY(yRot)
.rotateX(xRot) .rotateX(xRot)

View file

@ -68,7 +68,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
if (tile.hasPulley()) { if (tile.hasPulley()) {
InstancedModel<RotatingData> pulleyModel = getPulleyModel(); InstancedModel<RotatingData> pulleyModel = getPulleyModel();
pulleyKey = setup(pulleyModel.createInstance(), tile.getSpeed(), getRotationAxis()); pulleyKey = setup(pulleyModel.createInstance());
} }
} }
@ -82,13 +82,13 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
SpriteShiftEntry spriteShiftEntry = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); SpriteShiftEntry spriteShiftEntry = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom);
key.getInstance() key.getInstance()
.setScrollTexture(spriteShiftEntry) .setScrollTexture(spriteShiftEntry)
.setColor(tile.network) .setColor(tile)
.setRotationalSpeed(getScrollSpeed()); .setRotationalSpeed(getScrollSpeed());
bottom = false; bottom = false;
} }
if (pulleyKey != null) { if (pulleyKey != null) {
updateRotation(pulleyKey, getRotationAxis()); updateRotation(pulleyKey.getInstance());
} }
} }
@ -138,7 +138,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
return modelTransform; return modelTransform;
}; };
return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms); return getRotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms);
} }
private Direction getOrientation() { private Direction getOrientation() {
@ -164,7 +164,8 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
.setRotation(q) .setRotation(q)
.setRotationalSpeed(getScrollSpeed()) .setRotationalSpeed(getScrollSpeed())
.setRotationOffset(bottom ? 0.5f : 0f) .setRotationOffset(bottom ? 0.5f : 0f)
.setTileEntity(tile) .setColor(tile)
.setPosition(getInstancePosition())
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) .setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
.setSkyLight(world.getLightLevel(LightType.SKY, pos)); .setSkyLight(world.getLightLevel(LightType.SKY, pos));

View file

@ -538,6 +538,7 @@ public class BeltTileEntity extends KineticTileEntity implements LightUpdateList
} }
private void initializeLight() { private void initializeLight() {
if (beltLength > 0) {
light = new byte[beltLength * 2]; light = new byte[beltLength * 2];
Vector3i vec = getBeltFacing().getDirectionVec(); Vector3i vec = getBeltFacing().getDirectionVec();
@ -548,10 +549,10 @@ public class BeltTileEntity extends KineticTileEntity implements LightUpdateList
for (int i = 0; i < beltLength * 2; i += 2) { for (int i = 0; i < beltLength * 2; i += 2) {
light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos); light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos);
light[i + 1] = (byte) world.getLightLevel(LightType.SKY, pos); light[i + 1] = (byte) world.getLightLevel(LightType.SKY, pos);
pos.move(vec.getX(), verticality, vec.getZ()); pos.move(vec.getX(), verticality, vec.getZ());
} }
} }
}
private void updateBlockLight() { private void updateBlockLight() {
Vector3i vec = getBeltFacing().getDirectionVec(); Vector3i vec = getBeltFacing().getDirectionVec();

View file

@ -13,7 +13,7 @@ public class ShaftInstance extends SingleRotatingInstance {
@Override @Override
protected BlockState getRenderedBlockState() { protected BlockState getRenderedBlockState() {
return shaft(getRotationAxis()); return shaft();
} }
} }

View file

@ -23,19 +23,18 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
keys = new ArrayList<>(2); keys = new ArrayList<>(2);
Block block = blockState.getBlock();
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(blockState);
float speed = tile.getSpeed(); float speed = tile.getSpeed();
for (Direction dir : Iterate.directionsInAxis(boxAxis)) { for (Direction dir : Iterate.directionsInAxis(getRotationAxis())) {
InstancedModel<RotatingData> half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir); InstancedModel<RotatingData> half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir);
float splitSpeed = speed * tile.getRotationSpeedModifier(dir); float splitSpeed = speed * tile.getRotationSpeedModifier(dir);
keys.add(setup(half.createInstance(), splitSpeed, boxAxis)); keys.add(setup(half.createInstance(), splitSpeed));
} }
updateLight();
} }
@Override @Override
@ -46,13 +45,13 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
Direction[] directions = Iterate.directionsInAxis(boxAxis); Direction[] directions = Iterate.directionsInAxis(boxAxis);
for (int i : Iterate.zeroAndOne) { for (int i : Iterate.zeroAndOne) {
updateRotation(keys.get(i), directions[i]); updateRotation(keys.get(i).getInstance(), tile.getSpeed() * tile.getRotationSpeedModifier(directions[i]));
} }
} }
@Override @Override
public void updateLight() { public void updateLight() {
keys.forEach(key -> relight(pos, ((InstanceKey<? extends KineticData>) key).getInstance())); relight(pos, keys.stream().map(InstanceKey::getInstance));
} }
@Override @Override
@ -61,13 +60,4 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
keys.clear(); keys.clear();
} }
protected void updateRotation(InstanceKey<RotatingData> key, Direction dir) {
Direction.Axis axis = dir.getAxis();
key.getInstance()
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir))
.setRotationOffset(getRotationOffset(axis))
.setColor(tile.network);
}
} }

View file

@ -4,7 +4,6 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
@ -33,12 +32,12 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
GaugeTileEntity gaugeTile = (GaugeTileEntity) tile; GaugeTileEntity gaugeTile = (GaugeTileEntity) tile;
GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock(); GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock();
InstancedModel<ModelData> dialModel = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_DIAL, blockState); InstancedModel<ModelData> dialModel = getTransformMaterial().getModel(AllBlockPartials.GAUGE_DIAL, blockState);
InstancedModel<ModelData> headModel = getHeadModel(); InstancedModel<ModelData> headModel = getHeadModel();
ms = new MatrixStack(); ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms); MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos()); msr.translate(getInstancePosition());
float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState); float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState);
@ -52,8 +51,6 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
face.setupTransform(msr, progress); face.setupTransform(msr, progress);
} }
updateLight();
} }
private DialFace makeFace(Direction face, InstancedModel<ModelData> dialModel, InstancedModel<ModelData> headModel) { private DialFace makeFace(Direction face, InstancedModel<ModelData> dialModel, InstancedModel<ModelData> headModel) {
@ -154,7 +151,7 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
@Override @Override
protected InstancedModel<ModelData> getHeadModel() { protected InstancedModel<ModelData> getHeadModel() {
return modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_HEAD_SPEED, blockState); return getTransformMaterial().getModel(AllBlockPartials.GAUGE_HEAD_SPEED, blockState);
} }
} }
@ -165,7 +162,7 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
@Override @Override
protected InstancedModel<ModelData> getHeadModel() { protected InstancedModel<ModelData> getHeadModel() {
return modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_HEAD_STRESS, blockState); return getTransformMaterial().getModel(AllBlockPartials.GAUGE_HEAD_STRESS, blockState);
} }
} }
} }

View file

@ -43,8 +43,8 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
key.getInstance() key.getInstance()
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setRotationalSpeed(getSpeed(direction)) .setRotationalSpeed(getSpeed(direction))
.setRotationOffset(getRotationOffset(axis)) .setRotationOffset(getRotationOffset(axis)).setColor(tile)
.setTileEntity(tile) .setPosition(getInstancePosition())
.setBlockLight(blockLight) .setBlockLight(blockLight)
.setSkyLight(skyLight); .setSkyLight(skyLight);
@ -80,12 +80,7 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
Direction direction = key.getKey(); Direction direction = key.getKey();
Direction.Axis axis = direction.getAxis(); Direction.Axis axis = direction.getAxis();
key.getValue() updateRotation(key.getValue().getInstance(), axis, getSpeed(direction));
.getInstance()
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setRotationalSpeed(getSpeed(direction))
.setRotationOffset(getRotationOffset(axis))
.setColor(tile.network);
} }
} }

View file

@ -1,25 +1,5 @@
package com.simibubi.create.content.logistics; package com.simibubi.create.content.logistics;
import static com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.getHeatLevelOf;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import javax.annotation.Nullable;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@ -48,6 +28,24 @@ import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import javax.annotation.Nullable;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.ColorHelper;
import static com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.getHeatLevelOf;
public class InWorldProcessing { public class InWorldProcessing {
public static class SplashingInv extends RecipeWrapper { public static class SplashingInv extends RecipeWrapper {
@ -266,7 +264,7 @@ public class InWorldProcessing {
} }
} }
private static List<ItemStack> applyRecipeOn(ItemStack stackIn, IRecipe<?> recipe) { public static List<ItemStack> applyRecipeOn(ItemStack stackIn, IRecipe<?> recipe) {
List<ItemStack> stacks; List<ItemStack> stacks;
if (recipe instanceof ProcessingRecipe) { if (recipe instanceof ProcessingRecipe) {

View file

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

View file

@ -1,19 +1,24 @@
package com.simibubi.create.content.logistics.block.belts.tunnel; 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.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Map; 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 { public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity> implements IDynamicInstance {
private final Map<Direction, ArrayList<InstanceKey<FlapData>>> tunnelFlaps; private final Map<Direction, ArrayList<InstanceKey<FlapData>>> tunnelFlaps;
@ -63,6 +68,11 @@ public class BeltTunnelInstance extends TileEntityInstance<BeltTunnelTileEntity>
}); });
} }
@Override
public boolean shouldReset() {
return super.shouldReset() || tunnelFlaps.size() != tile.flaps.size();
}
@Override @Override
public void beginFrame() { public void beginFrame() {
tunnelFlaps.forEach((direction, keys) -> { tunnelFlaps.forEach((direction, keys) -> {

View file

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

View file

@ -4,6 +4,7 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@ -15,7 +16,7 @@ import net.minecraft.world.World;
public class BrassTunnelBlock extends BeltTunnelBlock { public class BrassTunnelBlock extends BeltTunnelBlock {
public BrassTunnelBlock(Properties properties) { public BrassTunnelBlock(AbstractBlock.Properties properties) {
super(properties); super(properties);
} }

View file

@ -23,6 +23,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.SidedFilter
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour;
import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
@ -55,11 +56,13 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
ItemStack stackToDistribute; ItemStack stackToDistribute;
float distributionProgress; float distributionProgress;
List<Pair<BlockPos, Direction>> distributionTargets;
int distributionDistanceLeft; int distributionDistanceLeft;
int distributionDistanceRight; int distributionDistanceRight;
int previousOutputIndex; int previousOutputIndex;
// <filtered, non-filtered>
Couple<List<Pair<BlockPos, Direction>>> distributionTargets;
private boolean syncedOutputActive; private boolean syncedOutputActive;
private Set<BrassTunnelTileEntity> syncSet; private Set<BrassTunnelTileEntity> syncSet;
@ -69,7 +72,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
public BrassTunnelTileEntity(TileEntityType<? extends BeltTunnelTileEntity> type) { public BrassTunnelTileEntity(TileEntityType<? extends BeltTunnelTileEntity> type) {
super(type); super(type);
distributionTargets = new ArrayList<>(); distributionTargets = Couple.create(ArrayList::new);
syncSet = new HashSet<>(); syncSet = new HashSet<>();
stackToDistribute = ItemStack.EMPTY; stackToDistribute = ItemStack.EMPTY;
beltCapability = LazyOptional.empty(); beltCapability = LazyOptional.empty();
@ -113,7 +116,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
return; return;
if (distributionProgress == -1) { if (distributionProgress == -1) {
distributionTargets.clear(); distributionTargets.forEach(List::clear);
distributionDistanceLeft = 0; distributionDistanceLeft = 0;
distributionDistanceRight = 0; distributionDistanceRight = 0;
@ -137,15 +140,13 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
if (stackToDistribute.isEmpty()) if (stackToDistribute.isEmpty())
return; return;
for (boolean filterPass : Iterate.trueAndFalse) {
for (Pair<BrassTunnelTileEntity, Direction> pair : validOutputs) { for (Pair<BrassTunnelTileEntity, Direction> pair : validOutputs) {
BrassTunnelTileEntity tunnel = pair.getKey(); BrassTunnelTileEntity tunnel = pair.getKey();
Direction output = pair.getValue(); Direction output = pair.getValue();
if (filterPass && tunnel.flapFilterEmpty(output))
continue;
if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null) if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null)
continue; continue;
distributionTargets.add(Pair.of(tunnel.pos, output)); distributionTargets.get(!tunnel.flapFilterEmpty(output))
.add(Pair.of(tunnel.pos, output));
int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ();
if (distance < 0) if (distance < 0)
distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance);
@ -153,11 +154,10 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
distributionDistanceRight = Math.max(distributionDistanceRight, distance); distributionDistanceRight = Math.max(distributionDistanceRight, distance);
} }
if (!distributionTargets.isEmpty() && filterPass) if (distributionTargets.getFirst()
break; .isEmpty()
} && distributionTargets.getSecond()
.isEmpty())
if (distributionTargets.isEmpty())
return; return;
if (selectionMode.get() != SelectionMode.SYNCHRONIZE || syncedOutputActive) { if (selectionMode.get() != SelectionMode.SYNCHRONIZE || syncedOutputActive) {
@ -167,9 +167,14 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
return; return;
} }
if (distributionProgress == 0) { if (distributionProgress != 0)
return;
distributionTargets.forEach(list -> {
if (stackToDistribute.isEmpty())
return;
List<Pair<BrassTunnelTileEntity, Direction>> validTargets = new ArrayList<>(); List<Pair<BrassTunnelTileEntity, Direction>> validTargets = new ArrayList<>();
for (Pair<BlockPos, Direction> pair : distributionTargets) { for (Pair<BlockPos, Direction> pair : list) {
BlockPos tunnelPos = pair.getKey(); BlockPos tunnelPos = pair.getKey();
Direction output = pair.getValue(); Direction output = pair.getValue();
TileEntity te = world.getTileEntity(tunnelPos); TileEntity te = world.getTileEntity(tunnelPos);
@ -177,18 +182,15 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
continue; continue;
validTargets.add(Pair.of((BrassTunnelTileEntity) te, output)); validTargets.add(Pair.of((BrassTunnelTileEntity) te, output));
} }
distribute(validTargets); distribute(validTargets);
distributionProgress = -1; distributionProgress = -1;
return; });
}
} }
private static Random rand = new Random(); private static Random rand = new Random();
private void distribute(List<Pair<BrassTunnelTileEntity, Direction>> validTargets) { private void distribute(List<Pair<BrassTunnelTileEntity, Direction>> validTargets) {
final int amountTargets = validTargets.size(); int amountTargets = validTargets.size();
if (amountTargets == 0) if (amountTargets == 0)
return; return;
@ -204,18 +206,23 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
ItemStack toDistribute = null; ItemStack toDistribute = null;
int leftovers = 0; int leftovers = 0;
int remainingOutputs = amountTargets;
for (boolean simulate : Iterate.trueAndFalse) { for (boolean simulate : Iterate.trueAndFalse) {
if (remainingOutputs == 0)
return;
leftovers = 0; leftovers = 0;
int index = indexStart; int index = indexStart;
int stackSize = stackToDistribute.getCount(); int stackSize = stackToDistribute.getCount();
int splitStackSize = stackSize / amountTargets; int splitStackSize = stackSize / remainingOutputs;
int splitRemainder = stackSize % amountTargets; int splitRemainder = stackSize % remainingOutputs;
int visited = 0; int visited = 0;
toDistribute = stackToDistribute.copy(); toDistribute = stackToDistribute.copy();
if (!force && simulate) if (!(force || split) && simulate)
continue; continue;
while (visited < amountTargets) { while (visited < amountTargets) {
Pair<BrassTunnelTileEntity, Direction> pair = validTargets.get(index); Pair<BrassTunnelTileEntity, Direction> pair = validTargets.get(index);
BrassTunnelTileEntity tunnel = pair.getKey(); BrassTunnelTileEntity tunnel = pair.getKey();
@ -230,6 +237,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
if (remainder == null || remainder.getCount() == count) { if (remainder == null || remainder.getCount() == count) {
if (force) if (force)
return; return;
if (split && simulate)
remainingOutputs--;
continue; continue;
} }
@ -457,19 +466,22 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
compound.putBoolean("SyncedOutput", syncedOutputActive); compound.putBoolean("SyncedOutput", syncedOutputActive);
compound.putBoolean("ConnectedLeft", connectedLeft); compound.putBoolean("ConnectedLeft", connectedLeft);
compound.putBoolean("ConnectedRight", connectedRight); compound.putBoolean("ConnectedRight", connectedRight);
compound.put("StackToDistribute", stackToDistribute.serializeNBT()); compound.put("StackToDistribute", stackToDistribute.serializeNBT());
compound.putFloat("DistributionProgress", distributionProgress); compound.putFloat("DistributionProgress", distributionProgress);
compound.putInt("PreviousIndex", previousOutputIndex); compound.putInt("PreviousIndex", previousOutputIndex);
compound.putInt("DistanceLeft", distributionDistanceLeft); compound.putInt("DistanceLeft", distributionDistanceLeft);
compound.putInt("DistanceRight", distributionDistanceRight); compound.putInt("DistanceRight", distributionDistanceRight);
compound.put("Targets", NBTHelper.writeCompoundList(distributionTargets, pair -> {
for (boolean filtered : Iterate.trueAndFalse) {
compound.put(filtered ? "FilteredTargets" : "Targets",
NBTHelper.writeCompoundList(distributionTargets.get(filtered), pair -> {
CompoundNBT nbt = new CompoundNBT(); CompoundNBT nbt = new CompoundNBT();
nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey())); nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey()));
nbt.putInt("Face", pair.getValue() nbt.putInt("Face", pair.getValue()
.getIndex()); .getIndex());
return nbt; return nbt;
})); }));
}
super.write(compound, clientPacket); super.write(compound, clientPacket);
} }
@ -487,11 +499,15 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
previousOutputIndex = compound.getInt("PreviousIndex"); previousOutputIndex = compound.getInt("PreviousIndex");
distributionDistanceLeft = compound.getInt("DistanceLeft"); distributionDistanceLeft = compound.getInt("DistanceLeft");
distributionDistanceRight = compound.getInt("DistanceRight"); distributionDistanceRight = compound.getInt("DistanceRight");
distributionTargets = NBTHelper.readCompoundList(compound.getList("Targets", NBT.TAG_COMPOUND), nbt -> {
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")); BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos"));
Direction face = Direction.byIndex(nbt.getInt("Face")); Direction face = Direction.byIndex(nbt.getInt("Face"));
return Pair.of(pos, face); return Pair.of(pos, face);
}); }));
}
super.fromTag(state, compound, clientPacket); super.fromTag(state, 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.vector.Vector3d;
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)) {
Vector3d 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);
Vector3d 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 Vector3d getWorldPositionOf(TransportedItemStack transported) {
Vector3d offsetVec = new Vector3d(.5f, 14 / 16f, .5f);
return offsetVec.add(Vector3d.of(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 javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; 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.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE; 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 mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; 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.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@ -65,74 +54,18 @@ public class DepotBlock extends Block implements ITE<DepotTileEntity>, IWrenchab
@Override @Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) { BlockRayTraceResult ray) {
if (ray.getFace() != Direction.UP) return SharedDepotBlockMethods.onUse(state, world, pos, player, hand, ray);
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;
} }
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving);
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);
} }
@Override @Override
public void onLanded(IBlockReader worldIn, Entity entityIn) { public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn); super.onLanded(worldIn, entityIn);
if (!AllBlocks.DEPOT.has(worldIn.getBlockState(entityIn.getBlockPos()))) SharedDepotBlockMethods.onLanded(worldIn, entityIn);
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.getBlockPos(), DirectBeltInputBehaviour.TYPE);
if (inputBehaviour == null)
return;
ItemStack remainder = inputBehaviour.handleInsertion(itemEntity.getItem(), Direction.DOWN, false);
itemEntity.setItem(remainder);
if (remainder.isEmpty())
itemEntity.remove();
} }
@Override @Override
@ -142,11 +75,7 @@ public class DepotBlock extends Block implements ITE<DepotTileEntity>, IWrenchab
@Override @Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
try { return SharedDepotBlockMethods.getComparatorInputOverride(blockState, worldIn, pos);
return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).itemHandler);
} catch (TileEntityException ignored) {
}
return 0;
} }
} }

View file

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

View file

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

View file

@ -1,254 +1,33 @@
package com.simibubi.create.content.logistics.block.depot; 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.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; 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.block.BlockState;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import java.util.List;
public class DepotTileEntity extends SmartTileEntity { public class DepotTileEntity extends SmartTileEntity {
TransportedItemStack heldItem; DepotBehaviour depotBehaviour;
ItemStackHandler processingOutputBuffer;
DepotItemHandler itemHandler;
LazyOptional<DepotItemHandler> lazyItemHandler;
private TransportedItemStackHandlerBehaviour transportedHandler;
public DepotTileEntity(TileEntityType<?> tileEntityTypeIn) { public DepotTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(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 fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) {
heldItem = null;
if (compound.contains("HeldItem"))
heldItem = TransportedItemStack.read(compound.getCompound("HeldItem"));
processingOutputBuffer.deserializeNBT(compound.getCompound("OutputBuffer"));
super.fromTag(state, compound, clientPacket);
} }
@Override @Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) { public void addBehaviours(List<TileEntityBehaviour> behaviours) {
behaviours.add(new DirectBeltInputBehaviour(this).allowingBeltFunnels() behaviours.add(depotBehaviour = new DepotBehaviour(this));
.setInsertionHandler(this::tryInsertingFromSide)); depotBehaviour.addSubBehaviours(behaviours);
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;
} }
@Override @Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return lazyItemHandler.cast(); return depotBehaviour.getItemCapability(cap, side);
return super.getCapability(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);
Vector3d 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 Vector3d getWorldPositionOf(TransportedItemStack transported) {
Vector3d offsetVec = new Vector3d(.5f, 14 / 16f, .5f);
return offsetVec.add(Vector3d.of(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.vector.Vector3d;
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.getBlockPos();
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;
Vector3d center = VecHelper.getCenterOf(position)
.add(0, 7 / 16f, 0);
Vector3d positionVec = entityIn.getPositionVec();
double diff = center.distanceTo(positionVec);
entityIn.setMotion(0, -0.125, 0);
Vector3d 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,60 @@
package com.simibubi.create.content.logistics.block.depot;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
public class EjectorInstance extends ShaftInstance implements IDynamicInstance {
protected final EjectorTileEntity tile;
protected final InstanceKey<ModelData> plate;
public EjectorInstance(InstancedTileRenderer<?> dispatcher, EjectorTileEntity tile) {
super(dispatcher, tile);
this.tile = tile;
plate = getTransformMaterial().getModel(AllBlockPartials.EJECTOR_TOP, blockState).createInstance();
pivotPlate();
updateLight();
}
@Override
public void beginFrame() {
if (tile.lidProgress.settled()) return;
pivotPlate();
}
private void pivotPlate() {
float lidProgress = tile.getLidProgress(AnimationTickHolder.getPartialTicks());
float angle = lidProgress * 70;
MatrixStack ms = new MatrixStack();
EjectorRenderer.applyLidAngle(tile, angle, MatrixStacker.of(ms).translate(getInstancePosition()));
plate.getInstance().setTransform(ms);
}
@Override
public void updateLight() {
super.updateLight();
relight(pos, plate.getInstance());
}
@Override
public void remove() {
super.remove();
plate.delete();
}
}

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,105 @@
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.render.backend.FastRenderDispatcher;
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.vector.Vector3d;
public class EjectorRenderer extends KineticTileEntityRenderer {
static final Vector3d pivot = VecHelper.voxelSpace(0, 11.25, 0.75);
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;
IVertexBuilder vertexBuilder = buffer.getBuffer(RenderType.getSolid());
float lidProgress = ((EjectorTileEntity) te).getLidProgress(partialTicks);
float angle = lidProgress * 70;
if (!FastRenderDispatcher.available(te.getWorld())) {
SuperByteBuffer model = AllBlockPartials.EJECTOR_TOP.renderOn(te.getBlockState());
applyLidAngle(te, 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;
Vector3d launchedItemLocation = ejector.getLaunchedItemLocation(time);
msr.translate(launchedItemLocation.subtract(Vector3d.of(te.getPos())));
Vector3d 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, 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();
}
static void applyLidAngle(KineticTileEntity te, float angle, MatrixStacker matrixStacker) {
applyLidAngle(te, pivot, angle, matrixStacker);
}
static void applyLidAngle(KineticTileEntity te, Vector3d 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,268 @@
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.vector.Vector3d;
import net.minecraft.util.math.shapes.VoxelShape;
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(Lang.translate(key).formatted(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(Lang.translate(key).formatted(colour), true);
currentItem = null;
currentSelection = null;
return;
}
key = "weighted_ejector.targeting";
colour = TextFormatting.GREEN;
player.sendStatusMessage(
Lang.translate(key, currentSelection.getX(), currentSelection.getY(), currentSelection.getZ())
.formatted(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;
Vector3d 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;
Vector3d 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.vector.Vector3d;
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;
Vector3d ejectVec = getLaunchedItemLocation(maxTime);
Vector3d 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 Vector3d getLaunchedItemLocation(float time) {
return launcher.getGlobalPos(time, getFacing().getOpposite(), pos);
}
public Vector3d getLaunchedItemMotion(float time) {
return launcher.getGlobalVelocity(time, getFacing().getOpposite(), pos);
}
public void dropFlyingItems() {
for (IntAttached<ItemStack> intAttached : launchedItems) {
Vector3d ejectVec = getLaunchedItemLocation(intAttached.getFirst());
Vector3d 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 fromTag(BlockState blockState, CompoundNBT compound, boolean clientPacket) {
super.fromTag(blockState, 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 Vector3d getLocalOffset(BlockState state) {
return new Vector3d(.5, 13 / 16f, .5).add(VecHelper.rotate(new Vector3d(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 Vector3d getSouthLocation() {
return Vector3d.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.vector.Vector3d;
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) {
Vector3d motionVec = new Vector3d(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 Vector3d getGlobalPos(double t, Direction d, BlockPos launcher) {
Vector3d start = new Vector3d(launcher.getX() + .5f, launcher.getY() + .5f, launcher.getZ() + .5f);
Vector3d vec = new Vector3d(0, y(t), x(t));
return VecHelper.rotate(vec, 180 + AngleHelper.horizontalAngle(d), Axis.Y)
.add(start);
}
public Vector3d getGlobalVelocity(double t, Direction d, BlockPos launcher) {
return VecHelper.rotate(new Vector3d(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.getBlockPos(), 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

@ -16,18 +16,16 @@ public class AdjustableRepeaterInstance extends TileEntityInstance<AdjustableRep
public AdjustableRepeaterInstance(InstancedTileRenderer<?> modelManager, AdjustableRepeaterTileEntity tile) { public AdjustableRepeaterInstance(InstancedTileRenderer<?> modelManager, AdjustableRepeaterTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
indicator = modelManager.transformMaterial().getModel(AllBlockPartials.FLEXPEATER_INDICATOR, blockState).createInstance(); indicator = modelManager.getTransformMaterial().getModel(AllBlockPartials.FLEXPEATER_INDICATOR, blockState).createInstance();
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker.of(ms).translate(getFloatingPos()); MatrixStacker.of(ms).translate(getInstancePosition());
indicator.getInstance() indicator.getInstance()
.setTransform(ms) .setTransform(ms)
.setColor(getColor()); .setColor(getColor());
previousState = tile.state; previousState = tile.state;
updateLight();
} }
@Override @Override

View file

@ -6,7 +6,6 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
@ -37,7 +36,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) { public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED); RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
base = mat.getModel(AllBlockPartials.ARM_BASE, blockState).createInstance(); base = mat.getModel(AllBlockPartials.ARM_BASE, blockState).createInstance();
lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, blockState).createInstance(); lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, blockState).createInstance();
@ -51,8 +50,6 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); clawGrips = Lists.newArrayList(clawGrip1, clawGrip2);
models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2); models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2);
updateLight();
} }
@Override @Override
@ -90,7 +87,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
MatrixStack msLocal = new MatrixStack(); MatrixStack msLocal = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(msLocal); MatrixStacker msr = MatrixStacker.of(msLocal);
msr.translate(getFloatingPos()); msr.translate(getInstancePosition());
msr.centre(); msr.centre();
if (blockState.get(ArmBlock.CEILING)) if (blockState.get(ArmBlock.CEILING))
@ -146,7 +143,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
@Override @Override
protected InstancedModel<RotatingData> getModel() { protected InstancedModel<RotatingData> getModel() {
return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState()); return AllBlockPartials.ARM_COG.renderOnRotating(renderer, tile.getBlockState());
} }
@Override @Override

View file

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

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.logistics.block.redstone;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
@ -23,7 +22,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity tile) { public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED); RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, blockState).createInstance(); handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, blockState).createInstance();
indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, blockState).createInstance(); indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, blockState).createInstance();
@ -33,7 +32,6 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
rY = AngleHelper.horizontalAngle(blockState.get(AnalogLeverBlock.HORIZONTAL_FACING)); rY = AngleHelper.horizontalAngle(blockState.get(AnalogLeverBlock.HORIZONTAL_FACING));
setupModel(); setupModel();
updateLight();
} }
@Override @Override
@ -46,7 +44,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms); MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos()); msr.translate(getInstancePosition());
transform(msr); transform(msr);
float state = tile.clientState.get(AnimationTickHolder.getPartialTicks()); float state = tile.clientState.get(AnimationTickHolder.getPartialTicks());

View file

@ -1,30 +1,14 @@
package com.simibubi.create.content.logistics.item.filter; package com.simibubi.create.content.logistics.item.filter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicates;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.content.logistics.item.filter.attribute.BookAuthorAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.*;
import com.simibubi.create.content.logistics.item.filter.attribute.BookCopyAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.EnchantAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.FluidContentsAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.ItemNameAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAmuletAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAmuletAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAttunementAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAttunementAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryCrystalAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryCrystalAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryPerkGemAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryPerkGemAttribute;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@ -45,6 +29,12 @@ import net.minecraftforge.fml.ModList;
import net.minecraftforge.forgespi.language.IModInfo; import net.minecraftforge.forgespi.language.IModInfo;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public interface ItemAttribute { public interface ItemAttribute {
@ -55,6 +45,7 @@ public interface ItemAttribute {
static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC)); static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC));
static ItemAttribute addedBy = register(new InItemGroup.AddedBy("dummy")); static ItemAttribute addedBy = register(new InItemGroup.AddedBy("dummy"));
static ItemAttribute hasEnchant = register(EnchantAttribute.EMPTY); static ItemAttribute hasEnchant = register(EnchantAttribute.EMPTY);
static ItemAttribute hasColor = register(ColorAttribute.EMPTY);
static ItemAttribute hasFluid = register(FluidContentsAttribute.EMPTY); static ItemAttribute hasFluid = register(FluidContentsAttribute.EMPTY);
static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); static ItemAttribute hasName = register(new ItemNameAttribute("dummy"));
static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1)); static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1));
@ -130,8 +121,9 @@ public interface ItemAttribute {
RENAMED(ItemStack::hasDisplayName), RENAMED(ItemStack::hasDisplayName),
DAMAGED(ItemStack::isDamaged), DAMAGED(ItemStack::isDamaged),
BADLY_DAMAGED(s -> s.isDamaged() && s.getDamage() / s.getMaxDamage() > 3 / 4f), BADLY_DAMAGED(s -> s.isDamaged() && s.getDamage() / s.getMaxDamage() > 3 / 4f),
NOT_STACKABLE(Predicates.not(ItemStack::isStackable)), NOT_STACKABLE(((Predicate<ItemStack>) ItemStack::isStackable).negate()),
EQUIPABLE(s -> s.getEquipmentSlot() != null), EQUIPABLE(s -> s.getEquipmentSlot() != null),
MAX_ENCHANTED(StandardTraits::maxEnchanted),
FURNACE_FUEL(AbstractFurnaceTileEntity::isFuel), FURNACE_FUEL(AbstractFurnaceTileEntity::isFuel),
WASHABLE(InWorldProcessing::isWashable), WASHABLE(InWorldProcessing::isWashable),
CRUSHABLE((s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType()) CRUSHABLE((s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType())
@ -155,6 +147,13 @@ public interface ItemAttribute {
.isPresent(); .isPresent();
} }
private static boolean maxEnchanted(ItemStack s) {
return EnchantmentHelper.getEnchantments(s)
.entrySet()
.stream()
.anyMatch(e -> e.getKey().getMaxLevel() <= e.getValue());
}
private StandardTraits(BiPredicate<ItemStack, World> test) { private StandardTraits(BiPredicate<ItemStack, World> test) {
this.testWithWorld = test; this.testWithWorld = test;
} }

View file

@ -0,0 +1,86 @@
package com.simibubi.create.content.logistics.item.filter.attribute;
import com.simibubi.create.content.logistics.item.filter.ItemAttribute;
import net.minecraft.item.DyeColor;
import net.minecraft.item.FireworkRocketItem;
import net.minecraft.item.FireworkStarItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import net.minecraft.util.text.TranslationTextComponent;
import java.util.*;
import java.util.stream.Collectors;
public class ColorAttribute implements ItemAttribute {
public static final ColorAttribute EMPTY = new ColorAttribute(DyeColor.PURPLE);
public final DyeColor color;
public ColorAttribute(DyeColor color) {
this.color = color;
}
@Override
public boolean appliesTo(ItemStack itemStack) {
return findMatchingDyeColors(itemStack).stream().anyMatch(color::equals);
}
@Override
public List<ItemAttribute> listAttributesOf(ItemStack itemStack) {
return findMatchingDyeColors(itemStack).stream().map(ColorAttribute::new).collect(Collectors.toList());
}
private Collection<DyeColor> findMatchingDyeColors(ItemStack stack) {
CompoundNBT nbt = stack.getTag();
DyeColor color = DyeColor.getColor(stack);
if (color != null)
return Collections.singletonList(color);
Set<DyeColor> colors = new HashSet<>();
if (stack.getItem() instanceof FireworkRocketItem && nbt != null) {
ListNBT listnbt = nbt.getCompound("Fireworks").getList("Explosions", 10);
for (int i = 0; i < listnbt.size(); i++) {
colors.addAll(getFireworkStarColors(listnbt.getCompound(i)));
}
}
if (stack.getItem() instanceof FireworkStarItem && nbt != null) {
colors.addAll(getFireworkStarColors(nbt.getCompound("Explosion")));
}
Arrays.stream(DyeColor.values()).filter(c -> stack.getItem().getRegistryName().getPath().startsWith(c.getTranslationKey() + "_")).forEach(colors::add);
return colors;
}
private Collection<DyeColor> getFireworkStarColors(CompoundNBT compound) {
Set<DyeColor> colors = new HashSet<>();
Arrays.stream(compound.getIntArray("Colors")).mapToObj(DyeColor::byFireworkColor).forEach(colors::add);
Arrays.stream(compound.getIntArray("FadeColors")).mapToObj(DyeColor::byFireworkColor).forEach(colors::add);
return colors;
}
@Override
public String getTranslationKey() {
return "color";
}
@Override
public Object[] getTranslationParameters() {
return new Object[]{new TranslationTextComponent(color.getTranslationKey()).getUnformattedComponentText()};
}
@Override
public void writeNBT(CompoundNBT nbt) {
nbt.putInt("id", color.getId());
}
@Override
public ItemAttribute readNBT(CompoundNBT nbt) {
return nbt.contains("id") ?
new ColorAttribute(DyeColor.byId(nbt.getInt("id")))
: EMPTY;
}
}

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.schematics.block;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
@ -17,12 +16,10 @@ public class SchematicannonInstance extends TileEntityInstance<SchematicannonTil
public SchematicannonInstance(InstancedTileRenderer<?> modelManager, SchematicannonTileEntity tile) { public SchematicannonInstance(InstancedTileRenderer<?> modelManager, SchematicannonTileEntity tile) {
super(modelManager, tile); super(modelManager, tile);
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED); RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
connector = mat.getModel(AllBlockPartials.SCHEMATICANNON_CONNECTOR, blockState).createInstance(); connector = mat.getModel(AllBlockPartials.SCHEMATICANNON_CONNECTOR, blockState).createInstance();
pipe = mat.getModel(AllBlockPartials.SCHEMATICANNON_PIPE, blockState).createInstance(); pipe = mat.getModel(AllBlockPartials.SCHEMATICANNON_PIPE, blockState).createInstance();
updateLight();
} }
@Override @Override
@ -39,7 +36,7 @@ public class SchematicannonInstance extends TileEntityInstance<SchematicannonTil
MatrixStack ms = new MatrixStack(); MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms); MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos()); msr.translate(getInstancePosition());
ms.push(); ms.push();
msr.centre(); msr.centre();

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

View file

@ -15,6 +15,7 @@ public class CKinetics extends ConfigBase {
public ConfigInt kineticValidationFrequency = i(60, 5, "kineticValidationFrequency", Comments.kineticValidationFrequency); public ConfigInt kineticValidationFrequency = i(60, 5, "kineticValidationFrequency", Comments.kineticValidationFrequency);
public ConfigFloat crankHungerMultiplier = f(.01f, 0, 1, "crankHungerMultiplier", Comments.crankHungerMultiplier); public ConfigFloat crankHungerMultiplier = f(.01f, 0, 1, "crankHungerMultiplier", Comments.crankHungerMultiplier);
public ConfigInt minimumWindmillSails = i(8, 0, "minimumWindmillSails", Comments.minimumWindmillSails); 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 ConfigGroup fan = group(1, "encasedFan", "Encased Fan");
public ConfigInt fanPushDistance = i(20, 5, "fanPushDistance", Comments.fanPushDistance); 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 disableStress = "Disable the Stress mechanic altogether.";
static String kineticValidationFrequency = "Game ticks between Kinetic Blocks checking whether their source is still valid."; 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 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 { public static enum DeployerAggroSetting {

View file

@ -588,6 +588,14 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("A") .patternLine("A")
.patternLine("I")), .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) MECHANICAL_ARM = create(AllBlocks.MECHANICAL_ARM::get).unlockedBy(I::brassCasing)
.returns(1) .returns(1)
.viaShaped(b -> b.key('L', I.brassSheet()) .viaShaped(b -> b.key('L', I.brassSheet())

View file

@ -1,72 +0,0 @@
package com.simibubi.create.foundation.mixin;
import com.simibubi.create.foundation.render.KineticRenderer;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import com.simibubi.create.CreateClient;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import java.util.Set;
@OnlyIn(Dist.CLIENT)
@Mixin(value = World.class, priority = 1042)
public class AddRemoveTileMixin {
@Shadow @Final public boolean isRemote;
@Shadow @Final protected Set<TileEntity> tileEntitiesToBeRemoved;
/**
* JUSTIFICATION: This method is called whenever a tile entity is removed due
* to a change in block state, even on the client. By hooking into this method,
* we gain easy access to the information while having no impact on performance.
*/
@Inject(at = @At(
value = "INVOKE_ASSIGN",
target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;"
),
method = "removeTileEntity",
locals = LocalCapture.CAPTURE_FAILHARD
)
private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) {
if (isRemote) {
World thi = (World)(Object) this;
CreateClient.kineticRenderer.get(thi).remove(te);
}
}
@Inject(at = @At("TAIL"), method = "addTileEntity")
private void onAddTile(TileEntity te, CallbackInfoReturnable<Boolean> cir) {
if (isRemote) {
World thi = (World)(Object) this;
CreateClient.kineticRenderer.get(thi).queueAdd(te);
}
}
@Inject(at = @At(
value = "INVOKE",
target = "Ljava/util/Set;clear()V", ordinal = 0
),
method = "tickBlockEntities")
private void onChunkUnload(CallbackInfo ci) {
if (isRemote) {
World thi = (World)(Object) this;
KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(thi);
for (TileEntity tile : tileEntitiesToBeRemoved) {
kineticRenderer.remove(tile);
}
}
}
}

View file

@ -0,0 +1,29 @@
package com.simibubi.create.foundation.mixin;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.simibubi.create.CreateClient;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
@Mixin(World.class)
public class TileAddMixin {
@Shadow @Final public boolean isRemote;
@Inject(at = @At("TAIL"), method = "addTileEntity")
private void onAddTile(TileEntity te, CallbackInfoReturnable<Boolean> cir) {
if (isRemote) {
CreateClient.kineticRenderer.get((World)(Object) this).queueAdd(te);
}
}
}

View file

@ -0,0 +1,25 @@
package com.simibubi.create.foundation.mixin;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import javax.annotation.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.simibubi.create.CreateClient;
@Mixin(TileEntity.class)
public class TileRemoveMixin {
@Shadow @Nullable protected World world;
@Inject(at = @At("TAIL"), method = "remove")
private void onRemove(CallbackInfo ci) {
if (world instanceof ClientWorld)
CreateClient.kineticRenderer.get(this.world).remove((TileEntity) (Object) this);
}
}

View file

@ -1,11 +1,22 @@
package com.simibubi.create.foundation.networking; 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.Create;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionDisassemblyPacket; 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.ContraptionStallPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionUpdatePacket; 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.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.CouplingCreationPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartControllerUpdatePacket; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartControllerUpdatePacket;
import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket; 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.symmetry.SymmetryEffectPacket;
import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket; import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket;
import com.simibubi.create.content.curiosities.zapper.ZapperBeamPacket; 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.block.mechanicalArm.ArmPlacementPacket;
import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket;
import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket;
import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket;
import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket;
import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; 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.ConfigureConfigPacket;
import com.simibubi.create.foundation.command.HighlightPacket; import com.simibubi.create.foundation.command.HighlightPacket;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCountUpdatePacket; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCountUpdatePacket;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket;
import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; 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.PacketDistributor.TargetPoint;
import net.minecraftforge.fml.network.simple.SimpleChannel; 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 { public enum AllPackets {
// Client to Server // Client to Server
@ -64,6 +76,9 @@ public enum AllPackets {
INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new, PLAY_TO_SERVER), INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new, PLAY_TO_SERVER),
SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new, PLAY_TO_SERVER), SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new, PLAY_TO_SERVER),
LEFT_CLICK(LeftClickPacket.class, LeftClickPacket::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 // Server to Client
SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_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(AllItems.BELT_CONNECTOR)
.add(AllBlocks.CHUTE) .add(AllBlocks.CHUTE)
.add(AllBlocks.DEPOT) .add(AllBlocks.DEPOT)
.add(AllBlocks.WEIGHTED_EJECTOR)
.add(AllBlocks.BASIN) .add(AllBlocks.BASIN)
.add(AllBlocks.ANDESITE_FUNNEL) .add(AllBlocks.ANDESITE_FUNNEL)
.add(AllBlocks.BRASS_FUNNEL) .add(AllBlocks.BRASS_FUNNEL)
@ -326,6 +327,7 @@ public class PonderIndex {
.add(AllBlocks.CHUTE) .add(AllBlocks.CHUTE)
.add(AllBlocks.SMART_CHUTE) .add(AllBlocks.SMART_CHUTE)
.add(AllBlocks.DEPOT) .add(AllBlocks.DEPOT)
.add(AllBlocks.WEIGHTED_EJECTOR)
.add(AllBlocks.MECHANICAL_ARM) .add(AllBlocks.MECHANICAL_ARM)
.add(AllBlocks.ANDESITE_FUNNEL) .add(AllBlocks.ANDESITE_FUNNEL)
.add(AllBlocks.BRASS_FUNNEL) .add(AllBlocks.BRASS_FUNNEL)

View file

@ -11,6 +11,7 @@ import com.simibubi.create.foundation.render.backend.instancing.IFlywheelWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GLCapabilities; import org.lwjgl.opengl.GLCapabilities;
import org.lwjgl.system.MemoryUtil; import org.lwjgl.system.MemoryUtil;
@ -26,16 +27,15 @@ public class Backend {
public static final Boolean SHADER_DEBUG_OUTPUT = true; public static final Boolean SHADER_DEBUG_OUTPUT = true;
public static final Logger log = LogManager.getLogger(Backend.class); public static final Logger log = LogManager.getLogger(Backend.class);
public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); public static GLCapabilities capabilities;
public static GlFeatureCompat compat;
private static boolean instancingAvailable;
private static boolean enabled;
static final Map<ResourceLocation, ProgramSpec<?>> registry = new HashMap<>(); static final Map<ResourceLocation, ProgramSpec<?>> registry = new HashMap<>();
static final Map<ProgramSpec<?>, ProgramGroup<?>> programs = new HashMap<>(); static final Map<ProgramSpec<?>, ProgramGroup<?>> programs = new HashMap<>();
private static boolean enabled;
public static GLCapabilities capabilities;
public static GlFeatureCompat compat;
public Backend() { public Backend() {
throw new IllegalStateException(); throw new IllegalStateException();
} }
@ -66,10 +66,7 @@ public class Backend {
} }
public static boolean canUseInstancing() { public static boolean canUseInstancing() {
return enabled && return enabled && instancingAvailable;
compat.vertexArrayObjectsSupported() &&
compat.drawInstancedSupported() &&
compat.instancedArraysSupported();
} }
public static boolean canUseVBOs() { public static boolean canUseVBOs() {
@ -98,7 +95,14 @@ public class Backend {
} }
public static void refresh() { public static void refresh() {
capabilities = GL.createCapabilities();
compat = new GlFeatureCompat(capabilities);
instancingAvailable = compat.vertexArrayObjectsSupported() &&
compat.drawInstancedSupported() &&
compat.instancedArraysSupported();
enabled = AllConfigs.CLIENT.experimentalRendering.get() && !OptifineHandler.usingShaders(); enabled = AllConfigs.CLIENT.experimentalRendering.get() && !OptifineHandler.usingShaders();
} }
} }

View file

@ -3,7 +3,7 @@ package com.simibubi.create.foundation.render.backend;
import net.minecraft.util.math.vector.Matrix3f; import net.minecraft.util.math.vector.Matrix3f;
import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.Matrix4f;
import java.nio.ByteBuffer; import com.mojang.blaze3d.matrix.MatrixStack;
public class RenderUtil { public class RenderUtil {
public static int nextPowerOf2(int a) { public static int nextPowerOf2(int a) {
@ -16,9 +16,12 @@ public class RenderUtil {
return b == 0 && n != 0; return b == 0 && n != 0;
} }
// GPUs want matrices in column major order. public static float[] writeMatrixStack(MatrixStack stack) {
return writeMatrixStack(stack.peek().getModel(), stack.peek().getNormal());
}
public static float[] bufferMatrices(Matrix4f model, Matrix3f normal) { // GPUs want matrices in column major order.
public static float[] writeMatrixStack(Matrix4f model, Matrix3f normal) {
return new float[] { return new float[] {
model.a00, model.a00,
model.a10, model.a10,
@ -47,4 +50,25 @@ public class RenderUtil {
normal.a22, normal.a22,
}; };
} }
public static float[] writeMatrix(Matrix4f model) {
return new float[]{
model.a00,
model.a10,
model.a20,
model.a30,
model.a01,
model.a11,
model.a21,
model.a31,
model.a02,
model.a12,
model.a22,
model.a32,
model.a03,
model.a13,
model.a23,
model.a33,
};
}
} }

View file

@ -35,9 +35,6 @@ public class ShaderLoader {
static void onResourceManagerReload(IResourceManager manager, Predicate<IResourceType> predicate) { static void onResourceManagerReload(IResourceManager manager, Predicate<IResourceType> predicate) {
if (predicate.test(VanillaResourceType.SHADERS)) { if (predicate.test(VanillaResourceType.SHADERS)) {
Backend.capabilities = GL.createCapabilities();
Backend.compat = new GlFeatureCompat(Backend.capabilities);
OptifineHandler.refresh(); OptifineHandler.refresh();
Backend.refresh(); Backend.refresh();

View file

@ -1,5 +1,6 @@
package com.simibubi.create.foundation.render.backend.gl; package com.simibubi.create.foundation.render.backend.gl;
import com.simibubi.create.foundation.render.backend.RenderUtil;
import com.simibubi.create.foundation.render.backend.gl.shader.ProgramFogMode; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramFogMode;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;
@ -53,9 +54,6 @@ public class BasicProgram extends GlProgram {
} }
protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { protected static void uploadMatrixUniform(int uniform, Matrix4f mat) {
Backend.MATRIX_BUFFER.position(0); GL20.glUniformMatrix4fv(uniform, false, RenderUtil.writeMatrix(mat));
mat.write(Backend.MATRIX_BUFFER);
Backend.MATRIX_BUFFER.rewind();
GL20.glUniformMatrix4fv(uniform, false, Backend.MATRIX_BUFFER);
} }
} }

View file

@ -1,8 +1,17 @@
package com.simibubi.create.foundation.render.backend.instancing; package com.simibubi.create.foundation.render.backend.instancing;
/**
* An interface giving {@link TileEntityInstance}s a hook to have a function called at
* the start of a frame. By implementing {@link IDynamicInstance}, a {@link TileEntityInstance}
* can animate its models in ways that could not be easily achieved by shader attribute
* parameterization.
*
* <br><br> If your goal is offloading work to shaders, but you're unsure exactly how you need
* to parameterize the instances, you're encouraged to implement this for prototyping.
*/
public interface IDynamicInstance { public interface IDynamicInstance {
/** /**
* Called every frame, this can be used to make more dynamic animations. * Called every frame.
*/ */
void beginFrame(); void beginFrame();
} }

View file

@ -1,6 +1,25 @@
package com.simibubi.create.foundation.render.backend.instancing; package com.simibubi.create.foundation.render.backend.instancing;
/**
* An interface giving {@link TileEntityInstance}s a hook to have a function called at
* the end of every tick. By implementing {@link ITickableInstance}, a {@link TileEntityInstance}
* can update frequently, but not every frame.
* <br> There are a few cases in which this should be considered over {@link IDynamicInstance}:
* <ul>
* <li>
* You'd like to change something about the instance every now and then.
* eg. adding or removing parts, snapping to a different rotation.
* </li>
* <li>
* Your TileEntity does animate, but the animation doesn't have
* to be smooth, in which case this could be an optimization.
* </li>
* </ul>
*/
public interface ITickableInstance { public interface ITickableInstance {
/**
* Called every tick.
*/
void tick(); void tick();
} }

View file

@ -39,23 +39,12 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
public abstract void registerMaterials(); public abstract void registerMaterials();
public void tick() { public void tick() {
int ticks = AnimationTickHolder.getTicks();
// Clean up twice a second. This doesn't have to happen every tick,
// but this does need to be run to ensure we don't miss anything.
if (ticks % 10 == 0) {
clean();
}
if (tickableInstances.size() > 0) if (tickableInstances.size() > 0)
tickableInstances.values().forEach(ITickableInstance::tick); tickableInstances.values().forEach(ITickableInstance::tick);
} }
public void beginFrame(double cameraX, double cameraY, double cameraZ) { public void beginFrame(double cameraX, double cameraY, double cameraZ) {
if (queuedAdditions.size() > 0) { processQueuedAdditions();
queuedAdditions.forEach(this::addInternal);
queuedAdditions.clear();
}
if (dynamicInstances.size() > 0) if (dynamicInstances.size() > 0)
dynamicInstances.values().forEach(IDynamicInstance::beginFrame); dynamicInstances.values().forEach(IDynamicInstance::beginFrame);
} }
@ -76,11 +65,11 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
return (RenderMaterial<P, M>) materials.get(materialType); return (RenderMaterial<P, M>) materials.get(materialType);
} }
public RenderMaterial<P, InstancedModel<ModelData>> transformMaterial() { public RenderMaterial<P, InstancedModel<ModelData>> getTransformMaterial() {
return getMaterial(RenderMaterials.TRANSFORMED); return getMaterial(RenderMaterials.TRANSFORMED);
} }
public RenderMaterial<P, InstancedModel<OrientedData>> orientedMaterial() { public RenderMaterial<P, InstancedModel<OrientedData>> getOrientedMaterial() {
return getMaterial(RenderMaterials.ORIENTED); return getMaterial(RenderMaterials.ORIENTED);
} }
@ -119,12 +108,6 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
} }
} }
public <T extends TileEntity> void queueAdd(T tile) {
if (!Backend.canUseInstancing()) return;
queuedAdditions.add(tile);
}
public <T extends TileEntity> void update(T tile) { public <T extends TileEntity> void update(T tile) {
if (!Backend.canUseInstancing()) return; if (!Backend.canUseInstancing()) return;
@ -152,6 +135,19 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
} }
} }
public synchronized <T extends TileEntity> void queueAdd(T tile) {
if (!Backend.canUseInstancing()) return;
queuedAdditions.add(tile);
}
protected synchronized void processQueuedAdditions() {
if (queuedAdditions.size() > 0) {
queuedAdditions.forEach(this::addInternal);
queuedAdditions.clear();
}
}
private void addInternal(TileEntity tile) { private void addInternal(TileEntity tile) {
getInstance(tile, true); getInstance(tile, true);
} }
@ -175,6 +171,7 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
TileEntityInstance<? super T> renderer = InstancedTileRenderRegistry.instance.create(this, tile); TileEntityInstance<? super T> renderer = InstancedTileRenderRegistry.instance.create(this, tile);
if (renderer != null) { if (renderer != null) {
renderer.updateLight();
instances.put(tile, renderer); instances.put(tile, renderer);
if (renderer instanceof IDynamicInstance) if (renderer instanceof IDynamicInstance)
@ -187,16 +184,13 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
return renderer; return renderer;
} }
private void clean() {
instances.keySet().removeIf(TileEntity::isRemoved);
}
public void invalidate() { public void invalidate() {
for (RenderMaterial<?, ?> material : materials.values()) { for (RenderMaterial<?, ?> material : materials.values()) {
material.delete(); material.delete();
} }
instances.clear(); instances.clear();
dynamicInstances.clear(); dynamicInstances.clear();
tickableInstances.clear();
} }
public boolean canCreateInstance(TileEntity tile) { public boolean canCreateInstance(TileEntity tile) {
@ -206,6 +200,8 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
if (world == null) return false; if (world == null) return false;
if (world.isAirBlock(tile.getPos())) return false;
if (world == Minecraft.getInstance().world) { if (world == Minecraft.getInstance().world) {
BlockPos pos = tile.getPos(); BlockPos pos = tile.getPos();

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