mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-16 03:03:43 +01:00
Merge & Port
This commit is contained in:
commit
35c62360be
120 changed files with 13385 additions and 10710 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "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.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.",
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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_.",
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -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.",
|
||||
|
||||
|
|
|
@ -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.",
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/weighted_ejector/item"
|
||||
}
|
|
@ -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"
|
||||
]
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"type": "minecraft:block",
|
||||
"pools": [
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "create:weighted_ejector"
|
||||
}
|
||||
],
|
||||
"conditions": [
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ public class ShaftInstance extends SingleRotatingInstance {
|
|||
|
||||
@Override
|
||||
protected BlockState getRenderedBlockState() {
|
||||
return shaft(getRotationAxis());
|
||||
return shaft();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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)));
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
Loading…
Reference in a new issue