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

View file

@ -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_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM",
"block.create.weathered_limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM",
"block.create.weighted_ejector": "\u0279o\u0287\u0254\u01DD\u0638\u018E p\u01DD\u0287\u0265b\u0131\u01DDM",
"block.create.white_sail": "\u05DF\u0131\u0250S \u01DD\u0287\u0131\u0265M",
"block.create.white_seat": "\u0287\u0250\u01DDS \u01DD\u0287\u0131\u0265M",
"block.create.white_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u0287\u0131\u0265M",

View file

@ -399,6 +399,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Weathered Limestone Pillar",
"block.create.weighted_ejector": "Weighted Ejector",
"block.create.white_sail": "White Sail",
"block.create.white_seat": "White Seat",
"block.create.white_valve_handle": "White Valve Handle",
@ -1026,6 +1027,10 @@
"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.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.inverted": "does not contain %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.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "Target Selected",
"create.weighted_ejector.target_not_valid": "Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "Round Robin",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1504",
"_": "Missing Localizations: 1514",
"_": "->------------------------] Game Elements [------------------------<-",
@ -7,8 +7,8 @@
"block.create.acacia_window_pane": "Akazienholzfensterscheibe",
"block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe",
"block.create.adjustable_crate": "Verstellbare Kiste",
"block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker",
"block.create.adjustable_repeater": "Verstellbarer Verstärker",
"block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker",
"block.create.adjustable_repeater": "Verstellbarer Verstärker",
"block.create.analog_lever": "Analoger Schalter",
"block.create.andesite_belt_funnel": "Riementrichter aus Andesit",
"block.create.andesite_bricks": "Andesitziegel",
@ -22,9 +22,9 @@
"block.create.andesite_cobblestone_wall": "Andesitbruchsteinmauer",
"block.create.andesite_encased_shaft": "Andesitummantelte Welle",
"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.basin": "Behälter",
"block.create.basin": "Behälter",
"block.create.belt": "Mechanischer Riemen",
"block.create.birch_window": "Birkenholzfenster",
"block.create.birch_window_pane": "Birkenholzfensterscheibe",
@ -45,12 +45,12 @@
"block.create.brown_seat": "Brauner Sitz",
"block.create.brown_valve_handle": "Brauner Ventilgriff",
"block.create.cart_assembler": "Lohrenmonteur",
"block.create.chiseled_dark_scoria": "Gemeißelte dunkle Schlacke",
"block.create.chiseled_dolomite": "Gemeißeltes Dolomit",
"block.create.chiseled_gabbro": "Gemeißeltes Gabbro",
"block.create.chiseled_limestone": "Gemeißelter Kalkstein",
"block.create.chiseled_scoria": "Gemeißelte Schlacke",
"block.create.chiseled_weathered_limestone": "Gemeißelter verwitterter Kalkstein",
"block.create.chiseled_dark_scoria": "Gemeißelte dunkle Schlacke",
"block.create.chiseled_dolomite": "Gemeißeltes Dolomit",
"block.create.chiseled_gabbro": "Gemeißeltes Gabbro",
"block.create.chiseled_limestone": "Gemeißelter Kalkstein",
"block.create.chiseled_scoria": "Gemeißelte Schlacke",
"block.create.chiseled_weathered_limestone": "Gemeißelter verwitterter Kalkstein",
"block.create.chocolate": "Schokolade",
"block.create.chute": "Rinne",
"block.create.clockwork_bearing": "Uhrwerk-Lager",
@ -65,16 +65,16 @@
"block.create.copper_tiles": "Kupferfliesen",
"block.create.copper_valve_handle": "Kupfer Ventilgriff",
"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.crimson_window": "UNLOCALIZED: Crimson Window",
"block.create.crimson_window_pane": "UNLOCALIZED: Crimson Window Pane",
"block.create.crushing_wheel": "Mahlwerkrad",
"block.create.crushing_wheel_controller": "Mahlwerkrad Steurung",
"block.create.cuckoo_clock": "Kuckucksuhr",
"block.create.cyan_sail": "Türkises Segel",
"block.create.cyan_seat": "Türkiser Sitz",
"block.create.cyan_valve_handle": "Türkiser Ventilgriff",
"block.create.cyan_sail": "Türkises Segel",
"block.create.cyan_seat": "Türkiser Sitz",
"block.create.cyan_valve_handle": "Türkiser Ventilgriff",
"block.create.dark_oak_window": "Schwarzeichenholzfenster",
"block.create.dark_oak_window_pane": "Schwarzeichenholzfensterscheibe",
"block.create.dark_scoria": "Dunkle Schlacke",
@ -86,8 +86,8 @@
"block.create.dark_scoria_cobblestone_slab": "Dunkle Schlackebruchsteinstufe",
"block.create.dark_scoria_cobblestone_stairs": "Dunkle Schlackebruchsteintreppe",
"block.create.dark_scoria_cobblestone_wall": "Dunkle Schlackebruchsteinmauer",
"block.create.dark_scoria_pillar": "Dunkle Schlackesäule",
"block.create.deployer": "Einsatzgerät",
"block.create.dark_scoria_pillar": "Dunkle Schlackesäule",
"block.create.deployer": "Einsatzgerät",
"block.create.depot": "Depot",
"block.create.diorite_bricks": "Dioritziegel",
"block.create.diorite_bricks_slab": "Dioritziegelstufe",
@ -97,7 +97,7 @@
"block.create.diorite_cobblestone_slab": "Dioritbruchsteinstufe",
"block.create.diorite_cobblestone_stairs": "Dioritbruchsteintreppe",
"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_bricks": "Dolomitziegel",
"block.create.dolomite_bricks_slab": "Dolomitziegelstufe",
@ -107,9 +107,9 @@
"block.create.dolomite_cobblestone_slab": "Dolomitbruchsteinstufe",
"block.create.dolomite_cobblestone_stairs": "Dolomitbruchsteintreppe",
"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_fan": "Ummantelter Lüfter",
"block.create.encased_fan": "Ummantelter Lüfter",
"block.create.encased_fluid_pipe": "Ummanteltes Rohr",
"block.create.fancy_andesite_bricks": "Schicke Andesitziegel",
"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_stairs": "Schicke dunkle Schlackenziegeltreppe",
"block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer",
"block.create.fancy_diorite_bricks": "Schöne Dioritziegel",
"block.create.fancy_diorite_bricks_slab": "Schöne Dioritziegelstufe",
"block.create.fancy_diorite_bricks_stairs": "Schöne Dioritziegeltreppe",
"block.create.fancy_diorite_bricks_wall": "Schöne Dioritziegelmauer",
"block.create.fancy_dolomite_bricks": "Schöne Dolomitziegel",
"block.create.fancy_dolomite_bricks_slab": "Schöne Dolomitziegelstufe",
"block.create.fancy_dolomite_bricks_stairs": "Schöne Dolomitziegeltreppe",
"block.create.fancy_dolomite_bricks_wall": "Schöne Dolomitziegelmauer",
"block.create.fancy_gabbro_bricks": "Schöne Gabelsteinziegel",
"block.create.fancy_gabbro_bricks_slab": "Schöne Gabelsteinziegelstufe",
"block.create.fancy_gabbro_bricks_stairs": "Schöne Gabelsteinziegeltreppe",
"block.create.fancy_gabbro_bricks_wall": "Schöne Gabelsteinziegelmauer",
"block.create.fancy_granite_bricks": "Schöne Granitziegel",
"block.create.fancy_granite_bricks_slab": "Schöne Granitziegelstufe",
"block.create.fancy_granite_bricks_stairs": "Schöne Granitziegeltreppe",
"block.create.fancy_granite_bricks_wall": "Schöne Granitziegelmauer",
"block.create.fancy_limestone_bricks": "Schöne Kalksteinziegel",
"block.create.fancy_limestone_bricks_slab": "Schöne Kalksteinziegelstufe",
"block.create.fancy_limestone_bricks_stairs": "Schöne Kalksteinziegeltreppe",
"block.create.fancy_limestone_bricks_wall": "Schöne Kalksteinziegelmauer",
"block.create.fancy_scoria_bricks": "Schöne Schlackenziegel",
"block.create.fancy_scoria_bricks_slab": "Schöne Schlackenziegelstufe",
"block.create.fancy_scoria_bricks_stairs": "Schöne Schlackenziegeltreppe",
"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_slab": "Schöne Verwitterte Kalksteinziegelstufe",
"block.create.fancy_weathered_limestone_bricks_stairs": "Schöne Verwitterte Kalksteinziegeltreppe",
"block.create.fancy_weathered_limestone_bricks_wall": "Schöne Verwitterte Kalksteinziegelmauer",
"block.create.fluid_pipe": "Flüssigkeitsrohr",
"block.create.fluid_tank": "Flüssigkeitstank",
"block.create.fluid_valve": "Flüssigkeitsventil",
"block.create.fancy_diorite_bricks": "Schöne Dioritziegel",
"block.create.fancy_diorite_bricks_slab": "Schöne Dioritziegelstufe",
"block.create.fancy_diorite_bricks_stairs": "Schöne Dioritziegeltreppe",
"block.create.fancy_diorite_bricks_wall": "Schöne Dioritziegelmauer",
"block.create.fancy_dolomite_bricks": "Schöne Dolomitziegel",
"block.create.fancy_dolomite_bricks_slab": "Schöne Dolomitziegelstufe",
"block.create.fancy_dolomite_bricks_stairs": "Schöne Dolomitziegeltreppe",
"block.create.fancy_dolomite_bricks_wall": "Schöne Dolomitziegelmauer",
"block.create.fancy_gabbro_bricks": "Schöne Gabelsteinziegel",
"block.create.fancy_gabbro_bricks_slab": "Schöne Gabelsteinziegelstufe",
"block.create.fancy_gabbro_bricks_stairs": "Schöne Gabelsteinziegeltreppe",
"block.create.fancy_gabbro_bricks_wall": "Schöne Gabelsteinziegelmauer",
"block.create.fancy_granite_bricks": "Schöne Granitziegel",
"block.create.fancy_granite_bricks_slab": "Schöne Granitziegelstufe",
"block.create.fancy_granite_bricks_stairs": "Schöne Granitziegeltreppe",
"block.create.fancy_granite_bricks_wall": "Schöne Granitziegelmauer",
"block.create.fancy_limestone_bricks": "Schöne Kalksteinziegel",
"block.create.fancy_limestone_bricks_slab": "Schöne Kalksteinziegelstufe",
"block.create.fancy_limestone_bricks_stairs": "Schöne Kalksteinziegeltreppe",
"block.create.fancy_limestone_bricks_wall": "Schöne Kalksteinziegelmauer",
"block.create.fancy_scoria_bricks": "Schöne Schlackenziegel",
"block.create.fancy_scoria_bricks_slab": "Schöne Schlackenziegelstufe",
"block.create.fancy_scoria_bricks_stairs": "Schöne Schlackenziegeltreppe",
"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_slab": "Schöne Verwitterte Kalksteinziegelstufe",
"block.create.fancy_weathered_limestone_bricks_stairs": "Schöne Verwitterte Kalksteinziegeltreppe",
"block.create.fancy_weathered_limestone_bricks_wall": "Schöne Verwitterte Kalksteinziegelmauer",
"block.create.fluid_pipe": "Flüssigkeitsrohr",
"block.create.fluid_tank": "Flüssigkeitstank",
"block.create.fluid_valve": "Flüssigkeitsventil",
"block.create.flywheel": "Schwungrad",
"block.create.framed_glass": "Gerahmtes Glas",
"block.create.framed_glass_pane": "Gerahmte Glasscheibe",
@ -163,7 +163,7 @@
"block.create.gabbro_cobblestone_slab": "Gabelsteinbruchstein",
"block.create.gabbro_cobblestone_stairs": "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_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Getriebe",
@ -177,13 +177,13 @@
"block.create.granite_cobblestone_slab": "Granitbruchsteinstufe",
"block.create.granite_cobblestone_stairs": "Granitbruchtreppe",
"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_seat": "Grauer Sitz",
"block.create.gray_valve_handle": "Grauer Ventilgriff",
"block.create.green_sail": "Grünes Segel",
"block.create.green_seat": "Grüner Sitz",
"block.create.green_valve_handle": "Grüner Ventilgriff",
"block.create.green_sail": "Grünes Segel",
"block.create.green_seat": "Grüner Sitz",
"block.create.green_valve_handle": "Grüner Ventilgriff",
"block.create.hand_crank": "Handkurbel",
"block.create.honey": "Honig",
"block.create.horizontal_framed_glass": "Horizontal Gerahmes Glas",
@ -192,7 +192,7 @@
"block.create.item_drain": "Abfluss",
"block.create.jungle_window": "Tropenholzfenster",
"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_dark_scoria": "Geschichtete Dunkle Schlacke",
"block.create.layered_diorite": "Geschichteter Diorit",
@ -208,9 +208,9 @@
"block.create.light_gray_sail": "Hellgraues Segel",
"block.create.light_gray_seat": "Hellgrauer Sitz",
"block.create.light_gray_valve_handle": "Hellgrauer Ventilgriff",
"block.create.lime_sail": "Hellgrünes Segel",
"block.create.lime_seat": "Hellgrüner Sitz",
"block.create.lime_valve_handle": "Hellgrüner Ventilgriff",
"block.create.lime_sail": "Hellgrünes Segel",
"block.create.lime_seat": "Hellgrüner Sitz",
"block.create.lime_valve_handle": "Hellgrüner Ventilgriff",
"block.create.limesand": "Kalksand",
"block.create.limestone": "Kalkstein",
"block.create.limestone_bricks": "Kalksteinziegel",
@ -221,8 +221,8 @@
"block.create.limestone_cobblestone_slab": "Kalkbruchsteinstufe",
"block.create.limestone_cobblestone_stairs": "Kalkbruchsteintreppe",
"block.create.limestone_cobblestone_wall": "Kalkbruchsteinmauer",
"block.create.limestone_pillar": "Kalksteinsäule",
"block.create.linear_chassis": "Schubgerüst",
"block.create.limestone_pillar": "Kalksteinsäule",
"block.create.linear_chassis": "Schubgerüst",
"block.create.lit_blaze_burner": "Aktiver Lohenbrenner",
"block.create.magenta_sail": "Magenta Segel",
"block.create.magenta_seat": "Magenta Sitz",
@ -238,7 +238,7 @@
"block.create.mechanical_plough": "Mechanischer Pflug",
"block.create.mechanical_press": "Mechanische Presse",
"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.millstone": "Mahlstein",
"block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor",
@ -310,7 +310,7 @@
"block.create.pink_sail": "Rosa Segel",
"block.create.pink_seat": "Rosa Sitz",
"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_slab": "UNLOCALIZED: Polished Dark Scoria Slab",
"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_toggle_latch": "UNLOCALIZED: Powered Toggle Latch",
"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_seat": "UNLOCALIZED: Purple Seat",
"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_seat": "UNLOCALIZED: Red Seat",
"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_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule",
"block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -466,7 +467,7 @@
"item.create.goggles": "UNLOCALIZED: Engineer's Goggles",
"item.create.golden_sheet": "UNLOCALIZED: Golden Sheet",
"item.create.handheld_blockzapper": "Blockpistole",
"item.create.handheld_worldshaper": "Geländeformer",
"item.create.handheld_worldshaper": "Geländeformer",
"item.create.honey_bucket": "Honigeimer",
"item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple",
"item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit",
@ -486,12 +487,12 @@
"item.create.shadow_steel": "UNLOCALIZED: Shadow Steel",
"item.create.super_glue": "Superkleber",
"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.wand_of_symmetry": "Symmetriestab",
"item.create.wheat_flour": "Weizenmehl",
"item.create.whisk": "UNLOCALIZED: Whisk",
"item.create.wrench": "Schraubenschlüssel",
"item.create.wrench": "Schraubenschlüssel",
"item.create.zinc_ingot": "Zinkbarren",
"item.create.zinc_nugget": "Zinkklumpen",
@ -501,14 +502,14 @@
"advancement.create.root": "Willkommen zu Create",
"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.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.desc": "Gucke deinem erstem beweglichen Teil beim drehen zu.",
"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.overstressed": "Ãœberfordert",
"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.overstressed": "Überfordert",
"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.tunnel": "UNLOCALIZED: Take cover!",
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.",
@ -666,10 +667,10 @@
"itemGroup.create.palettes": "Create Paletten",
"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.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert",
"death.attack.create.mechanical_saw": "%1$s wurde zersägt",
"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.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt",
"create.block.deployer.damage_source_name": "einem Finger",
@ -689,7 +690,7 @@
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
"create.recipe.packing": "UNLOCALIZED: Compacting",
"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.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting",
"create.recipe.block_cutting": "UNLOCALIZED: Block Cutting",
@ -700,9 +701,9 @@
"create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout",
"create.recipe.draining": "UNLOCALIZED: Item Draining",
"create.recipe.processing.chance": "Chance: %1$s%%",
"create.recipe.heat_requirement.none": "Keine 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.none": "Keine Hitze benötigt",
"create.recipe.heat_requirement.heated": "Wenig Hitze benötigt",
"create.recipe.heat_requirement.superheated": "Viel Hitze benötigt",
"create.generic.range": "Reichweite",
"create.generic.radius": "Radius",
@ -710,32 +711,32 @@
"create.generic.height": "UNLOCALIZED: Height",
"create.generic.length": "UNLOCALIZED: Length",
"create.generic.speed": "Geschwindigkeit",
"create.generic.delay": "Verzögerung",
"create.generic.delay": "Verzögerung",
"create.generic.unit.ticks": "Ticks",
"create.generic.unit.seconds": "Sekunden",
"create.generic.unit.minutes": "Minuten",
"create.generic.unit.rpm": "RPM",
"create.generic.unit.stress": "su",
"create.generic.unit.degrees": "°",
"create.generic.unit.degrees": "°",
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Uhrzeigersinn",
"create.generic.counter_clockwise": "Gegen-Uhrzeigersinn",
"create.action.scroll": "Wechseln",
"create.action.confirm": "Bestätigen",
"create.action.confirm": "Bestätigen",
"create.action.abort": "Abbrechen",
"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.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)",
"create.gui.scrollInput.defaultTitle": "Wähle eine Option:",
"create.gui.scrollInput.scrollToModify": "Mausrad zum Ändern",
"create.gui.scrollInput.defaultTitle": "Wähle eine Option:",
"create.gui.scrollInput.scrollToModify": "Mausrad zum Ändern",
"create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount",
"create.gui.scrollInput.scrollToSelect": "Mausrad zum Auswählen",
"create.gui.scrollInput.shiftScrollsFaster": "Shift zum schnelleren Auswählen",
"create.gui.scrollInput.scrollToSelect": "Mausrad zum Auswählen",
"create.gui.scrollInput.shiftScrollsFaster": "Shift zum schnelleren Auswählen",
"create.gui.toolmenu.focusKey": "Halte [%1$s] zum Fokussieren",
"create.gui.toolmenu.cycle": "[Mausrad] zum Wechseln",
"create.gui.symmetryWand.mirrorType": "Spiegeln",
@ -756,7 +757,7 @@
"create.gui.blockzapper.searchDiagonal": "Diagonalen folgen",
"create.gui.blockzapper.searchFuzzy": "Materialgrenzen ignorieren",
"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.pattern.solid": "Fest",
"create.gui.blockzapper.pattern.checkered": "Schachbrett",
@ -786,15 +787,15 @@
"create.blockzapper.usingBlock": "Auswahl: %1$s",
"create.blockzapper.componentUpgrades": "Bauteil-Upgrades:",
"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.retriever": "Empfänger",
"create.blockzapper.component.retriever": "Empfänger",
"create.blockzapper.component.scope": "Fernrohr",
"create.blockzapper.componentTier.none": "Nichts",
"create.blockzapper.componentTier.brass": "Messing",
"create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic",
"create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen",
"create.blockzapper.empty": "Keine Blöcke übrig!",
"create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen",
"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.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks",
@ -821,7 +822,7 @@
"create.logistics.filter": "Filter",
"create.logistics.recipe_filter": "Rezeptfilter",
"create.logistics.fluid_filter": "Flüssigkeitsfilter",
"create.logistics.fluid_filter": "Flüssigkeitsfilter",
"create.logistics.firstFrequency": "Freq. #1",
"create.logistics.secondFrequency": "Freq. #2",
"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_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.secondPos": "Zweite Position festgelegt.",
"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.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Mein Bauplan",
"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.rotation": "Rotation",
"create.schematic.rotation.none": "Nein",
"create.schematic.rotation.cw90": "90° im Uhrzeigersinn",
"create.schematic.rotation.cw180": "180° im Uhrzeigersinn",
"create.schematic.rotation.cw270": "270° im Uhrzeigersinn",
"create.schematic.rotation.cw90": "90° im Uhrzeigersinn",
"create.schematic.rotation.cw180": "180° im Uhrzeigersinn",
"create.schematic.rotation.cw270": "270° im Uhrzeigersinn",
"create.schematic.mirror": "Spiegeln",
"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.tool.deploy": "Positionieren",
"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.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.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.1": "Zeig auf das Schema und benutze [Strg]-Mausrad.",
"create.schematic.tool.move.description.2": "",
@ -916,52 +917,52 @@
"create.schematic.tool.movey.description.2": "",
"create.schematic.tool.movey.description.3": "",
"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.3": "",
"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.2": "Dieses Werkzeug ist nur für den Kreativ-Modus.",
"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.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.2": "",
"create.schematic.tool.flip.description.3": "",
"create.schematics.synchronizing": "Synchronisation...",
"create.schematics.uploadTooLarge": "Dein Bauplan ist zu groß.",
"create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:",
"create.schematics.uploadTooLarge": "Dein Bauplan ist zu groß.",
"create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.title": "Bauplantisch",
"create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne",
"create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne",
"create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne",
"create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne",
"create.gui.schematicTable.uploading": "Hochladen...",
"create.gui.schematicTable.finished": "Hochgeladen!",
"create.gui.schematicannon.title": "Bauplankanone",
"create.gui.schematicannon.listPrinter": "Materiallistendruck",
"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.optionEnabled": "Aktiviert",
"create.gui.schematicannon.optionDisabled": "Deaktiviert",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"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.replaceWithAny": "Feste Blöcke immer 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.dontReplaceSolid": "Feste Blöcke nicht 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.replaceWithEmpty": "Feste Blöcke mit Leere ersetzen",
"create.gui.schematicannon.option.skipMissing": "Fehlende Blöcke 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.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.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.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.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.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.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.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.schematicannon.status.idle": "Aus",
"create.schematicannon.status.ready": "Bereit",
@ -973,11 +974,11 @@
"create.schematicannon.status.targetNotLoaded": "Kein Block geladen",
"create.schematicannon.status.targetOutsideRange": "Ziel zu weit weg",
"create.schematicannon.status.searching": "Suchen",
"create.schematicannon.status.skipping": "Ãœberspringen",
"create.schematicannon.status.skipping": "Überspringen",
"create.schematicannon.status.missingBlock": "Fehlender Block:",
"create.schematicannon.status.placing": "Platzieren",
"create.schematicannon.status.clearing": "Blöcke entfernen",
"create.schematicannon.status.schematicInvalid": "Bauplan ungültig",
"create.schematicannon.status.clearing": "Blöcke entfernen",
"create.schematicannon.status.schematicInvalid": "Bauplan ungültig",
"create.schematicannon.status.schematicNotPlaced": "Bauplan nicht positioniert",
"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.has_enchant": "UNLOCALIZED: is 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.inverted": "UNLOCALIZED: does not contain %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.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1161,8 +1172,8 @@
"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.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.control1": "Wenn Strg gedrückt ist",
"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.action1": "wird diese Steuerung gezeigt.",
"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_.",
"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.behaviour1": "Bleibt aktiv",
"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.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.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.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.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.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.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.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.action3": "UNLOCALIZED: Opens the _Configuration Interface_",
"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": "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.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.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.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.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.behaviour1": "Kann mit den Werkzeugen auf dem Bildschirm positioniert werden",
"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.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.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.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.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.action2": "Wählt Punkte _mitten_ _in_ _der_ _Luft._ _Scrolle,_ um die Distanz anzupassen.",
"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.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.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.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.action1": "Ãffnet das _Menü_",
"block.create.schematicannon.tooltip.action1": "Öffnet das _Menü_",
"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.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.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.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.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": "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.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.summary": "_Leitet_ _Rotation_ in _vier_ _Richtungen_ weiter. Kehrt geradlinige Verbindungen um.",
"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.behaviour1": "_Kehrt_ die ausgehende Drehrichtung _um._",
"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.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.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.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.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.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.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.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.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.behaviour1": "Liefert _Rotationsenergie_ (muss vertikal ausgerichtet sein)",
"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.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.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.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.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.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.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.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.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.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.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.behaviour2": "Presst _automatisch_ alle auf dem Riemen vorbeigeführten Gegenstände zusammen.",
"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.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.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.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.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.summary": "Wird benutzt, um die Reichweite von _Mechanischen_ _Kolben_ zu erhöhen.",
"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.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.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.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.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.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.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": "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.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.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.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.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.summary": "Wird für das Drehen von Strukturen mit dem _Mechanischem_ _Lager_ benutzt.",
"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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.action2": "Schaltet zwischen _Empfänger-_ und _Transmittermodus_ um.",
"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.action2": "Schaltet zwischen _Empfänger-_ und _Transmittermodus_ um.",
"block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE",
"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.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.condition1": "Wenn gegenüber einem anderen Kontakt",
"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.behaviour1": "Liefert ein _Redstone-Signal._",
"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.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.action1": "Ãffnet das _Menü_",
"block.create.adjustable_crate.tooltip.action1": "Öffnet das _Menü_",
"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.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.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.summary": "Ein einfacher Schaltkreis, um durchgehende Redstone-Signale auf eine Länge von _1_ _tick_ zu reduzieren.",
"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.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": "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_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.",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1430",
"_": "Missing Localizations: 1440",
"_": "->------------------------] Game Elements [------------------------<-",
@ -23,27 +23,27 @@
"block.create.andesite_encased_shaft": "Eje empotrado de Andesita",
"block.create.andesite_funnel": "Embudo 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.belt": "Correa",
"block.create.birch_window": "Ventana de Abedul",
"block.create.birch_window_pane": "Panel de Ventana de Abedul",
"block.create.black_sail": "Vela Negra",
"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.blue_sail": "Vela 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_block": "Bloque de Latón",
"block.create.brass_casing": "Carcasa de Latón",
"block.create.brass_encased_shaft": "Eje empotrado de Latón",
"block.create.brass_funnel": "Embudo de Latón",
"block.create.brass_tunnel": "Túnel de Latón",
"block.create.brown_sail": "Vela Café",
"block.create.brown_seat": "Asiento Café ",
"block.create.brown_valve_handle": "Manija de Válvula Café",
"block.create.brass_block": "Bloque de Latón",
"block.create.brass_casing": "Carcasa de Latón",
"block.create.brass_encased_shaft": "Eje empotrado de Latón",
"block.create.brass_funnel": "Embudo de Latón",
"block.create.brass_tunnel": "Túnel de Latón",
"block.create.brown_sail": "Vela Café",
"block.create.brown_seat": "Asiento Café ",
"block.create.brown_valve_handle": "Manija de Válvula Café",
"block.create.cart_assembler": "Ensamblador de Vagonetas",
"block.create.chiseled_dark_scoria": "Escoria Oscura Grabada",
"block.create.chiseled_dolomite": "Dolomita Grabada",
@ -57,24 +57,24 @@
"block.create.clutch": "Embrague",
"block.create.cogwheel": "Rueda Dentada",
"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_casing": "Carcasa de Cobre",
"block.create.copper_ore": "Mineral de Cobre",
"block.create.copper_shingles": "Techado 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_fluid_tank": "Tanque de Fluido del Creativo",
"block.create.creative_motor": "Motor del Creativo",
"block.create.crimson_window": "Ventana Carmesí",
"block.create.crimson_window_pane": "Panel de Ventana Carmesí",
"block.create.crimson_window": "Ventana Carmesí",
"block.create.crimson_window_pane": "Panel de Ventana Carmesí",
"block.create.crushing_wheel": "Rueda Trituradora",
"block.create.crushing_wheel_controller": "UNLOCALIZED:Crushing Wheel Controller",
"block.create.cuckoo_clock": "Reloj Cuco",
"block.create.cyan_sail": "Vela 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_pane": "Panel de Ventana de Roble Oscuro",
"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_pillar": "Pilar de Escoria Oscura",
"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_slab": "Losa 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_wall": "Pared de Piedra Labrada 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_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_slab": "Losa 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_stairs": "Escaleras 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_valve": "Válvula de Fluidos",
"block.create.fluid_valve": "Válvula de Fluidos",
"block.create.flywheel": "Rueda de Inercia",
"block.create.framed_glass": "Vidrio Enmarcado",
"block.create.framed_glass_pane": "Panel de Vidrio Enmarcado",
@ -166,9 +166,9 @@
"block.create.gabbro_pillar": "Pilar de Gabro",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"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.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_slab": "Losa 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.gray_sail": "Vela 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_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.honey": "Miel",
"block.create.horizontal_framed_glass": "Vidrio Enmarcado Horizontal",
@ -204,13 +204,13 @@
"block.create.layered_weathered_limestone": "Caliza Meteorizada en Capas",
"block.create.light_blue_sail": "Vela 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_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_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.limestone": "Caliza",
"block.create.limestone_bricks": "Ladrillos de Caliza",
@ -226,19 +226,19 @@
"block.create.lit_blaze_burner": "Quemador de Blaze Iluminado",
"block.create.magenta_sail": "Vela Magenta",
"block.create.magenta_seat": "Asiento Magenta",
"block.create.magenta_valve_handle": "Manija de Válvula Magenta",
"block.create.mechanical_arm": "Brazo Mecánico",
"block.create.mechanical_bearing": "Rodamiento Mecánico",
"block.create.mechanical_crafter": "Crafter Mecánico",
"block.create.mechanical_drill": "Taladro Mecánico",
"block.create.mechanical_harvester": "Cosechador Mecánico",
"block.create.mechanical_mixer": "Mezcladora Mecánica",
"block.create.mechanical_piston": "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_press": "Prensa Mecánica",
"block.create.mechanical_pump": "Bomba Mecánica",
"block.create.mechanical_saw": "Sierra Mecánica",
"block.create.magenta_valve_handle": "Manija de Válvula Magenta",
"block.create.mechanical_arm": "Brazo Mecánico",
"block.create.mechanical_bearing": "Rodamiento Mecánico",
"block.create.mechanical_crafter": "Crafter Mecánico",
"block.create.mechanical_drill": "Taladro Mecánico",
"block.create.mechanical_harvester": "Cosechador Mecánico",
"block.create.mechanical_mixer": "Mezcladora Mecánica",
"block.create.mechanical_piston": "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_press": "Prensa Mecánica",
"block.create.mechanical_pump": "Bomba Mecánica",
"block.create.mechanical_saw": "Sierra Mecánica",
"block.create.metal_bracket": "Soporte de Metal",
"block.create.millstone": "Molino",
"block.create.minecart_anchor": "Ancla de Vagonetas",
@ -259,7 +259,7 @@
"block.create.oak_window_pane": "Panel de Ventana de Roble",
"block.create.orange_sail": "Vela 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_pane": "Panel de Ventana Ornamentada",
"block.create.overgrown_andesite": "Andesita Descuidada",
@ -309,8 +309,8 @@
"block.create.paved_weathered_limestone_wall": "Pared de Caliza Meteorizada Pavimentada",
"block.create.pink_sail": "Vela Rosa",
"block.create.pink_seat": "Asiento 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.pink_valve_handle": "Manija de Válvula Rosa",
"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_slab": "Losa 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.powered_latch": "Cerradura Electrica",
"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.purple_sail": "Vela Morada",
"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.red_sail": "Vela Roja",
"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_link": "Enlace de Redstone",
"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_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.schematic_table": "Mesa de Esquemas",
"block.create.schematicannon": "Esquemacañon",
"block.create.schematicannon": "Esquemacañon",
"block.create.scoria": "Escoria",
"block.create.scoria_bricks": "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.secondary_linear_chassis": "Chasis Lineal Secundario",
"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.smart_chute": "UNLOCALIZED: Smart Chute",
"block.create.smart_fluid_pipe": "Tubería de Fluidos Inteligente",
"block.create.speedometer": "Velocímetro",
"block.create.smart_fluid_pipe": "Tubería de Fluidos Inteligente",
"block.create.speedometer": "Velocímetro",
"block.create.spout": "Canaleta",
"block.create.spruce_window": "Ventana de Abeto",
"block.create.spruce_window_pane": "Panel de Ventana de Abeto",
"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.stressometer": "Estresómetro",
"block.create.stressometer": "Estresómetro",
"block.create.tiled_glass": "Vidrio de Azulejos",
"block.create.tiled_glass_pane": "Panel de Vidrio de Azulejos",
"block.create.turntable": "Mesa Giratoria",
@ -389,7 +389,7 @@
"block.create.vertical_framed_glass_pane": "Panel de Vidrio Enmarcado Vertical",
"block.create.warped_window": "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_bricks": "Ladrillos 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_wall": "Pared de Piedra Labrada de Caliza Meteorizada",
"block.create.weathered_limestone_pillar": "Pilar de Caliza Meteorizada",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "Vela Blanca",
"block.create.white_seat": "Asiento Blanco",
"block.create.white_valve_handle": "Manija de Válvula Blanca",
"block.create.white_valve_handle": "Manija de Válvula Blanca",
"block.create.windmill_bearing": "Rodamiento de Molino de Viento",
"block.create.wooden_bracket": "Soporte de Madera",
"block.create.yellow_sail": "Vela Amarilla",
"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_ore": "Mineral de Zinc",
@ -418,31 +419,31 @@
"entity.create.super_glue": "Super Pegamento",
"fluid.create.milk": "Leche",
"fluid.create.potion": "Poción",
"fluid.create.tea": "Té del Constructor",
"fluid.create.potion": "Poción",
"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.bar_of_chocolate": "Barra de Chocolate",
"item.create.belt_connector": "Conector de Correa",
"item.create.blaze_cake": "Pastel de Blaze",
"item.create.blaze_cake_base": "Base de Pastel de Blaze",
"item.create.brass_hand": "Mano de Latón",
"item.create.brass_ingot": "Lingote de Latón",
"item.create.brass_nugget": "Pepita de Latón",
"item.create.brass_sheet": "Lámina de Latón",
"item.create.builders_tea": "Té del Constructor",
"item.create.chest_minecart_contraption": "Artefacto de Vagón con Cofre",
"item.create.brass_hand": "Mano de Latón",
"item.create.brass_ingot": "Lingote de Latón",
"item.create.brass_nugget": "Pepita de Latón",
"item.create.brass_sheet": "Lámina de Latón",
"item.create.builders_tea": "Té del Constructor",
"item.create.chest_minecart_contraption": "Artefacto de Vagón con Cofre",
"item.create.chocolate_bucket": "Cubeta de Chocolate",
"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.copper_ingot": "Lingote 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.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_gold_ore": "Mineral de Oro 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_quicksilver_ore": "Mineral de Mercurio 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_zinc_ore": "Mineral de Zinc Molido",
"item.create.deforester": "Deforestador",
"item.create.dough": "Masa",
"item.create.electron_tube": "Válvula Electrónica",
"item.create.empty_blaze_burner": "Quemador de Blaze Vacío",
"item.create.empty_schematic": "Esquema Vacío",
"item.create.electron_tube": "Válvula Electrónica",
"item.create.empty_blaze_burner": "Quemador de Blaze Vacío",
"item.create.empty_schematic": "Esquema Vacío",
"item.create.extendo_grip": "Brazo Extensor",
"item.create.filter": "Filtro",
"item.create.furnace_minecart_contraption": "Artefacto de Vagón con Horno",
"item.create.goggles": "Gafas de Protección para Ingenieros",
"item.create.golden_sheet": "Lámina de Oro",
"item.create.handheld_blockzapper": "Pistola de Manipulación de Bloques",
"item.create.handheld_worldshaper": "Pistola de Manipulación de Mundo",
"item.create.furnace_minecart_contraption": "Artefacto de Vagón con Horno",
"item.create.goggles": "Gafas de Protección para Ingenieros",
"item.create.golden_sheet": "Lámina de Oro",
"item.create.handheld_blockzapper": "Pistola de Manipulación de Bloques",
"item.create.handheld_worldshaper": "Pistola de Manipulación de Mundo",
"item.create.honey_bucket": "Cubeta de Miel",
"item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple",
"item.create.integrated_circuit": "Circuito Integrado",
"item.create.iron_sheet": "Lámina de Hierro",
"item.create.lapis_sheet": "Lámina de Lapislázuli",
"item.create.minecart_contraption": "Artefacto de Vagón",
"item.create.iron_sheet": "Lámina de Hierro",
"item.create.lapis_sheet": "Lámina de Lapislázuli",
"item.create.minecart_contraption": "Artefacto de Vagón",
"item.create.minecart_coupling": "Acoplamiento de Vagonetas",
"item.create.polished_rose_quartz": "Cuarzo Rosa Pulido",
"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.refined_radiance": "Radiancia Refinada",
"item.create.rose_quartz": "Cuarzo Rosa",
"item.create.sand_paper": "Papel de Arena",
"item.create.schematic": "Esquema",
"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.sweet_roll": "UNLOCALIZED: Sweet Roll",
"item.create.tree_fertilizer": "Fertilizador de Ã<EFBFBD>rboles",
"item.create.vertical_gearbox": "Transmisión Vertical",
"item.create.tree_fertilizer": "Fertilizador de Árboles",
"item.create.vertical_gearbox": "Transmisión Vertical",
"item.create.wand_of_symmetry": "Vara de la Simetria",
"item.create.wheat_flour": "Harina de Trigo",
"item.create.whisk": "Batidor",
@ -1027,6 +1028,10 @@
"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.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.inverted": "UNLOCALIZED: does not contain %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.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1166,105 +1177,105 @@
"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.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.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": "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.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.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.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.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.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.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.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.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.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.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.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": "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.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.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.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.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.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.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": "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.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.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.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.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.action2": "Cambia el método de división de los _túneles_ conectados.",
"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.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.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.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.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.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.summary": "Una _Tubería_ _de_ _Fluidos_ recubierta con una _Carcasa_ _de_ _Cobre_",
"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.copper_valve_handle.tooltip": "MANIJA DE VÃ<EFBFBD>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": "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.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.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.behaviour1": "Sienta al jugador en el _asiento_ . Presiona el shift izquierdo para salir del _asiento._",
"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.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.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.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": "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.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._",
"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.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.behaviour1": "_Captura_ un blaze en el objeto",
"block.create.fluid_pipe.tooltip": "TUBERÃ<EFBFBD>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": "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.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.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.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.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.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.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.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.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_ .",
@ -1274,116 +1285,116 @@
"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.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.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.behaviour2": "Cambia la ventana opcional",
"block.create.fluid_valve.tooltip": "VÃ<EFBFBD>LVULAL DE FLUIDOS",
"block.create.fluid_valve.tooltip.summary": "Detiene el flujo de fluido por una tubería.",
"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.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.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": "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.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.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.summary": "Una _tubería_ _de_ _fluidos_ con un filtro. Puede especificar que _fluidos_ pasan por ella.",
"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.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.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.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.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.summary": "Un inyector para rellenar sus _objetos_ con _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.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.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.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.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.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.summary": "Un artefacto avanzado para reubicar _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.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.action2": "Establece el criterio de comportamiento para la salida de los _objetos_ por el _Brazo_ _Mecánico._",
"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.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.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.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.behaviour1": "Se mantiene activo",
"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.control2": "Click Derecho en el aire",
"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.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.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.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.action2": "_Coloca_ o _reemplaza_ el bloque objetivo.",
"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.control3": "Click Derecho mientras se está agachado",
"item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración._",
"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.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.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.action3": "Abre la _Interfaz_ _de_ _Configuración._",
"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.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.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.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.behaviour1": "Hace crecer los árboles, sin importar el espacio entre ellos.",
"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.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.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.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.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.behaviour1": "_Controla_ el flujo de objetos según su _configuración._",
"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.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.behaviour1": "_Controla_ el flujo de objetos según su _configuración._",
"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.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.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.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.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.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_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.behaviour1": "Selecciona dos esquinas con Click Derecho.",
"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.action1": "Selecciona una esquina / confirma el guardado.",
"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.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.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.action3": "_Reinicia_ y quita la selección.",
"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.control1": "Click Derecho sobre él",
"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.action1": "Abre la interfaz",
"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.condition1": "Cuando se le da 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.behaviour1": "Carga un archivo elegido de su carpeta de esquemas.",
"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.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.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.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.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.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.behaviour1": "_Invierte_ la rotación de salida.",
"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.behaviour1": "_Invierte_ la rotación de salida.",
"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.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.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.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.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.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.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.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.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.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.action2": "_Reinicia_ la primera posición seleccionada para 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.action2": "_Reinicia_ la primera posición seleccionada para la correa.",
"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.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.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.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.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.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.action2": "_Desmonta_ los _componentes_ _cinéticos_ y los coloca de nuevo en _tú_ _inventario._",
"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.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.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.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1703",
"_": "Missing Localizations: 1713",
"_": "->------------------------] Game Elements [------------------------<-",
@ -400,6 +400,7 @@
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Verweerde Kalksteen Pilaar",
"block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector",
"block.create.white_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -737,11 +738,11 @@
"create.gui.scrollInput.scrollToSelect": "Scroll om te selecteren",
"create.gui.scrollInput.shiftScrollsFaster": "Shift om sneller te Scrollen",
"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.orientation": "Orientatie",
"create.symmetry.mirror.plane": "Spiegel één keer",
"create.symmetry.mirror.plane": "Spiegel één keer",
"create.symmetry.mirror.doublePlane": "Rechthoekig",
"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.has_enchant": "UNLOCALIZED: is 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.inverted": "UNLOCALIZED: does not contain %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.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1325,7 +1336,7 @@
"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.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.action2": "_Verwijderd_ de actieve Spiegel",
"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.",
"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.action1": "Opent de _Interface_",
@ -1447,7 +1458,7 @@
"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.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.action2": "_Reset_ de eerste geselecteerde positie van de Transportband",
@ -1508,7 +1519,7 @@
"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.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.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.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.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.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.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.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.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.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.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",
@ -1699,7 +1710,7 @@
"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.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.action2": "Schakelt tussen _ontvanger_ en _zender_modus.",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1769",
"_": "Missing Localizations: 1779",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,7 @@
"block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar",
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"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_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_sail": "UNLOCALIZED: Black Sail",
@ -166,8 +166,8 @@
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Caixa de Transmissão",
"block.create.gearshift": "Câmbio",
"block.create.gearbox": "Caixa de Transmissão",
"block.create.gearshift": "Câmbio",
"block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe",
"block.create.granite_bricks": "Tijolos de Granito",
"block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab",
@ -211,32 +211,32 @@
"block.create.lime_sail": "UNLOCALIZED: Lime Sail",
"block.create.lime_seat": "UNLOCALIZED: Lime Seat",
"block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle",
"block.create.limesand": "Areia Calcária",
"block.create.limestone": "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_stairs": "Escadas de Tijolos de Calcário",
"block.create.limestone_bricks_wall": "Muro de Tijolos de Calcário",
"block.create.limesand": "Areia Calcária",
"block.create.limestone": "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_stairs": "Escadas 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_slab": "UNLOCALIZED: Limestone Cobblestone Slab",
"block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs",
"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.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner",
"block.create.magenta_sail": "UNLOCALIZED: Magenta Sail",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle",
"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_drill": "Furadeira Mecânica",
"block.create.mechanical_harvester": "Coletor Mecânico",
"block.create.mechanical_drill": "Furadeira Mecânica",
"block.create.mechanical_harvester": "Coletor Mecânico",
"block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer",
"block.create.mechanical_piston": "Pistão Mecânico",
"block.create.mechanical_piston_head": "Cabeça do 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_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_saw": "UNLOCALIZED: Mechanical Saw",
"block.create.metal_bracket": "UNLOCALIZED: Metal Bracket",
@ -310,7 +310,7 @@
"block.create.pink_sail": "UNLOCALIZED: Pink Sail",
"block.create.pink_seat": "UNLOCALIZED: Pink Seat",
"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_slab": "UNLOCALIZED: Polished Dark Scoria Slab",
"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_stairs": "UNLOCALIZED: Polished Gabbro Stairs",
"block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall",
"block.create.polished_limestone": "Calcário Polido",
"block.create.polished_limestone_slab": "Lajotas de Calcário Polido",
"block.create.polished_limestone": "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_wall": "UNLOCALIZED: Polished Limestone Wall",
"block.create.polished_scoria": "UNLOCALIZED: Polished Scoria",
"block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab",
"block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs",
"block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall",
"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": "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_wall": "UNLOCALIZED: Polished Weathered Limestone Wall",
"block.create.portable_fluid_interface": "UNLOCALIZED: Portable Fluid Interface",
@ -344,12 +344,12 @@
"block.create.purple_sail": "UNLOCALIZED: Purple Sail",
"block.create.purple_seat": "UNLOCALIZED: Purple Seat",
"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_seat": "UNLOCALIZED: Red Seat",
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
"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.reinforced_rail": "UNLOCALIZED: Reinforced Rail",
"block.create.rope": "UNLOCALIZED: Rope",
@ -379,27 +379,28 @@
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"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.stressometer": "UNLOCALIZED: Stressometer",
"block.create.tiled_glass": "Vidro Entalhado",
"block.create.tiled_glass_pane": "Vidraça Entalhada",
"block.create.turntable": "Mesa giratória",
"block.create.tiled_glass_pane": "Vidraça Entalhada",
"block.create.turntable": "Mesa giratória",
"block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane",
"block.create.warped_window": "UNLOCALIZED: Warped Window",
"block.create.warped_window_pane": "UNLOCALIZED: Warped Window Pane",
"block.create.water_wheel": "Roda de Ã<EFBFBD>gua",
"block.create.weathered_limestone": "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_stairs": "Escadas de Tijolos de Calcário Resistido",
"block.create.weathered_limestone_bricks_wall": "Muro de Tijolos de Calcário Resistido",
"block.create.water_wheel": "Roda de Água",
"block.create.weathered_limestone": "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_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_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone",
"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_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_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -424,7 +425,7 @@
"item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy",
"item.create.attribute_filter": "UNLOCALIZED: Attribute Filter",
"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_base": "UNLOCALIZED: Blaze Cake Base",
"item.create.brass_hand": "UNLOCALIZED: Brass Hand",
@ -465,7 +466,7 @@
"item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption",
"item.create.goggles": "UNLOCALIZED: Engineer's Goggles",
"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.honey_bucket": "UNLOCALIZED: Honey Bucket",
"item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple",
@ -476,7 +477,7 @@
"item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling",
"item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz",
"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.refined_radiance": "UNLOCALIZED: Refined Radiance",
"item.create.rose_quartz": "Quartzo Rosa",
@ -486,7 +487,7 @@
"item.create.shadow_steel": "UNLOCALIZED: Shadow Steel",
"item.create.super_glue": "UNLOCALIZED: Super Glue",
"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.wand_of_symmetry": "Varinha de Simetria",
"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.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.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.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_blasting": "UNLOCALIZED: Bulk Blasting",
"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.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting",
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
@ -694,7 +695,7 @@
"create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting",
"create.recipe.block_cutting": "UNLOCALIZED: Block 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.mystery_conversion": "UNLOCALIZED: Mysterious Conversion",
"create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout",
@ -704,7 +705,7 @@
"create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated",
"create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated",
"create.generic.range": "Ã<EFBFBD>rea",
"create.generic.range": "Área",
"create.generic.radius": "Raio",
"create.generic.width": "UNLOCALIZED: Width",
"create.generic.height": "UNLOCALIZED: Height",
@ -731,7 +732,7 @@
"create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (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.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount",
"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.cycle": "[SCROLL] para Circular",
"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.doublePlane": "Retangular",
@ -748,17 +749,17 @@
"create.orientation.orthogonal": "Ortogonal",
"create.orientation.diagonal": "Diagonal",
"create.orientation.horizontal": "Horizontal",
"create.orientation.alongZ": "Através de Z",
"create.orientation.alongX": "Através de X",
"create.orientation.alongZ": "Através de Z",
"create.orientation.alongX": "Através de X",
"create.gui.blockzapper.title": "Blockzapper Portátil",
"create.gui.blockzapper.replaceMode": "Modo de Substituição",
"create.gui.blockzapper.title": "Blockzapper Portátil",
"create.gui.blockzapper.replaceMode": "Modo de Substituição",
"create.gui.blockzapper.searchDiagonal": "Seguir as Diagonais",
"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.patternSection": "Padrões",
"create.gui.blockzapper.pattern.solid": "Sólido",
"create.gui.blockzapper.patternSection": "Padrões",
"create.gui.blockzapper.pattern.solid": "Sólido",
"create.gui.blockzapper.pattern.checkered": "Xadrez",
"create.gui.blockzapper.pattern.inversecheckered": "Xadrez invertido",
"create.gui.blockzapper.pattern.chance25": "25% de chance",
@ -793,7 +794,7 @@
"create.blockzapper.componentTier.none": "Nada",
"create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass",
"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.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.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.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.invert_signal": "UNLOCALIZED: Invert Signal",
"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.schematicAndQuill.dimensions": "Tamanho Esquema: %1$sx%2$sx%3$s",
"create.schematicAndQuill.firstPos": "Primeira posição feita.",
"create.schematicAndQuill.secondPos": "Segunda posição feita.",
"create.schematicAndQuill.firstPos": "Primeira posição feita.",
"create.schematicAndQuill.secondPos": "Segunda posição feita.",
"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.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Meu Esquema",
"create.schematicAndQuill.saved": "Salvo como %1$s",
"create.schematic.invalid": "[!] Item Inválido - Use a Mesa de Desenho no lugar",
"create.schematic.position": "Posição",
"create.schematic.rotation": "Rotação",
"create.schematic.invalid": "[!] Item Inválido - Use a Mesa de Desenho no lugar",
"create.schematic.position": "Posição",
"create.schematic.rotation": "Rotação",
"create.schematic.rotation.none": "Nada",
"create.schematic.rotation.cw90": "Sentido horário 90",
"create.schematic.rotation.cw180": "Sentido horário 180",
"create.schematic.rotation.cw270": "Sentido horário 270",
"create.schematic.rotation.cw90": "Sentido horário 90",
"create.schematic.rotation.cw180": "Sentido horário 180",
"create.schematic.rotation.cw270": "Sentido horário 270",
"create.schematic.mirror": "Espelhar",
"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.tool.deploy": "Concluir",
"create.schematic.tool.move": "Mover XZ",
@ -904,9 +905,9 @@
"create.schematic.tool.print": "Imprimir",
"create.schematic.tool.flip": "Virar",
"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.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.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.3": "[Ctrl]-Rolar para mudar a distância.",
"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.2": "",
@ -920,17 +921,17 @@
"create.schematic.tool.rotate.description.2": "",
"create.schematic.tool.rotate.description.3": "",
"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.2": "Esta ferramenta é para o Modo Criativo apenas.",
"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.3": "",
"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.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.2": "",
"create.schematic.tool.flip.description.3": "",
"create.schematics.synchronizing": "Sincronizando...",
"create.schematics.uploadTooLarge": "Seu esquema é muito grande",
"create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:",
"create.schematics.uploadTooLarge": "Seu esquema é muito grande",
"create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
@ -938,47 +939,47 @@
"create.gui.schematicTable.availableSchematics": "UNLOCALIZED: Available Schematics",
"create.gui.schematicTable.noSchematics": "UNLOCALIZED: No Schematics Saved",
"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.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.shotsRemainingWithBackup": "Com backup: %1$s",
"create.gui.schematicannon.optionEnabled": "Habilitado Atualmente",
"create.gui.schematicannon.optionDisabled": "Desabilitado Atualmente",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Não 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.replaceWithEmpty": "Substituir Sólidos com Vazio",
"create.gui.schematicannon.option.dontReplaceSolid": "Não 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.replaceWithEmpty": "Substituir Sólidos com Vazio",
"create.gui.schematicannon.option.skipMissing": "Pulando Blocos faltantes",
"create.gui.schematicannon.option.skipTileEntities": "Proteger Entidades Entalhadas",
"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.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.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.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.replaceWithEmpty.description": "O canhão irá limpar todos os blocos na área de trabalho, incluindo os substituídos por Ar.",
"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.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.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.schematicannon.status.idle": "Ocioso",
"create.schematicannon.status.ready": "Pronto",
"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.stopped": "Parada",
"create.schematicannon.status.noGunpowder": "UNLOCALIZED: Out of Gunpowder",
"create.schematicannon.status.targetNotLoaded": "Bloco não carregado",
"create.schematicannon.status.targetOutsideRange": "Alvo está muito Longe",
"create.schematicannon.status.targetNotLoaded": "Bloco não carregado",
"create.schematicannon.status.targetOutsideRange": "Alvo está muito Longe",
"create.schematicannon.status.searching": "Procurando",
"create.schematicannon.status.skipping": "Pulando",
"create.schematicannon.status.missingBlock": "Bloco Faltante:",
"create.schematicannon.status.placing": "Colocando",
"create.schematicannon.status.clearing": "Limpando Blocos",
"create.schematicannon.status.schematicInvalid": "Esquema Inválido",
"create.schematicannon.status.schematicNotPlaced": "Esquema não Colocado",
"create.schematicannon.status.schematicInvalid": "Esquema Inválido",
"create.schematicannon.status.schematicNotPlaced": "Esquema não Colocado",
"create.schematicannon.status.schematicExpired": "Arquivo de Esquema Expirado",
"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.has_enchant": "UNLOCALIZED: is 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.inverted": "UNLOCALIZED: does not contain %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.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.",
"create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected",
"create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)",
"create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)",
"create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]",
"create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size",
"create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available",
"create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin",
@ -1321,24 +1332,24 @@
"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.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.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.control2": "B-Direito no Ar",
"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.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.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.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.action2": "_Coloca_ ou _Substitui_ o bloco alvo.",
"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.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.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.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.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.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.condition1": "Quando Em mãos",
"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.behaviour1": "Pode ser posicionado usando as Ferramentas em Tela",
"item.create.schematic.tooltip.control1": "B-Direito enquanto Abaixado",
"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.action1": "Selecione um canto / confirmar salvamento",
"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.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.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.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.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.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.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.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.summary": "_Transmite_ _Rotação_ em _Quatro_ _direções._ Reverte conexões diretas.",
"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.gearshift.tooltip": "CÂMBIO",
"block.create.gearshift.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para eixos conectados.",
"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.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.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.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.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.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.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": "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.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.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.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.summary": "UNLOCALIZED: A configurable source of _Rotational Force_.",
"block.create.water_wheel.tooltip": "RODA DE Ã<EFBFBD>GUA",
"block.create.water_wheel.tooltip.summary": "Prove _Força_ _Rotacional_ tirada de _Correntes_ de _Ã<5F>gua_ próximas.",
"block.create.water_wheel.tooltip": "RODA DE ÁGUA",
"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.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.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.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.behaviour3": "Processa itens na frente do Bloco: _Ã<EFBFBD>gua_ alva, _Fogo_ defuma, e _Lava_ derrete o ingrediente.",
"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.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.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.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.summary": "Muda a _Força_ _Rotacional_ em uma forma refinada de Enjoo.",
"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.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.",
@ -1506,15 +1517,15 @@
"block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.",
"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.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.summary": "Um forte pistão usado para comprimir itens abaixo dele. Precisa de _Força_ _Rotacional_ constante",
"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.condition1": "Quando Ligado com Redstone",
"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.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.behaviour2": "_Automaticamente_ comprime itens que passando na Esteira.",
"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.",
@ -1579,20 +1590,20 @@
"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.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": "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.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.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.behaviour1": "Aumenta a extensão dos pistões em 1 bloco",
"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.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.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": "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.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.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.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.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.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.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.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.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.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.summary": "Nessário para rotacionar estruturas om um _Rolamento_ _Mecânico._ ",
"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.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.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.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.summary": "Um dispositivo mecânido feito para _quebrar_ _blocos._",
"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.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.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.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.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.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.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": "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.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_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.",
@ -1687,19 +1698,19 @@
"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.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.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.behaviour1": "Para de enviar _Sinal_ de _Redstone_",
"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.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": "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.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.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.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.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.behaviour1": "Provê um _Sinal_ de _Redstone_",
"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.behaviour1": "Provê um _Sinal_ de _Redstone_",
"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.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.action1": "Abre a _Interface_",
"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.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.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.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.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"),
EJECTOR_TOP = get("weighted_ejector/top"),
COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"),
COUPLING_RING = getEntity("minecart_coupling/ring"),
COUPLING_CONNECTOR = getEntity("minecart_coupling/connector")

View file

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

View file

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

View file

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

View file

@ -19,16 +19,6 @@ public class KineticData extends BasicData {
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) {
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) {
BlockPos origin = owner.renderer.getOriginCoordinate();
return setPosition((float) (x - origin.getX()),
(float) (y - origin.getY()),
(float) (z - origin.getZ()));
return 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;
}
public KineticData setColor(KineticTileEntity te) {
if (te.hasSource()) {
setColor(te.network);
}else {
setColor(0xFF, 0xFF, 0x00);
}
return this;
}
public KineticData setColor(Long l) {
if (l != null)
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 net.minecraft.block.BlockState;
import net.minecraft.util.Direction;
import net.minecraft.world.LightType;
public abstract class KineticTileInstance<T extends KineticTileEntity> extends TileEntityInstance<T> {
protected final Direction.Axis axis;
public KineticTileInstance(InstancedTileRenderer<?> modelManager, T tile) {
super(modelManager, tile);
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
}
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis) {
updateRotation(key, axis, tile.getSpeed());
protected final void updateRotation(RotatingData instance) {
updateRotation(instance, getRotationAxis(), getTileSpeed());
}
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis, float speed) {
updateRotation(key.getInstance(), axis, speed);
protected final void updateRotation(RotatingData instance, Direction.Axis axis) {
updateRotation(instance, axis, getTileSpeed());
}
protected final void updateRotation(RotatingData key, Direction.Axis axis, float speed) {
key.setRotationAxis(axis)
protected final void updateRotation(RotatingData instance, float speed) {
updateRotation(instance, getRotationAxis(), speed);
}
protected final void updateRotation(RotatingData instance, Direction.Axis axis, float speed) {
instance.setRotationAxis(axis)
.setRotationOffset(getRotationOffset(axis))
.setRotationalSpeed(speed)
.setColor(tile.network);
.setColor(tile);
}
protected final void updateRotation(RotatingData key, Direction.Axis axis) {
updateRotation(key, axis, tile.getSpeed());
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key) {
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()
.setRotationAxis(axis)
.setRotationalSpeed(speed)
.setRotationOffset(getRotationOffset(axis))
.setTileEntity(tile)
.setSkyLight(world.getLightLevel(LightType.SKY, pos))
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos));
.setColor(tile)
.setPosition(getInstancePosition());
return key;
}
@ -55,16 +69,24 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
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) {
return AllBlocks.SHAFT.getDefaultState()
.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);
.with(ShaftBlock.AXIS, axis);
}
}

View file

@ -12,6 +12,6 @@ public class ShaftlessCogInstance extends SingleRotatingInstance {
@Override
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.InstancedTileRenderer;
import net.minecraft.block.BlockState;
import net.minecraft.util.Direction;
import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE;
public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntity> {
protected final InstanceKey<RotatingData> rotatingModelKey;
protected final InstanceKey<RotatingData> rotatingModel;
public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
super(modelManager, tile);
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
rotatingModelKey = setup(getModel().createInstance(), tile.getSpeed(), axis);
rotatingModel = setup(getModel().createInstance());
}
@Override
public void update() {
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
updateRotation(rotatingModelKey, axis);
updateRotation(rotatingModel.getInstance());
}
@Override
public void updateLight() {
relight(pos, rotatingModelKey.getInstance());
relight(pos, rotatingModel.getInstance());
}
@Override
public void remove() {
rotatingModelKey.delete();
rotatingModel.delete();
}
protected BlockState getRenderedBlockState() {
@ -40,6 +37,6 @@ public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntit
}
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
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) {
super(modelManager, context);
RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.transformMaterial();
RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.getTransformMaterial();
BlockState state = context.state;

View file

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

View file

@ -37,7 +37,7 @@ public class DeployerActorInstance extends ActorInstance {
public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
super(modelManager, context);
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.transformMaterial();
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.getTransformMaterial();
BlockState state = context.state;
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);
shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING)
.getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileInstance.shaft(axis))
.getModel(KineticTileInstance.shaft(axis))
.createInstance();
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.InstanceKey;
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.impl.OrientedData;
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.MathHelper;
import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3i;
import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE;
@ -50,7 +48,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 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();
relight(pos, pole.getInstance());
@ -77,7 +75,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
: currentHand == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f;
float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f);
Vector3i facingVec = facing.getDirectionVec();
BlockPos blockPos = getFloatingPos();
BlockPos blockPos = getInstancePosition();
float x = blockPos.getX() + ((float) facingVec.getX()) * 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();
hand = RenderMaterials.ORIENTED.get(modelManager).getModel(currentHand, blockState).createInstance();
hand = getOrientedMaterial().getModel(currentHand, blockState).createInstance();
relight(pos, hand.getInstance());
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> fan;
final Direction.Axis axis;
final Direction direction;
public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) {
super(modelManager, tile);
direction = blockState.get(FACING);
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
fan = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
RotatingData shaftInstance = shaft.getInstance();
shaftInstance.setTileEntity(tile);
updateRotation(shaftInstance, axis);
RotatingData fanInstance = fan.getInstance();
fanInstance.setTileEntity(tile);
updateRotation(fanInstance, axis, getFanSpeed());
updateLight();
setup(shaft);
setup(fan, getFanSpeed());
}
private float getFanSpeed() {
@ -50,8 +41,8 @@ public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
@Override
protected void update() {
updateRotation(shaft, axis);
updateRotation(fan, axis, getFanSpeed());
updateRotation(shaft.getInstance());
updateRotation(fan.getInstance(), getFanSpeed());
}
@Override

View file

@ -6,10 +6,8 @@ import java.util.List;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.matrix.MatrixStack;
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.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.impl.ModelData;
import com.simibubi.create.foundation.utility.AngleHelper;
@ -48,8 +46,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
shaft = setup(shaftModel().createInstance(), tile.getSpeed(), axis);
shaft = setup(shaftModel().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;
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance();
lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance();
@ -72,8 +69,6 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
} else {
connectors = Collections.emptyList();
}
updateLight();
}
@Override
@ -89,7 +84,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos());
msr.translate(getInstancePosition());
if (connection != null) {
float rotation = angle * connectorAngleMult;
@ -132,8 +127,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
@Override
protected void update() {
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
updateRotation(shaft, axis);
updateRotation(shaft.getInstance());
}
@Override
@ -155,7 +149,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
}
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) {

View file

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

View file

@ -15,6 +15,6 @@ public class MillStoneCogInstance extends SingleRotatingInstance {
@Override
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()
.getBlockState(placedOnPos);
if (AllBlocks.BASIN.has(placedOnState) || AllBlocks.BELT.has(placedOnState)
|| AllBlocks.DEPOT.has(placedOnState)) {
|| AllBlocks.DEPOT.has(placedOnState) || AllBlocks.WEIGHTED_EJECTOR.has(placedOnState)) {
if (context.getWorld()
.getBlockState(placedOnPos.up(2))
.getMaterial()

View file

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

View file

@ -1,18 +1,16 @@
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.Optional;
import java.util.stream.Collectors;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode;
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.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 {
@ -45,13 +43,25 @@ public class BeltPressingCallbacks {
if (!recipe.isPresent())
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()
.copy();
List<ItemStack> multipliedOutput = ItemHelper.multipliedOutput(transported.stack, out);
if (multipliedOutput.isEmpty())
transported.stack = ItemStack.EMPTY;
transported.stack = multipliedOutput.get(0);
transported.stack = multipliedOutput.get(0);*/
pressTe.sendData();
return HOLD;
}

View file

@ -20,7 +20,6 @@ public class PressInstance extends ShaftInstance implements IDynamicInstance {
pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance();
updateLight();
transformModels((MechanicalPressTileEntity) tile);
}
@ -39,7 +38,7 @@ public class PressInstance extends ShaftInstance implements IDynamicInstance {
MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos());
msr.translate(getInstancePosition());
msr.translate(0, -renderedHeadOffset, 0);
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.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.SingleRotatingInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
@ -20,8 +19,8 @@ public class SawInstance extends SingleRotatingInstance {
@Override
protected InstancedModel<RotatingData> getModel() {
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
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())
continue;
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite());
.tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite(), false);
if (tryExportingToBeltFunnel != null) {
if (tryExportingToBeltFunnel.getCount() != stack.getCount()) {
inventory.setStackInSlot(slot, tryExportingToBeltFunnel);

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ch
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
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) {
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;
facing = blockState.get(StickerBlock.FACING);
offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0;
updateLight();
}
@Override
@ -48,7 +45,7 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> imple
MatrixStack stack = new MatrixStack();
MatrixStacker.of(stack)
.translate(getFloatingPos())
.translate(getInstancePosition())
.nudge(tile.hashCode())
.centre()
.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.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
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) {
super(dispatcher, tile);
gantryCogs = modelManager.getMaterial(RenderMaterials.TRANSFORMED)
gantryCogs = getTransformMaterial()
.getModel(AllBlockPartials.GANTRY_COGS, blockState)
.createInstance();
@ -40,8 +39,6 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos()
: tile.getPos()
.offset(facing.getOpposite());
updateLight();
}
@Override
@ -62,7 +59,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
MatrixStack ms = new MatrixStack();
MatrixStacker.of(ms)
.translate(getFloatingPos())
.translate(getInstancePosition())
.centre()
.rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90)
@ -77,7 +74,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
@Override
public void updateLight() {
relight(pos, gantryCogs.getInstance());
relight(pos, gantryCogs.getInstance(), rotatingModel.getInstance());
}
@Override

View file

@ -27,7 +27,7 @@ import java.util.ArrayList;
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;
@ -48,25 +48,25 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer<Contraptio
@Override
public void tick() {
actors.forEach(com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance::tick);
actors.forEach(ActorInstance::tick);
}
@Override
public void beginFrame(double cameraX, double cameraY, double cameraZ) {
super.beginFrame(cameraX, cameraY, cameraZ);
actors.forEach(com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance::beginFrame);
actors.forEach(ActorInstance::beginFrame);
}
@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();
MovementContext context = actor.getRight();
MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state);
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);

View file

@ -15,6 +15,6 @@ public class PumpCogInstance extends SingleRotatingInstance {
@Override
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;
ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE)
.tryExportingToBeltFunnel(heldItem.stack, side.getOpposite());
.tryExportingToBeltFunnel(heldItem.stack, side.getOpposite(), false);
if (tryExportingToBeltFunnel != null) {
if (tryExportingToBeltFunnel.getCount() != heldItem.stack.getCount()) {
if (tryExportingToBeltFunnel.isEmpty())

View file

@ -37,9 +37,8 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc
boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical();
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);
}
@ -58,7 +57,7 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc
MatrixStack ms = new MatrixStack();
MatrixStacker.of(ms)
.translate(getFloatingPos())
.translate(getInstancePosition())
.centre()
.rotateY(yRot)
.rotateX(xRot)

View file

@ -68,7 +68,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
if (tile.hasPulley()) {
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);
key.getInstance()
.setScrollTexture(spriteShiftEntry)
.setColor(tile.network)
.setColor(tile)
.setRotationalSpeed(getScrollSpeed());
bottom = false;
}
if (pulleyKey != null) {
updateRotation(pulleyKey, getRotationAxis());
updateRotation(pulleyKey.getInstance());
}
}
@ -138,7 +138,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
return modelTransform;
};
return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms);
return getRotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms);
}
private Direction getOrientation() {
@ -158,13 +158,14 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
Quaternion q = new Quaternion(rotX, rotY, rotZ, true);
key.getInstance()
.setScrollTexture(spriteShift)
.setScrollMult(diagonal ? 3f / 8f : 0.5f)
.setRotation(q)
.setRotationalSpeed(getScrollSpeed())
.setRotationOffset(bottom ? 0.5f : 0f)
.setTileEntity(tile)
key.getInstance()
.setScrollTexture(spriteShift)
.setScrollMult(diagonal ? 3f / 8f : 0.5f)
.setRotation(q)
.setRotationalSpeed(getScrollSpeed())
.setRotationOffset(bottom ? 0.5f : 0f)
.setColor(tile)
.setPosition(getInstancePosition())
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
.setSkyLight(world.getLightLevel(LightType.SKY, pos));

View file

@ -538,18 +538,19 @@ public class BeltTileEntity extends KineticTileEntity implements LightUpdateList
}
private void initializeLight() {
light = new byte[beltLength * 2];
if (beltLength > 0) {
light = new byte[beltLength * 2];
Vector3i vec = getBeltFacing().getDirectionVec();
BeltSlope slope = getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0;
Vector3i vec = getBeltFacing().getDirectionVec();
BeltSlope slope = getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0;
BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ());
for (int i = 0; i < beltLength * 2; i += 2) {
light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos);
light[i + 1] = (byte) world.getLightLevel(LightType.SKY, pos);
pos.move(vec.getX(), verticality, vec.getZ());
BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ());
for (int i = 0; i < beltLength * 2; i += 2) {
light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos);
light[i + 1] = (byte) world.getLightLevel(LightType.SKY, pos);
pos.move(vec.getX(), verticality, vec.getZ());
}
}
}

View file

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

View file

@ -23,19 +23,18 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
keys = new ArrayList<>(2);
Block block = blockState.getBlock();
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(blockState);
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);
float splitSpeed = speed * tile.getRotationSpeedModifier(dir);
keys.add(setup(half.createInstance(), splitSpeed, boxAxis));
keys.add(setup(half.createInstance(), splitSpeed));
}
updateLight();
}
@Override
@ -46,13 +45,13 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
Direction[] directions = Iterate.directionsInAxis(boxAxis);
for (int i : Iterate.zeroAndOne) {
updateRotation(keys.get(i), directions[i]);
updateRotation(keys.get(i).getInstance(), tile.getSpeed() * tile.getRotationSpeedModifier(directions[i]));
}
}
@Override
public void updateLight() {
keys.forEach(key -> relight(pos, ((InstanceKey<? extends KineticData>) key).getInstance()));
relight(pos, keys.stream().map(InstanceKey::getInstance));
}
@Override
@ -61,13 +60,4 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
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.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
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;
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();
ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos());
msr.translate(getInstancePosition());
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);
}
updateLight();
}
private DialFace makeFace(Direction face, InstancedModel<ModelData> dialModel, InstancedModel<ModelData> headModel) {
@ -154,7 +151,7 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
@Override
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
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()
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setRotationalSpeed(getSpeed(direction))
.setRotationOffset(getRotationOffset(axis))
.setTileEntity(tile)
.setRotationOffset(getRotationOffset(axis)).setColor(tile)
.setPosition(getInstancePosition())
.setBlockLight(blockLight)
.setSkyLight(skyLight);
@ -80,12 +80,7 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
Direction direction = key.getKey();
Direction.Axis axis = direction.getAxis();
key.getValue()
.getInstance()
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setRotationalSpeed(getSpeed(direction))
.setRotationOffset(getRotationOffset(axis))
.setColor(tile.network);
updateRotation(key.getValue().getInstance(), axis, getSpeed(direction));
}
}

View file

@ -1,25 +1,5 @@
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.BlockState;
import net.minecraft.block.Blocks;
@ -48,6 +28,24 @@ import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
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 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;
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) {
BlockState tunnel = world.getBlockState(pos);
BlockState newTunnel = getTunnelState(world, pos);
if (tunnel != newTunnel) {
if (tunnel != newTunnel && !world.isRemote()) {
world.setBlockState(pos, newTunnel, 3);
TileEntity te = world.getTileEntity(pos);
if (te != null && (te instanceof BeltTunnelTileEntity))

View file

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

View file

@ -100,9 +100,7 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe
// Backwards compat
if (!compound.contains("Sides") && compound.contains("Flaps"))
sides.addAll(flaps.keySet());
super.fromTag(state, compound, clientPacket);
if (clientPacket)
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.behaviour.filtering.FilteringBehaviour;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
@ -15,7 +16,7 @@ import net.minecraft.world.World;
public class BrassTunnelBlock extends BeltTunnelBlock {
public BrassTunnelBlock(Properties properties) {
public BrassTunnelBlock(AbstractBlock.Properties 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.ScrollOptionBehaviour;
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.Lang;
import com.simibubi.create.foundation.utility.NBTHelper;
@ -55,11 +56,13 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
ItemStack stackToDistribute;
float distributionProgress;
List<Pair<BlockPos, Direction>> distributionTargets;
int distributionDistanceLeft;
int distributionDistanceRight;
int previousOutputIndex;
// <filtered, non-filtered>
Couple<List<Pair<BlockPos, Direction>>> distributionTargets;
private boolean syncedOutputActive;
private Set<BrassTunnelTileEntity> syncSet;
@ -69,7 +72,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
public BrassTunnelTileEntity(TileEntityType<? extends BeltTunnelTileEntity> type) {
super(type);
distributionTargets = new ArrayList<>();
distributionTargets = Couple.create(ArrayList::new);
syncSet = new HashSet<>();
stackToDistribute = ItemStack.EMPTY;
beltCapability = LazyOptional.empty();
@ -113,7 +116,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
return;
if (distributionProgress == -1) {
distributionTargets.clear();
distributionTargets.forEach(List::clear);
distributionDistanceLeft = 0;
distributionDistanceRight = 0;
@ -137,27 +140,24 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
if (stackToDistribute.isEmpty())
return;
for (boolean filterPass : Iterate.trueAndFalse) {
for (Pair<BrassTunnelTileEntity, Direction> pair : validOutputs) {
BrassTunnelTileEntity tunnel = pair.getKey();
Direction output = pair.getValue();
if (filterPass && tunnel.flapFilterEmpty(output))
continue;
if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null)
continue;
distributionTargets.add(Pair.of(tunnel.pos, output));
int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ();
if (distance < 0)
distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance);
else
distributionDistanceRight = Math.max(distributionDistanceRight, distance);
}
if (!distributionTargets.isEmpty() && filterPass)
break;
for (Pair<BrassTunnelTileEntity, Direction> pair : validOutputs) {
BrassTunnelTileEntity tunnel = pair.getKey();
Direction output = pair.getValue();
if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null)
continue;
distributionTargets.get(!tunnel.flapFilterEmpty(output))
.add(Pair.of(tunnel.pos, output));
int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ();
if (distance < 0)
distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance);
else
distributionDistanceRight = Math.max(distributionDistanceRight, distance);
}
if (distributionTargets.isEmpty())
if (distributionTargets.getFirst()
.isEmpty()
&& distributionTargets.getSecond()
.isEmpty())
return;
if (selectionMode.get() != SelectionMode.SYNCHRONIZE || syncedOutputActive) {
@ -167,9 +167,14 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
return;
}
if (distributionProgress == 0) {
if (distributionProgress != 0)
return;
distributionTargets.forEach(list -> {
if (stackToDistribute.isEmpty())
return;
List<Pair<BrassTunnelTileEntity, Direction>> validTargets = new ArrayList<>();
for (Pair<BlockPos, Direction> pair : distributionTargets) {
for (Pair<BlockPos, Direction> pair : list) {
BlockPos tunnelPos = pair.getKey();
Direction output = pair.getValue();
TileEntity te = world.getTileEntity(tunnelPos);
@ -177,18 +182,15 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
continue;
validTargets.add(Pair.of((BrassTunnelTileEntity) te, output));
}
distribute(validTargets);
distributionProgress = -1;
return;
}
});
}
private static Random rand = new Random();
private void distribute(List<Pair<BrassTunnelTileEntity, Direction>> validTargets) {
final int amountTargets = validTargets.size();
int amountTargets = validTargets.size();
if (amountTargets == 0)
return;
@ -204,18 +206,23 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
ItemStack toDistribute = null;
int leftovers = 0;
int remainingOutputs = amountTargets;
for (boolean simulate : Iterate.trueAndFalse) {
if (remainingOutputs == 0)
return;
leftovers = 0;
int index = indexStart;
int stackSize = stackToDistribute.getCount();
int splitStackSize = stackSize / amountTargets;
int splitRemainder = stackSize % amountTargets;
int splitStackSize = stackSize / remainingOutputs;
int splitRemainder = stackSize % remainingOutputs;
int visited = 0;
toDistribute = stackToDistribute.copy();
if (!force && simulate)
if (!(force || split) && simulate)
continue;
while (visited < amountTargets) {
Pair<BrassTunnelTileEntity, Direction> pair = validTargets.get(index);
BrassTunnelTileEntity tunnel = pair.getKey();
@ -230,6 +237,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
if (remainder == null || remainder.getCount() == count) {
if (force)
return;
if (split && simulate)
remainingOutputs--;
continue;
}
@ -457,19 +466,22 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
compound.putBoolean("SyncedOutput", syncedOutputActive);
compound.putBoolean("ConnectedLeft", connectedLeft);
compound.putBoolean("ConnectedRight", connectedRight);
compound.put("StackToDistribute", stackToDistribute.serializeNBT());
compound.putFloat("DistributionProgress", distributionProgress);
compound.putInt("PreviousIndex", previousOutputIndex);
compound.putInt("DistanceLeft", distributionDistanceLeft);
compound.putInt("DistanceRight", distributionDistanceRight);
compound.put("Targets", NBTHelper.writeCompoundList(distributionTargets, pair -> {
CompoundNBT nbt = new CompoundNBT();
nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey()));
nbt.putInt("Face", pair.getValue()
.getIndex());
return nbt;
}));
for (boolean filtered : Iterate.trueAndFalse) {
compound.put(filtered ? "FilteredTargets" : "Targets",
NBTHelper.writeCompoundList(distributionTargets.get(filtered), pair -> {
CompoundNBT nbt = new CompoundNBT();
nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey()));
nbt.putInt("Face", pair.getValue()
.getIndex());
return nbt;
}));
}
super.write(compound, clientPacket);
}
@ -487,11 +499,15 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity {
previousOutputIndex = compound.getInt("PreviousIndex");
distributionDistanceLeft = compound.getInt("DistanceLeft");
distributionDistanceRight = compound.getInt("DistanceRight");
distributionTargets = NBTHelper.readCompoundList(compound.getList("Targets", NBT.TAG_COMPOUND), nbt -> {
BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos"));
Direction face = Direction.byIndex(nbt.getInt("Face"));
return Pair.of(pos, face);
});
for (boolean filtered : Iterate.trueAndFalse) {
distributionTargets.set(filtered, NBTHelper
.readCompoundList(compound.getList(filtered ? "FilteredTargets" : "Targets", NBT.TAG_COMPOUND), nbt -> {
BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos"));
Direction face = Direction.byIndex(nbt.getInt("Face"));
return Pair.of(pos, face);
}));
}
super.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 com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
@ -30,8 +21,6 @@ import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler;
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@ -65,74 +54,18 @@ public class DepotBlock extends Block implements ITE<DepotTileEntity>, IWrenchab
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) {
if (ray.getFace() != Direction.UP)
return ActionResultType.PASS;
if (world.isRemote)
return ActionResultType.SUCCESS;
withTileEntityDo(world, pos, te -> {
ItemStack heldItem = player.getHeldItem(hand);
boolean wasEmptyHanded = heldItem.isEmpty();
boolean shouldntPlaceItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem);
ItemStack mainItemStack = te.getHeldItemStack();
if (!mainItemStack.isEmpty()) {
player.inventory.placeItemBackInInventory(world, mainItemStack);
te.setHeldItem(null);
}
ItemStackHandler outputs = te.processingOutputBuffer;
for (int i = 0; i < outputs.getSlots(); i++)
player.inventory.placeItemBackInInventory(world, outputs.extractItem(i, 64, false));
if (!wasEmptyHanded && !shouldntPlaceItem) {
TransportedItemStack transported = new TransportedItemStack(heldItem);
transported.insertedFrom = player.getHorizontalFacing();
transported.prevBeltPosition = .25f;
transported.beltPosition = .25f;
te.setHeldItem(transported);
player.setHeldItem(hand, ItemStack.EMPTY);
}
te.markDirty();
te.sendData();
});
return ActionResultType.SUCCESS;
return SharedDepotBlockMethods.onUse(state, world, pos, player, hand, ray);
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
return;
withTileEntityDo(worldIn, pos, te -> {
ItemHelper.dropContents(worldIn, pos, te.processingOutputBuffer);
if (!te.getHeldItemStack()
.isEmpty())
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), te.getHeldItemStack());
});
worldIn.removeTileEntity(pos);
SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving);
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
if (!AllBlocks.DEPOT.has(worldIn.getBlockState(entityIn.getBlockPos())))
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();
SharedDepotBlockMethods.onLanded(worldIn, entityIn);
}
@Override
@ -142,11 +75,7 @@ public class DepotBlock extends Block implements ITE<DepotTileEntity>, IWrenchab
@Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
try {
return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).itemHandler);
} catch (TileEntityException ignored) {
}
return 0;
return SharedDepotBlockMethods.getComparatorInputOverride(blockState, worldIn, pos);
}
}

View file

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

View file

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

View file

@ -1,254 +1,33 @@
package com.simibubi.create.content.logistics.block.depot;
import java.util.List;
import java.util.function.Function;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.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.util.Direction;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import java.util.List;
public class DepotTileEntity extends SmartTileEntity {
TransportedItemStack heldItem;
ItemStackHandler processingOutputBuffer;
DepotItemHandler itemHandler;
LazyOptional<DepotItemHandler> lazyItemHandler;
private TransportedItemStackHandlerBehaviour transportedHandler;
DepotBehaviour depotBehaviour;
public DepotTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
itemHandler = new DepotItemHandler(this);
lazyItemHandler = LazyOptional.of(() -> itemHandler);
processingOutputBuffer = new ItemStackHandler(8) {
protected void onContentsChanged(int slot) {
markDirty();
sendData();
};
};
}
@Override
public void tick() {
super.tick();
if (heldItem == null)
return;
heldItem.prevBeltPosition = heldItem.beltPosition;
heldItem.prevSideOffset = heldItem.sideOffset;
float diff = .5f - heldItem.beltPosition;
if (diff > 1 / 512f) {
if (diff > 1 / 32f && !BeltHelper.isItemUpright(heldItem.stack))
heldItem.angle += 1;
heldItem.beltPosition += diff / 4f;
}
if (diff > 1 / 16f)
return;
if (world.isRemote)
return;
if (handleBeltFunnelOutput())
return;
BeltProcessingBehaviour processingBehaviour =
TileEntityBehaviour.get(world, pos.up(2), BeltProcessingBehaviour.TYPE);
if (processingBehaviour == null)
return;
if (!heldItem.locked && BeltProcessingBehaviour.isBlocked(world, pos))
return;
ItemStack previousItem = heldItem.stack;
boolean wasLocked = heldItem.locked;
ProcessingResult result = wasLocked ? processingBehaviour.handleHeldItem(heldItem, transportedHandler)
: processingBehaviour.handleReceivedItem(heldItem, transportedHandler);
if (result == ProcessingResult.REMOVE) {
heldItem = null;
sendData();
return;
}
heldItem.locked = result == ProcessingResult.HOLD;
if (heldItem.locked != wasLocked || !previousItem.equals(heldItem.stack, false))
sendData();
}
private boolean handleBeltFunnelOutput() {
for (int slot = 0; slot < processingOutputBuffer.getSlots(); slot++) {
ItemStack previousItem = processingOutputBuffer.getStackInSlot(slot);
if (previousItem.isEmpty())
continue;
ItemStack afterInsert =
getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null);
if (afterInsert == null)
return false;
if (previousItem.getCount() != afterInsert.getCount()) {
processingOutputBuffer.setStackInSlot(slot, afterInsert);
notifyUpdate();
return true;
}
}
ItemStack previousItem = heldItem.stack;
ItemStack afterInsert =
getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null);
if (afterInsert == null)
return false;
if (previousItem.getCount() != afterInsert.getCount()) {
if (afterInsert.isEmpty())
heldItem = null;
else
heldItem.stack = afterInsert;
notifyUpdate();
return true;
}
return false;
}
@Override
public void remove() {
super.remove();
if (lazyItemHandler != null)
lazyItemHandler.invalidate();
}
@Override
public void write(CompoundNBT compound, boolean clientPacket) {
if (heldItem != null)
compound.put("HeldItem", heldItem.serializeNBT());
compound.put("OutputBuffer", processingOutputBuffer.serializeNBT());
super.write(compound, clientPacket);
}
@Override
protected void 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
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
behaviours.add(new DirectBeltInputBehaviour(this).allowingBeltFunnels()
.setInsertionHandler(this::tryInsertingFromSide));
transportedHandler = new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems)
.withStackPlacement(this::getWorldPositionOf);
behaviours.add(transportedHandler);
}
public ItemStack getHeldItemStack() {
return heldItem == null ? ItemStack.EMPTY : heldItem.stack;
}
public void setHeldItem(TransportedItemStack heldItem) {
this.heldItem = heldItem;
}
public void setCenteredHeldItem(TransportedItemStack heldItem) {
this.heldItem = heldItem;
this.heldItem.beltPosition = 0.5f;
this.heldItem.prevBeltPosition = 0.5f;
behaviours.add(depotBehaviour = new DepotBehaviour(this));
depotBehaviour.addSubBehaviours(behaviours);
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return lazyItemHandler.cast();
return depotBehaviour.getItemCapability(cap, side);
return super.getCapability(cap, side);
}
private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) {
ItemStack inserted = transportedStack.stack;
ItemStack empty = ItemStack.EMPTY;
if (!getHeldItemStack().isEmpty())
return inserted;
if (!isOutputEmpty())
return inserted;
if (simulate)
return empty;
transportedStack = transportedStack.copy();
transportedStack.beltPosition = side.getAxis()
.isVertical() ? .5f : 0;
transportedStack.insertedFrom = side;
transportedStack.prevSideOffset = transportedStack.sideOffset;
transportedStack.prevBeltPosition = transportedStack.beltPosition;
setHeldItem(transportedStack);
markDirty();
sendData();
return empty;
}
private void applyToAllItems(float maxDistanceFromCentre,
Function<TransportedItemStack, TransportedResult> processFunction) {
if (heldItem == null)
return;
if (.5f - heldItem.beltPosition > maxDistanceFromCentre)
return;
boolean dirty = false;
TransportedItemStack transportedItemStack = heldItem;
ItemStack stackBefore = transportedItemStack.stack.copy();
TransportedResult result = processFunction.apply(transportedItemStack);
if (result == null || result.didntChangeFrom(stackBefore))
return;
dirty = true;
heldItem = null;
if (result.hasHeldOutput())
setCenteredHeldItem(result.getHeldOutput());
for (TransportedItemStack added : result.getOutputs()) {
if (getHeldItemStack().isEmpty()) {
setCenteredHeldItem(added);
continue;
}
ItemStack remainder = ItemHandlerHelper.insertItemStacked(processingOutputBuffer, added.stack, false);
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) {
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();
MatrixStacker.of(ms).translate(getFloatingPos());
MatrixStacker.of(ms).translate(getInstancePosition());
indicator.getInstance()
.setTransform(ms)
.setColor(getColor());
previousState = tile.state;
updateLight();
}
@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.RotatingData;
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.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
@ -37,7 +36,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity 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();
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);
models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2);
updateLight();
}
@Override
@ -90,7 +87,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
MatrixStack msLocal = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(msLocal);
msr.translate(getFloatingPos());
msr.translate(getInstancePosition());
msr.centre();
if (blockState.get(ArmBlock.CEILING))
@ -146,7 +143,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
@Override
protected InstancedModel<RotatingData> getModel() {
return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState());
return AllBlockPartials.ARM_COG.renderOnRotating(renderer, tile.getBlockState());
}
@Override

View file

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

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.logistics.block.redstone;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.backend.RenderMaterials;
import com.simibubi.create.foundation.render.backend.instancing.*;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AngleHelper;
@ -23,7 +22,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity 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();
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));
setupModel();
updateLight();
}
@Override
@ -46,7 +44,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos());
msr.translate(getInstancePosition());
transform(msr);
float state = tile.clientState.get(AnimationTickHolder.getPartialTicks());

View file

@ -1,30 +1,14 @@
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.content.logistics.InWorldProcessing;
import com.simibubi.create.content.logistics.item.filter.attribute.BookAuthorAttribute;
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.*;
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.AstralSorceryCrystalAttribute;
import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryPerkGemAttribute;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
@ -45,6 +29,12 @@ import net.minecraftforge.fml.ModList;
import net.minecraftforge.forgespi.language.IModInfo;
import net.minecraftforge.items.ItemStackHandler;
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 {
@ -55,6 +45,7 @@ public interface ItemAttribute {
static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC));
static ItemAttribute addedBy = register(new InItemGroup.AddedBy("dummy"));
static ItemAttribute hasEnchant = register(EnchantAttribute.EMPTY);
static ItemAttribute hasColor = register(ColorAttribute.EMPTY);
static ItemAttribute hasFluid = register(FluidContentsAttribute.EMPTY);
static ItemAttribute hasName = register(new ItemNameAttribute("dummy"));
static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1));
@ -130,8 +121,9 @@ public interface ItemAttribute {
RENAMED(ItemStack::hasDisplayName),
DAMAGED(ItemStack::isDamaged),
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),
MAX_ENCHANTED(StandardTraits::maxEnchanted),
FURNACE_FUEL(AbstractFurnaceTileEntity::isFuel),
WASHABLE(InWorldProcessing::isWashable),
CRUSHABLE((s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType())
@ -155,6 +147,13 @@ public interface ItemAttribute {
.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) {
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.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.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
@ -17,12 +16,10 @@ public class SchematicannonInstance extends TileEntityInstance<SchematicannonTil
public SchematicannonInstance(InstancedTileRenderer<?> modelManager, SchematicannonTileEntity 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();
pipe = mat.getModel(AllBlockPartials.SCHEMATICANNON_PIPE, blockState).createInstance();
updateLight();
}
@Override
@ -39,7 +36,7 @@ public class SchematicannonInstance extends TileEntityInstance<SchematicannonTil
MatrixStack ms = new MatrixStack();
MatrixStacker msr = MatrixStacker.of(ms);
msr.translate(getFloatingPos());
msr.translate(getInstancePosition());
ms.push();
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.blockzapper.BlockzapperRenderHandler;
import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler;
import com.simibubi.create.content.logistics.block.depot.EjectorTargetHandler;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.TooltipHelper;
@ -115,6 +116,7 @@ public class ClientEvents {
ExtendoGripRenderHandler.tick();
// CollisionDebugger.tick();
ArmInteractionPointHandler.tick();
EjectorTargetHandler.tick();
PlacementHelpers.tick();
CreateClient.outliner.tickOutlines();
CreateClient.ghostBlocks.tickGhosts();

View file

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

View file

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

View file

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

View file

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

View file

@ -11,6 +11,7 @@ import com.simibubi.create.foundation.render.backend.instancing.IFlywheelWorld;
import net.minecraft.world.World;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GLCapabilities;
import org.lwjgl.system.MemoryUtil;
@ -23,82 +24,85 @@ import net.minecraft.util.ResourceLocation;
import net.minecraftforge.resource.ISelectiveResourceReloadListener;
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 FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16);
public static final Logger log = LogManager.getLogger(Backend.class);
public static GLCapabilities capabilities;
public static GlFeatureCompat compat;
static final Map<ResourceLocation, ProgramSpec<?>> registry = new HashMap<>();
static final Map<ProgramSpec<?>, ProgramGroup<?>> programs = new HashMap<>();
private static boolean instancingAvailable;
private static boolean enabled;
private static boolean enabled;
static final Map<ResourceLocation, ProgramSpec<?>> registry = new HashMap<>();
static final Map<ProgramSpec<?>, ProgramGroup<?>> programs = new HashMap<>();
public static GLCapabilities capabilities;
public static GlFeatureCompat compat;
public Backend() {
throw new IllegalStateException();
}
public Backend() {
throw new IllegalStateException();
}
/**
* Register a shader program. TODO: replace with forge registry?
*/
public static <P extends GlProgram, S extends ProgramSpec<P>> S register(S spec) {
ResourceLocation name = spec.name;
if (registry.containsKey(name)) {
throw new IllegalStateException("Program spec '" + name + "' already registered.");
}
registry.put(name, spec);
return spec;
}
/**
* Register a shader program. TODO: replace with forge registry?
*/
public static <P extends GlProgram, S extends ProgramSpec<P>> S register(S spec) {
ResourceLocation name = spec.name;
if (registry.containsKey(name)) {
throw new IllegalStateException("Program spec '" + name + "' already registered.");
}
registry.put(name, spec);
return spec;
}
@SuppressWarnings("unchecked")
public static <P extends GlProgram, S extends ProgramSpec<P>> P getProgram(S spec) {
return (P) programs.get(spec).get(GlFog.getFogMode());
}
@SuppressWarnings("unchecked")
public static <P extends GlProgram, S extends ProgramSpec<P>> P getProgram(S spec) {
return (P) programs.get(spec).get(GlFog.getFogMode());
}
public static boolean isFlywheelWorld(World world) {
return world == Minecraft.getInstance().world || (world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel());
}
public static boolean isFlywheelWorld(World world) {
return world == Minecraft.getInstance().world || (world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel());
}
public static boolean available() {
return canUseVBOs();
}
public static boolean available() {
return canUseVBOs();
}
public static boolean canUseInstancing() {
return enabled && instancingAvailable;
}
public static boolean canUseInstancing() {
return enabled &&
compat.vertexArrayObjectsSupported() &&
compat.drawInstancedSupported() &&
compat.instancedArraysSupported();
}
public static boolean canUseVBOs() {
return enabled && gl20();
}
public static boolean canUseVBOs() {
return enabled && gl20();
}
public static boolean gl33() {
return capabilities.OpenGL33;
}
public static boolean gl33() {
return capabilities.OpenGL33;
}
public static boolean gl20() {
return capabilities.OpenGL20;
}
public static boolean gl20() {
return capabilities.OpenGL20;
}
public static void init() {
// Can be null when running datagenerators due to the unfortunate time we call this
Minecraft mc = Minecraft.getInstance();
if (mc == null) return;
public static void init() {
// Can be null when running datagenerators due to the unfortunate time we call this
Minecraft mc = Minecraft.getInstance();
if (mc == null) return;
IResourceManager manager = mc.getResourceManager();
IResourceManager manager = mc.getResourceManager();
if (manager instanceof IReloadableResourceManager) {
ISelectiveResourceReloadListener listener = ShaderLoader::onResourceManagerReload;
((IReloadableResourceManager) manager).addReloadListener(listener);
}
}
if (manager instanceof IReloadableResourceManager) {
ISelectiveResourceReloadListener listener = ShaderLoader::onResourceManagerReload;
((IReloadableResourceManager) manager).addReloadListener(listener);
}
}
public static void refresh() {
capabilities = GL.createCapabilities();
public static void refresh() {
enabled = AllConfigs.CLIENT.experimentalRendering.get() && !OptifineHandler.usingShaders();
}
compat = new GlFeatureCompat(capabilities);
instancingAvailable = compat.vertexArrayObjectsSupported() &&
compat.drawInstancedSupported() &&
compat.instancedArraysSupported();
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.Matrix4f;
import java.nio.ByteBuffer;
import com.mojang.blaze3d.matrix.MatrixStack;
public class RenderUtil {
public static int nextPowerOf2(int a) {
@ -16,9 +16,12 @@ public class RenderUtil {
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[] {
model.a00,
model.a10,
@ -47,4 +50,25 @@ public class RenderUtil {
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

@ -28,175 +28,172 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ShaderLoader {
public static final String SHADER_DIR = "flywheel/shaders/";
public static final ArrayList<String> EXTENSIONS = Lists.newArrayList(".vert", ".vsh", ".frag", ".fsh", ".glsl");
public static final String SHADER_DIR = "flywheel/shaders/";
public static final ArrayList<String> EXTENSIONS = Lists.newArrayList(".vert", ".vsh", ".frag", ".fsh", ".glsl");
static final Map<ResourceLocation, String> shaderSource = new HashMap<>();
static final Map<ResourceLocation, String> shaderSource = new HashMap<>();
static void onResourceManagerReload(IResourceManager manager, Predicate<IResourceType> predicate) {
if (predicate.test(VanillaResourceType.SHADERS)) {
Backend.capabilities = GL.createCapabilities();
Backend.compat = new GlFeatureCompat(Backend.capabilities);
static void onResourceManagerReload(IResourceManager manager, Predicate<IResourceType> predicate) {
if (predicate.test(VanillaResourceType.SHADERS)) {
OptifineHandler.refresh();
Backend.refresh();
OptifineHandler.refresh();
Backend.refresh();
if (Backend.gl20()) {
shaderSource.clear();
loadShaderSources(manager);
if (Backend.gl20()) {
shaderSource.clear();
loadShaderSources(manager);
Backend.programs.values().forEach(ProgramGroup::delete);
Backend.programs.clear();
Backend.registry.values().forEach(ShaderLoader::loadProgram);
Backend.programs.values().forEach(ProgramGroup::delete);
Backend.programs.clear();
Backend.registry.values().forEach(ShaderLoader::loadProgram);
Backend.log.info("Loaded all shader programs.");
}
}
}
Backend.log.info("Loaded all shader programs.");
}
}
}
private static void loadShaderSources(IResourceManager manager){
Collection<ResourceLocation> allShaders = manager.getAllResourceLocations(SHADER_DIR, s -> {
for (String ext : EXTENSIONS) {
if (s.endsWith(ext)) return true;
}
return false;
});
private static void loadShaderSources(IResourceManager manager){
Collection<ResourceLocation> allShaders = manager.getAllResourceLocations(SHADER_DIR, s -> {
for (String ext : EXTENSIONS) {
if (s.endsWith(ext)) return true;
}
return false;
});
for (ResourceLocation location : allShaders) {
try {
IResource resource = manager.getResource(location);
for (ResourceLocation location : allShaders) {
try {
IResource resource = manager.getResource(location);
String file = readToString(resource.getInputStream());
String file = readToString(resource.getInputStream());
ResourceLocation name = new ResourceLocation(location.getNamespace(),
location.getPath().substring(SHADER_DIR.length()));
ResourceLocation name = new ResourceLocation(location.getNamespace(),
location.getPath().substring(SHADER_DIR.length()));
shaderSource.put(name, file);
} catch (IOException e) {
shaderSource.put(name, file);
} catch (IOException e) {
}
}
}
}
}
}
static <P extends GlProgram, S extends ProgramSpec<P>> void loadProgram(S programSpec) {
Map<GlFogMode, P> programGroup = new EnumMap<>(GlFogMode.class);
static <P extends GlProgram, S extends ProgramSpec<P>> void loadProgram(S programSpec) {
Map<GlFogMode, P> programGroup = new EnumMap<>(GlFogMode.class);
for (GlFogMode fogMode : GlFogMode.values()) {
programGroup.put(fogMode, loadProgram(programSpec, fogMode));
}
for (GlFogMode fogMode : GlFogMode.values()) {
programGroup.put(fogMode, loadProgram(programSpec, fogMode));
}
Backend.programs.put(programSpec, new ProgramGroup<>(programGroup));
Backend.programs.put(programSpec, new ProgramGroup<>(programGroup));
Backend.log.debug("Loaded program {}", programSpec.name);
}
Backend.log.debug("Loaded program {}", programSpec.name);
}
private static <P extends GlProgram, S extends ProgramSpec<P>> P loadProgram(S programSpec, GlFogMode fogMode) {
GlShader vert = null;
GlShader frag = null;
try {
ShaderConstants defines = new ShaderConstants(programSpec.defines);
private static <P extends GlProgram, S extends ProgramSpec<P>> P loadProgram(S programSpec, GlFogMode fogMode) {
GlShader vert = null;
GlShader frag = null;
try {
ShaderConstants defines = new ShaderConstants(programSpec.defines);
defines.defineAll(fogMode.getDefines());
defines.defineAll(fogMode.getDefines());
vert = loadShader(programSpec.getVert(), ShaderType.VERTEX, defines);
frag = loadShader(programSpec.getFrag(), ShaderType.FRAGMENT, defines);
vert = loadShader(programSpec.getVert(), ShaderType.VERTEX, defines);
frag = loadShader(programSpec.getFrag(), ShaderType.FRAGMENT, defines);
GlProgram.Builder builder = GlProgram.builder(programSpec.name, fogMode).attachShader(vert).attachShader(frag);
GlProgram.Builder builder = GlProgram.builder(programSpec.name, fogMode).attachShader(vert).attachShader(frag);
programSpec.attributes.forEach(builder::addAttribute);
programSpec.attributes.forEach(builder::addAttribute);
return builder.build(programSpec.factory);
return builder.build(programSpec.factory);
} finally {
if (vert != null) vert.delete();
if (frag != null) frag.delete();
}
}
} finally {
if (vert != null) vert.delete();
if (frag != null) frag.delete();
}
}
private static final Pattern includePattern = Pattern.compile("#flwinclude <\"([\\w\\d_]+:[\\w\\d_./]+)\">");
private static final Pattern includePattern = Pattern.compile("#flwinclude <\"([\\w\\d_]+:[\\w\\d_./]+)\">");
private static String processIncludes(ResourceLocation baseName, String source) {
HashSet<ResourceLocation> seen = new HashSet<>();
seen.add(baseName);
private static String processIncludes(ResourceLocation baseName, String source) {
HashSet<ResourceLocation> seen = new HashSet<>();
seen.add(baseName);
return includeRecursive(source, seen).collect(Collectors.joining("\n"));
}
return includeRecursive(source, seen).collect(Collectors.joining("\n"));
}
private static Stream<String> includeRecursive(String source, Set<ResourceLocation> seen) {
return new BufferedReader(new StringReader(source)).lines().flatMap(line -> {
private static Stream<String> includeRecursive(String source, Set<ResourceLocation> seen) {
return new BufferedReader(new StringReader(source)).lines().flatMap(line -> {
Matcher matcher = includePattern.matcher(line);
Matcher matcher = includePattern.matcher(line);
if (matcher.find()) {
String includeName = matcher.group(1);
if (matcher.find()) {
String includeName = matcher.group(1);
ResourceLocation include = new ResourceLocation(includeName);
ResourceLocation include = new ResourceLocation(includeName);
if (seen.add(include)) {
String includeSource = shaderSource.get(include);
if (seen.add(include)) {
String includeSource = shaderSource.get(include);
if (includeSource != null) {
return includeRecursive(includeSource, seen);
}
}
}
if (includeSource != null) {
return includeRecursive(includeSource, seen);
}
}
}
return Stream.of(line);
});
}
return Stream.of(line);
});
}
private static GlShader loadShader(ResourceLocation name, ShaderType type, ShaderConstants defines) {
String source = shaderSource.get(name);
private static GlShader loadShader(ResourceLocation name, ShaderType type, ShaderConstants defines) {
String source = shaderSource.get(name);
source = processIncludes(name, source);
source = processIncludes(name, source);
if (defines != null)
source = defines.process(source);
if (defines != null)
source = defines.process(source);
return new GlShader(type, name, source);
}
return new GlShader(type, name, source);
}
public static String readToString(InputStream is) {
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
ByteBuffer bytebuffer = null;
public static String readToString(InputStream is) {
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
ByteBuffer bytebuffer = null;
try {
bytebuffer = readToBuffer(is);
int i = bytebuffer.position();
((Buffer)bytebuffer).rewind();
return MemoryUtil.memASCII(bytebuffer, i);
} catch (IOException e) {
try {
bytebuffer = readToBuffer(is);
int i = bytebuffer.position();
((Buffer)bytebuffer).rewind();
return MemoryUtil.memASCII(bytebuffer, i);
} catch (IOException e) {
} finally {
if (bytebuffer != null) {
MemoryUtil.memFree(bytebuffer);
}
} finally {
if (bytebuffer != null) {
MemoryUtil.memFree(bytebuffer);
}
}
}
return null;
}
return null;
}
public static ByteBuffer readToBuffer(InputStream is) throws IOException {
ByteBuffer bytebuffer;
if (is instanceof FileInputStream) {
FileInputStream fileinputstream = (FileInputStream)is;
FileChannel filechannel = fileinputstream.getChannel();
bytebuffer = MemoryUtil.memAlloc((int)filechannel.size() + 1);
public static ByteBuffer readToBuffer(InputStream is) throws IOException {
ByteBuffer bytebuffer;
if (is instanceof FileInputStream) {
FileInputStream fileinputstream = (FileInputStream)is;
FileChannel filechannel = fileinputstream.getChannel();
bytebuffer = MemoryUtil.memAlloc((int)filechannel.size() + 1);
while (filechannel.read(bytebuffer) != -1) { }
} else {
bytebuffer = MemoryUtil.memAlloc(8192);
ReadableByteChannel readablebytechannel = Channels.newChannel(is);
while (filechannel.read(bytebuffer) != -1) { }
} else {
bytebuffer = MemoryUtil.memAlloc(8192);
ReadableByteChannel readablebytechannel = Channels.newChannel(is);
while (readablebytechannel.read(bytebuffer) != -1) {
if (bytebuffer.remaining() == 0) {
bytebuffer = MemoryUtil.memRealloc(bytebuffer, bytebuffer.capacity() * 2);
}
}
}
while (readablebytechannel.read(bytebuffer) != -1) {
if (bytebuffer.remaining() == 0) {
bytebuffer = MemoryUtil.memRealloc(bytebuffer, bytebuffer.capacity() * 2);
}
}
}
return bytebuffer;
}
return bytebuffer;
}
}

View file

@ -1,5 +1,6 @@
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 org.lwjgl.opengl.GL20;
@ -53,9 +54,6 @@ public class BasicProgram extends GlProgram {
}
protected static void uploadMatrixUniform(int uniform, Matrix4f mat) {
Backend.MATRIX_BUFFER.position(0);
mat.write(Backend.MATRIX_BUFFER);
Backend.MATRIX_BUFFER.rewind();
GL20.glUniformMatrix4fv(uniform, false, Backend.MATRIX_BUFFER);
GL20.glUniformMatrix4fv(uniform, false, RenderUtil.writeMatrix(mat));
}
}

View file

@ -1,8 +1,17 @@
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 {
/**
* Called every frame, this can be used to make more dynamic animations.
* Called every frame.
*/
void beginFrame();
}

View file

@ -1,6 +1,25 @@
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 {
void tick();
/**
* Called every tick.
*/
void tick();
}

View file

@ -39,23 +39,12 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
public abstract void registerMaterials();
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)
tickableInstances.values().forEach(ITickableInstance::tick);
}
public void beginFrame(double cameraX, double cameraY, double cameraZ) {
if (queuedAdditions.size() > 0) {
queuedAdditions.forEach(this::addInternal);
queuedAdditions.clear();
}
processQueuedAdditions();
if (dynamicInstances.size() > 0)
dynamicInstances.values().forEach(IDynamicInstance::beginFrame);
}
@ -76,11 +65,11 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
return (RenderMaterial<P, M>) materials.get(materialType);
}
public RenderMaterial<P, InstancedModel<ModelData>> transformMaterial() {
public RenderMaterial<P, InstancedModel<ModelData>> getTransformMaterial() {
return getMaterial(RenderMaterials.TRANSFORMED);
}
public RenderMaterial<P, InstancedModel<OrientedData>> orientedMaterial() {
public RenderMaterial<P, InstancedModel<OrientedData>> getOrientedMaterial() {
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) {
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) {
getInstance(tile, true);
}
@ -175,6 +171,7 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
TileEntityInstance<? super T> renderer = InstancedTileRenderRegistry.instance.create(this, tile);
if (renderer != null) {
renderer.updateLight();
instances.put(tile, renderer);
if (renderer instanceof IDynamicInstance)
@ -187,16 +184,13 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
return renderer;
}
private void clean() {
instances.keySet().removeIf(TileEntity::isRemoved);
}
public void invalidate() {
for (RenderMaterial<?, ?> material : materials.values()) {
material.delete();
}
instances.clear();
dynamicInstances.clear();
tickableInstances.clear();
}
public boolean canCreateInstance(TileEntity tile) {
@ -206,6 +200,8 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
if (world == null) return false;
if (world.isAirBlock(tile.getPos())) return false;
if (world == Minecraft.getInstance().world) {
BlockPos pos = tile.getPos();

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