On a Roll

- Added a movement actor for easier track clearing and paving
This commit is contained in:
simibubi 2023-02-22 15:14:04 +01:00
parent 0dd8c3a4f1
commit 3c1523d165
68 changed files with 2004 additions and 127 deletions

View file

@ -294,13 +294,14 @@ bff90a8d674a839b13fd9cd1f78bf3d0ad9fad4f assets/create/blockstates/limestone_pil
ddcf4bb281e046fbb1026b8f46a2cf12448598df assets/create/blockstates/mechanical_bearing.json
5586beef2d9183dc34d8e8d2723620c0569592ae assets/create/blockstates/mechanical_crafter.json
0cfa8a4a37f4142fa07e04666e0aef080c517053 assets/create/blockstates/mechanical_drill.json
0fb175e5260ec60e130e589d682a4d3301d7364e assets/create/blockstates/mechanical_harvester.json
f199f57510befeb2a583126bc16392e49a70dc7f assets/create/blockstates/mechanical_harvester.json
d9afcfa27c42df5fd54a7b783acb0eb45ddf5aa5 assets/create/blockstates/mechanical_mixer.json
da612a05f94dc19e07e250efc35a7b2839d2ee76 assets/create/blockstates/mechanical_piston.json
94ec340a50b2406f833735f7501a1840c692e32a assets/create/blockstates/mechanical_piston_head.json
debef0f5dde74103aaf4422de4bc90e4099b0c47 assets/create/blockstates/mechanical_plough.json
cd13e5327f1adaf9ab2bfc511ead05b2799fdfb3 assets/create/blockstates/mechanical_plough.json
92269fe66d7b83095a2e04e121af0be792f55dd6 assets/create/blockstates/mechanical_press.json
b7c4a0ff0c6f16e14d71fc0fb7fc66d032b65cf3 assets/create/blockstates/mechanical_pump.json
29ec1a3ec9b158b954f9ca126eaac89cee96cf84 assets/create/blockstates/mechanical_roller.json
264d72320ee0f1e014319f7d99dcc1fa953a4ad4 assets/create/blockstates/mechanical_saw.json
94bbcb7e622471dbf418d78f9200ad321c7168de assets/create/blockstates/metal_bracket.json
c253a827d9f0b0e29f67dfd19d65b259d3d4f045 assets/create/blockstates/metal_girder.json
@ -565,31 +566,31 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
3054a5519fbf91481b0c9c8160a20679fa9530da assets/create/lang/en_ud.json
10368a860ae28910f8b376da5a71ed5329e878d6 assets/create/lang/en_us.json
0aca1235610eae2a297eda6f96780115f8cd0a8e assets/create/lang/unfinished/cs_cz.json
91513e2231501328a1a2e99c8bd90a51c8513c1b assets/create/lang/unfinished/da_dk.json
e2e4f2644ca0cfbe26436abadc6553333fe2ce89 assets/create/lang/unfinished/de_de.json
ef633c12441059ac2d6795e39bb70578696da6e0 assets/create/lang/unfinished/es_cl.json
2d4d14e4c1fb9d9c8590a33570981cca83e0f44f assets/create/lang/unfinished/es_es.json
2fb12650950d8867501f5b00ff6edbedd8e231e4 assets/create/lang/unfinished/es_mx.json
645f1b7cc8d99de345fa3e5f2d1967e49b17d32b assets/create/lang/unfinished/fr_fr.json
0e6f608edc0d95337a6cce21d26cc8c5c7284bfc assets/create/lang/unfinished/hu_hu.json
0afaccef5e6b4bc2149bef652e5dd51c426c816a assets/create/lang/unfinished/it_it.json
ee8bd262d30c4b176d012902d0371648f5f5d5d4 assets/create/lang/unfinished/ja_jp.json
499063468b398b7b31182c109b68e751361b04fa assets/create/lang/unfinished/ko_kr.json
5beecf8025e06933a488a4e8224927e001f759cb assets/create/lang/unfinished/nl_nl.json
7e6a23b7f7c24ebbd08c135a8565787f65c6e0f0 assets/create/lang/unfinished/no_no.json
da8649af75b2b52a99ae4c30a106768f917192b4 assets/create/lang/unfinished/pl_pl.json
3fba7b5d3649aac2cb759bed41d8690b5cf4dbd1 assets/create/lang/unfinished/pt_br.json
3e83cdf96cde7c50f3f106a7e1f4c029cf26bfe2 assets/create/lang/unfinished/pt_pt.json
4a9f031baa04241b34779c74a75ca9f73ee589b7 assets/create/lang/unfinished/ro_ro.json
fa470b919e1f304ed0eb43cf3b47f2e9c9f1a470 assets/create/lang/unfinished/ru_ru.json
ec236461ebc2bddf2a1281b4d8713ba0bbb40012 assets/create/lang/unfinished/sv_se.json
906d8450cd95b65824ff23c1db38096cdc3802ec assets/create/lang/unfinished/th_th.json
a7122f134d4cdad8802f097822c38158b3042fa5 assets/create/lang/unfinished/uk_ua.json
0e0501505897acbc7bb2fe5cb20faa71727285ab assets/create/lang/unfinished/zh_cn.json
7829c9e8b9e5fa92b7327b839d914162a2ab5f06 assets/create/lang/unfinished/zh_tw.json
f1bedeb51c35e70a2247178634e61ea637a6622e assets/create/lang/en_ud.json
629c4b2f4a7b93c4ba276245ea92b56931fa1e55 assets/create/lang/en_us.json
f409c19eb8fcab16e270a51f5a3865c933ae37fa assets/create/lang/unfinished/cs_cz.json
38b96811697f30d5a7656e17c2874ba76cf3711d assets/create/lang/unfinished/da_dk.json
f2d95918e378b28e44392e46860383091523bdb3 assets/create/lang/unfinished/de_de.json
fd181773e9f3515a9a8f797024c79c4c8003515a assets/create/lang/unfinished/es_cl.json
78fef9fbc89d9ff476430e30b1dea5857c11d920 assets/create/lang/unfinished/es_es.json
2a9aa2e8dd66f40a09a15794318ebf70d5b57a05 assets/create/lang/unfinished/es_mx.json
9b89df317edb110ac5df3e9842fdf67d1432108a assets/create/lang/unfinished/fr_fr.json
40012bcf7152b6c8ee906278bb44678354b4e3ca assets/create/lang/unfinished/hu_hu.json
651125b7f58573fc357630eb2c7003013357b860 assets/create/lang/unfinished/it_it.json
ea9197b6373e059aef42f8ee0c6bda66949cac2f assets/create/lang/unfinished/ja_jp.json
8897df5518b74c8d28364c82c237ec784e9222bf assets/create/lang/unfinished/ko_kr.json
554765f5eab85c86c26dc292b214fcdd05b55828 assets/create/lang/unfinished/nl_nl.json
ee06a5dbc1eaa43944e1666b5626d4bf168f422c assets/create/lang/unfinished/no_no.json
1740766c3789bd8ac476f789b25c12c4f88005ce assets/create/lang/unfinished/pl_pl.json
1d935b043ae8050228ba5685d39b13c156f793a0 assets/create/lang/unfinished/pt_br.json
bce4776c51d30ffbba1d7ef24e5cf5c794854cdc assets/create/lang/unfinished/pt_pt.json
58863a13d65ecf34fe31dc37c90854972ec5427e assets/create/lang/unfinished/ro_ro.json
0471b8bb5bbd8d3c07e971c4d1e1606f78d50e66 assets/create/lang/unfinished/ru_ru.json
7fe39a993e8f9870a39f8d411b1577368effa477 assets/create/lang/unfinished/sv_se.json
3b0df05712345b5d239882f0ca9ee7931591a611 assets/create/lang/unfinished/th_th.json
84e50f51ed81826a585a7f686f762a3800ba3082 assets/create/lang/unfinished/uk_ua.json
8d04ac15eaa0b6f5632bc389946a452f3862608a assets/create/lang/unfinished/zh_cn.json
7965f6b897b0109e46e47e092e280eea20fb20d1 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
@ -1953,6 +1954,7 @@ f8d0d4b2a890ea7a69ab0c390947b48fe0478d3f assets/create/models/item/mechanical_pi
726ae61699dc379a4f535c1be3ec2672a2f03583 assets/create/models/item/mechanical_plough.json
6c2acb80e53256fbb85f76851f335f9248ace6da assets/create/models/item/mechanical_press.json
4e363477e3e8059dd7b2bad04046521b31923d1b assets/create/models/item/mechanical_pump.json
2d7d314661e39f027c118cf14ae2f4acf213b9be assets/create/models/item/mechanical_roller.json
3fc1fcb2016d2782c3667c21575423122b66705a assets/create/models/item/mechanical_saw.json
3afa723a8ba4160a4bd8778a56e1880e7ff53ed9 assets/create/models/item/metal_bracket.json
56494f6d8743241836f7e68122ad9cc83f77658a assets/create/models/item/metal_girder.json
@ -2461,6 +2463,7 @@ c32f74a21df56b67f99366fba747277c40b09935 data/create/advancements/recipes/create
ab3cb22e7cb2469c69a177ba83e29a2e1abdc3f8 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_plough.json
6b1ae84d071e8fc7a1789aaeb01a15260831fc82 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_press.json
90434eccfbcff42e8bc397881fd9d68f2dcb7ad4 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_pump.json
b0fabbe0b97cf7a56260af78cb29d21c55aafbe1 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_roller.json
40a87b7abbc22436efab546fad3910f4a945c5fc data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_saw.json
ed6f472a0de659074e384d20e6c5903bda543acc data/create/advancements/recipes/create.base/crafting/kinetics/metal_bracket.json
3072592260b044257cc53be8f023909394b6cfea data/create/advancements/recipes/create.base/crafting/kinetics/metal_girder.json
@ -3698,6 +3701,7 @@ a21c4e4eebeff2daf1f081cd6226f29adfeade7c data/create/loot_tables/blocks/mechanic
b8f5a9201775b711195a01882888307dd273aeab data/create/loot_tables/blocks/mechanical_plough.json
ff55d31ae8f7a8943f1e9fcc330d18e246566997 data/create/loot_tables/blocks/mechanical_press.json
8f885b8cec8f1ef9e35bd9b93a64a0f6e14c31b0 data/create/loot_tables/blocks/mechanical_pump.json
fda8ee4cd0f5a29267b10e53b013dc75cee253e9 data/create/loot_tables/blocks/mechanical_roller.json
6c88dd3f096f2a7572573158f8e6d9f4b3dedae0 data/create/loot_tables/blocks/mechanical_saw.json
fcd800d7abf5dc5ce50b6fff6f2fc934b3d47b4b data/create/loot_tables/blocks/metal_bracket.json
afdff197c9d1a6940e988c00435135f9705fd0e5 data/create/loot_tables/blocks/metal_girder.json
@ -4134,6 +4138,7 @@ e8d842e3bd9949ea12682d9cddf29e7d54f926ec data/create/recipes/crafting/kinetics/m
8a2f9068d6fab81f46699f897e619461ca89e38f data/create/recipes/crafting/kinetics/mechanical_plough.json
be0b5c980c310807253d54006a714534a4b27065 data/create/recipes/crafting/kinetics/mechanical_press.json
4307cc2c988ac19602f2f86afa2146c7e7fef026 data/create/recipes/crafting/kinetics/mechanical_pump.json
316c72e1a2ec264b33f98a51125a6de20e679c38 data/create/recipes/crafting/kinetics/mechanical_roller.json
ce28bcb47a379976d4a1bdfcfd1cdd0bae0bcdae data/create/recipes/crafting/kinetics/mechanical_saw.json
353146e9501096b4cd9632ad5500b0a2406c6f5d data/create/recipes/crafting/kinetics/metal_bracket.json
0ef8088b775f551c6f5b44f21f419fba366a971e data/create/recipes/crafting/kinetics/metal_girder.json
@ -5757,8 +5762,8 @@ e16d74571ae10007f06f3b86ddf05d3ca9b73559 data/minecraft/tags/blocks/doors.json
2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json
69f596fcb065e26b02ce246760432b5174191b76 data/minecraft/tags/blocks/impermeable.json
2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/lush_ground_replaceable.json
a8662d145a8b1b5faa263c2aac9d12e7727c8c3f data/minecraft/tags/blocks/mineable/axe.json
6f18f0d6fe0e4204079cbf9c7b6dc79c8cebcaa9 data/minecraft/tags/blocks/mineable/pickaxe.json
e2ba2b22fbda681faa4db4a32f6e15d2c7946fec data/minecraft/tags/blocks/mineable/axe.json
1c1c974423a0d5668d20ebabfe4444e7fb1fe372 data/minecraft/tags/blocks/mineable/pickaxe.json
2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/moss_replaceable.json
e157c1d3af30e409e34bbefbe15a037e6e1c8daa data/minecraft/tags/blocks/needs_iron_tool.json
a08f67865337f62601c5e333b4011382d10020e4 data/minecraft/tags/blocks/needs_stone_tool.json

View file

@ -1,17 +1,32 @@
{
"variants": {
"facing=north": {
"facing=north,waterlogged=false": {
"model": "create:block/mechanical_harvester/block"
},
"facing=south": {
"facing=south,waterlogged=false": {
"model": "create:block/mechanical_harvester/block",
"y": 180
},
"facing=west": {
"facing=west,waterlogged=false": {
"model": "create:block/mechanical_harvester/block",
"y": 270
},
"facing=east": {
"facing=east,waterlogged=false": {
"model": "create:block/mechanical_harvester/block",
"y": 90
},
"facing=north,waterlogged=true": {
"model": "create:block/mechanical_harvester/block"
},
"facing=south,waterlogged=true": {
"model": "create:block/mechanical_harvester/block",
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/mechanical_harvester/block",
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/mechanical_harvester/block",
"y": 90
}

View file

@ -1,17 +1,32 @@
{
"variants": {
"facing=north": {
"facing=north,waterlogged=false": {
"model": "create:block/mechanical_plough"
},
"facing=south": {
"facing=south,waterlogged=false": {
"model": "create:block/mechanical_plough",
"y": 180
},
"facing=west": {
"facing=west,waterlogged=false": {
"model": "create:block/mechanical_plough",
"y": 270
},
"facing=east": {
"facing=east,waterlogged=false": {
"model": "create:block/mechanical_plough",
"y": 90
},
"facing=north,waterlogged=true": {
"model": "create:block/mechanical_plough"
},
"facing=south,waterlogged=true": {
"model": "create:block/mechanical_plough",
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/mechanical_plough",
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/mechanical_plough",
"y": 90
}

View file

@ -0,0 +1,34 @@
{
"variants": {
"facing=north,waterlogged=false": {
"model": "create:block/mechanical_roller/block"
},
"facing=south,waterlogged=false": {
"model": "create:block/mechanical_roller/block",
"y": 180
},
"facing=west,waterlogged=false": {
"model": "create:block/mechanical_roller/block",
"y": 270
},
"facing=east,waterlogged=false": {
"model": "create:block/mechanical_roller/block",
"y": 90
},
"facing=north,waterlogged=true": {
"model": "create:block/mechanical_roller/block"
},
"facing=south,waterlogged=true": {
"model": "create:block/mechanical_roller/block",
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/mechanical_roller/block",
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/mechanical_roller/block",
"y": 90
}
}
}

View file

@ -302,6 +302,7 @@
"block.create.mechanical_plough": "\u0265bno\u05DF\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW",
"block.create.mechanical_press": "ss\u01DD\u0279\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW",
"block.create.mechanical_pump": "d\u026Fn\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW",
"block.create.mechanical_roller": "\u0279\u01DD\u05DF\u05DFo\u1D1A \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW",
"block.create.mechanical_saw": "\u028D\u0250S \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW",
"block.create.metal_bracket": "\u0287\u01DD\u029E\u0254\u0250\u0279\u15FA \u05DF\u0250\u0287\u01DDW",
"block.create.metal_girder": "\u0279\u01DDp\u0279\u0131\u2141 \u05DF\u0250\u0287\u01DDW",

View file

@ -305,6 +305,7 @@
"block.create.mechanical_plough": "Mechanical Plough",
"block.create.mechanical_press": "Mechanical Press",
"block.create.mechanical_pump": "Mechanical Pump",
"block.create.mechanical_roller": "Mechanical Roller",
"block.create.mechanical_saw": "Mechanical Saw",
"block.create.metal_bracket": "Metal Bracket",
"block.create.metal_girder": "Metal Girder",
@ -879,6 +880,8 @@
"death.attack.create.fan_lava.player": "%1$s was thrown into a smelter by %2$s",
"death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill",
"death.attack.create.mechanical_drill.player": "%1$s was thrown in front of a Drill by %2$s",
"death.attack.create.mechanical_roller": "%1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "%1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw",
"death.attack.create.mechanical_saw.player": "%1$s was thrown into a Saw by %2$s",
"death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon",
@ -1056,6 +1059,10 @@
"create.contraptions.cart_movement_mode.rotate": "Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "Pause actors while rotating",
"create.contraptions.cart_movement_mode.rotation_locked": "Lock rotation",
"create.contraptions.roller_mode": "Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Rotation Direction",
"create.contraptions.clockwork.clock_hands": "Clock Hands",
"create.contraptions.clockwork.hour_first": "Hour hand first",
@ -1070,6 +1077,7 @@
"create.logistics.filter.apply": "Applied filter to %1$s.",
"create.logistics.filter.apply_click_again": "Applied filter to %1$s, click again to copy the amount.",
"create.logistics.filter.apply_count": "Applied extraction count to filter.",
"create.logistics.filter.invalid_item": "Cannot use this item here.",
"create.gui.goggles.generator_stats": "Generator Stats:",
"create.gui.goggles.kinetic_stats": "Kinetic Stats:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2700",
"_": "Missing Localizations: 2708",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough",
"block.create.mechanical_press": "UNLOCALIZED: Mechanical Press",
"block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw",
"block.create.metal_bracket": "UNLOCALIZED: Metal Bracket",
"block.create.metal_girder": "UNLOCALIZED: Metal Girder",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s",
"death.attack.create.mechanical_drill": "UNLOCALIZED: %1$s was impaled by a Mechanical Drill",
"death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s",
"death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating",
"create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction",
"create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands",
"create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.",
"create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.",
"create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:",
"create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1354",
"_": "Missing Localizations: 1362",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Mekanisk plov",
"block.create.mechanical_press": "Mekanisk presse",
"block.create.mechanical_pump": "Mekanisk pumpe",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Mekanisk sav",
"block.create.metal_bracket": "Metalbeslag",
"block.create.metal_girder": "Metalbjælke",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s blev kastet ind i en smelteovn af %2$s",
"death.attack.create.mechanical_drill": "%1$s blev spiddet af et mekanisk bor",
"death.attack.create.mechanical_drill.player": "%1$s blev kastet ind foran et bor af %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s blev skåret halvt over af en mekanisk sav",
"death.attack.create.mechanical_saw.player": "%1$s blev kastet ind i en sav af %2$s",
"death.attack.create.potato_cannon": "%1$s blev skudt af %2$ss kartoffelkanon",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Peg altid mod bevægelse",
"create.contraptions.cart_movement_mode.rotate_paused": "Stop maskiner under rotation",
"create.contraptions.cart_movement_mode.rotation_locked": "Lås rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Omdrejningsretning",
"create.contraptions.clockwork.clock_hands": "Urvisere",
"create.contraptions.clockwork.hour_first": "Timeviser først",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Anvendte filter på %1$s.",
"create.logistics.filter.apply_click_again": "Anvendte filter på %1$s, klik igen for at kopiere antal.",
"create.logistics.filter.apply_count": "Anvendte udtagningsantal til filter.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Generatorstatistik:",
"create.gui.goggles.kinetic_stats": "Kinetisk statistik:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 42",
"_": "Missing Localizations: 50",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Mechanischer Pflug",
"block.create.mechanical_press": "Mechanische Presse",
"block.create.mechanical_pump": "Mechanische Pumpe",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Mechanische Säge",
"block.create.metal_bracket": "Metallhalterung",
"block.create.metal_girder": "Metallträger",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s wurde von %2$s in einen Schmelzer geworfen",
"death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert",
"death.attack.create.mechanical_drill.player": "%1$s wurde von %2$s vor einen Bohrer gestoßen",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s wurde zersägt",
"death.attack.create.mechanical_saw.player": "%1$s wurde von %2$s in eine Säge gestoßen",
"death.attack.create.potato_cannon": "%1$s wurde von %2$s's Kartoffelkanone erschossen",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Zeige immer in Bewegungsrichtung",
"create.contraptions.cart_movement_mode.rotate_paused": "Pausiere Akteure beim drehen",
"create.contraptions.cart_movement_mode.rotation_locked": "Sperre Rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Rotationsrichtung",
"create.contraptions.clockwork.clock_hands": "Uhrzeiger",
"create.contraptions.clockwork.hour_first": "Stundenzeiger zuerst",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Filter angewendet auf %1$s.",
"create.logistics.filter.apply_click_again": "Filter angewendet auf %1$s, klicke nochmal um Menge zu kopieren.",
"create.logistics.filter.apply_count": "Extraktionsmenge auf Filter angewendet.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Generator Statistik:",
"create.gui.goggles.kinetic_stats": "Kinetische Statistik:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1061",
"_": "Missing Localizations: 1069",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Arador Mecánico",
"block.create.mechanical_press": "Prensa Mecánica",
"block.create.mechanical_pump": "Bomba Mecánica",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Sierra Mecánica",
"block.create.metal_bracket": "Soporte Metálico",
"block.create.metal_girder": "UNLOCALIZED: Metal Girder",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s fué tirado dentro de una derretidora por %2$s",
"death.attack.create.mechanical_drill": "%1$s fué empalado por un Taladro Mecánico",
"death.attack.create.mechanical_drill.player": "%1$s fué tirado en frente de un Taladro por %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s fué cortado por la mitad por Sierra Mecánica",
"death.attack.create.mechanical_saw.player": "%1$s fué lanzado dentro de una Sierra por %2$s",
"death.attack.create.potato_cannon": "%1$s fue disparado por el Cañón de Papas de %2$s",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Siempre apuntar en la dirección de movimiento",
"create.contraptions.cart_movement_mode.rotate_paused": "Pausar actores mientras rota",
"create.contraptions.cart_movement_mode.rotation_locked": "Bloquear Rotación",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Dirección de Rotación",
"create.contraptions.clockwork.clock_hands": "Manijas del Reloj",
"create.contraptions.clockwork.hour_first": "Horario Primero",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Filtro Aplicado a %1$s.",
"create.logistics.filter.apply_click_again": "Filtro Aplicado a %1$s, haz click de nuevo para copiar la cantidad.",
"create.logistics.filter.apply_count": "Recuento de extracción aplicado al filtro.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Estadísticas de Generación:",
"create.gui.goggles.kinetic_stats": "Estadísticas Kineticas:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 106",
"_": "Missing Localizations: 114",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Arado mecánico",
"block.create.mechanical_press": "Prensa mecánica",
"block.create.mechanical_pump": "Bomba mecánica",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Sierra mecánica",
"block.create.metal_bracket": "Soporte de metal para ejes",
"block.create.metal_girder": "Viga de metal",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s fue arrojado a una fundición por %2$s",
"death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico",
"death.attack.create.mechanical_drill.player": "%1$s fue lanzado frente a un taladro por %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica",
"death.attack.create.mechanical_saw.player": "%1$s fue arrojado a una sierra por %2$s",
"death.attack.create.potato_cannon": "%1$s fue disparado por el cañón de patatas de %2$s's",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Siempre de cara al movimiento",
"create.contraptions.cart_movement_mode.rotate_paused": "Pausar a los actores mientras giran",
"create.contraptions.cart_movement_mode.rotation_locked": "Bloquear rotación",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Dirección de rotación",
"create.contraptions.clockwork.clock_hands": "Manecillas de reloj",
"create.contraptions.clockwork.hour_first": "La manecilla de las horas primero",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Filtro aplicado a %1$s.",
"create.logistics.filter.apply_click_again": "Filtro aplicado a %1$s, haga clic de nuevo para copiar la cantidad.",
"create.logistics.filter.apply_count": "Aplicado recuento de extracciones al filtro.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Estadísticas del generador:",
"create.gui.goggles.kinetic_stats": "Estadísticas cinéticas:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 106",
"_": "Missing Localizations: 114",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Arado mecánico",
"block.create.mechanical_press": "Prensa mecánica",
"block.create.mechanical_pump": "Bomba mecánica",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Sierra mecánica",
"block.create.metal_bracket": "Soporte de metal para ejes",
"block.create.metal_girder": "Viga de metal",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s fue arrojado a una fundición por %2$s",
"death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico",
"death.attack.create.mechanical_drill.player": "%1$s fue lanzado frente a un taladro por %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica",
"death.attack.create.mechanical_saw.player": "%1$s fue arrojado a una sierra por %2$s",
"death.attack.create.potato_cannon": "%1$s fue disparado por el cañón de papas de %2$s's",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Siempre de cara al movimiento",
"create.contraptions.cart_movement_mode.rotate_paused": "Pausar a los actores mientras giran",
"create.contraptions.cart_movement_mode.rotation_locked": "Bloquear rotación",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Dirección de rotación",
"create.contraptions.clockwork.clock_hands": "Manecillas de reloj",
"create.contraptions.clockwork.hour_first": "La manecilla de las horas primero",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Filtro aplicado a %1$s.",
"create.logistics.filter.apply_click_again": "Filtro aplicado a %1$s, haga clic de nuevo para copiar la cantidad.",
"create.logistics.filter.apply_count": "Aplicado recuento de extracciones al filtro.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Estadísticas del generador:",
"create.gui.goggles.kinetic_stats": "Estadísticas cinéticas:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 42",
"_": "Missing Localizations: 50",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Charrue mécanique",
"block.create.mechanical_press": "Presse mécanique",
"block.create.mechanical_pump": "Pompe mécanique",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Scie mécanique",
"block.create.metal_bracket": "Support en métal",
"block.create.metal_girder": "Poutre en métal",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s a été lancé(e) dans un ventilateur de lave par %2$s",
"death.attack.create.mechanical_drill": "%1$s a été empalé(e) par une perceuse mécanique",
"death.attack.create.mechanical_drill.player": "%1$s a été lancé(e) devant une perceuse mécanique par %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s a été coupé(e) en deux par une scie mécanique",
"death.attack.create.mechanical_saw.player": "%1$s a été lancé(e) devant une scie mécanique par %2$s",
"death.attack.create.potato_cannon": "%1$s s'est fait tirer dessus par le canon à pomme de terre de %2$s",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Toujours face au mouvement",
"create.contraptions.cart_movement_mode.rotate_paused": "Mettre en pause les acteurs pendant une rotation",
"create.contraptions.cart_movement_mode.rotation_locked": "Verrouiller la rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Direction de la rotation",
"create.contraptions.clockwork.clock_hands": "Aiguilles",
"create.contraptions.clockwork.hour_first": "Aiguille des heures en premier",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Filtre appliqué à %1$s.",
"create.logistics.filter.apply_click_again": "Filtre appliqué à %1$s, appuyez de nouveau pour copier le montant.",
"create.logistics.filter.apply_count": "Montant d'extraction appliqué au filtre",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Statistiques du générateur :",
"create.gui.goggles.kinetic_stats": "Statistiques cinétiques :",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 773",
"_": "Missing Localizations: 781",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Szántógép",
"block.create.mechanical_press": "Présgép",
"block.create.mechanical_pump": "Szivattyú",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Fűrészgép",
"block.create.metal_bracket": "Fémkeret",
"block.create.metal_girder": "Fémgerenda",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s egy tüzes légáramba lépett, miközben %2$s elől menekült",
"death.attack.create.mechanical_drill": "%1$s egy fúrógép előtt lyukadt ki",
"death.attack.create.mechanical_drill.player": "%1$s egy fúrógép elé ugrott %2$s elől",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s ketté lett fűrészelve",
"death.attack.create.mechanical_saw.player": "%1$s egy fűrészgép elé ugrott %2$s elől",
"death.attack.create.potato_cannon": "%2$s lelőtte %1$s játékost egy krumpliágyúval",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Mindig a menetirány felé",
"create.contraptions.cart_movement_mode.rotate_paused": "Aktorok leállítása kanyarodáskor",
"create.contraptions.cart_movement_mode.rotation_locked": "Tájolás rögzítése",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Forgási irány",
"create.contraptions.clockwork.clock_hands": "Óramutatók",
"create.contraptions.clockwork.hour_first": "Óramutató először",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Szűrő alkalmazva ehhez: %1$s",
"create.logistics.filter.apply_click_again": "Szűrő alkalmazva ehhez: %1$s, kattints ismét az érték másolásához.",
"create.logistics.filter.apply_count": "A szűrőhöz alkalmazott kivonatszám.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Meghajtás adatai:",
"create.gui.goggles.kinetic_stats": "Alkatrész adatai:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 42",
"_": "Missing Localizations: 50",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Aratro meccanico",
"block.create.mechanical_press": "Pressa meccanica",
"block.create.mechanical_pump": "Pompa meccanica",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Sega meccanica",
"block.create.metal_bracket": "Supporto di metallo",
"block.create.metal_girder": "Trave di metallo",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s è stato gettato in una fonderia da %2$s",
"death.attack.create.mechanical_drill": "%1$s è stato trafitto da una trivella meccanica",
"death.attack.create.mechanical_drill.player": "%1$s è stato gettato di fronte a una trivella da by %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s è stato tagliato a metà",
"death.attack.create.mechanical_saw.player": "%1$s è stato gettato su una Sega meccanica da %2$s",
"death.attack.create.potato_cannon": "%1$s è stato ucciso dal Cannone a patate di %2$s",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Sempre rivolto verso il movimento",
"create.contraptions.cart_movement_mode.rotate_paused": "Pausa durante la rotazione",
"create.contraptions.cart_movement_mode.rotation_locked": "Blocca rotazione",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Direzione di rotazione",
"create.contraptions.clockwork.clock_hands": "Lancette dell'orologio",
"create.contraptions.clockwork.hour_first": "Prima lancetta delle ore",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Filtro applicato a %1$s.",
"create.logistics.filter.apply_click_again": "Filtro applicato a %1$s, clicca di nuovo per copiare.",
"create.logistics.filter.apply_count": "Conteggio estrazione applicato ai filtri.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Statistiche del generatore:",
"create.gui.goggles.kinetic_stats": "Statistiche cinetiche:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 71",
"_": "Missing Localizations: 79",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "メカニカルプラウ",
"block.create.mechanical_press": "メカニカルプレス",
"block.create.mechanical_pump": "メカニカルポンプ",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "メカニカルソー",
"block.create.metal_bracket": "金属ブラケット",
"block.create.metal_girder": "鉄骨",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$sは%2$sによって熱風に投げ込まれた",
"death.attack.create.mechanical_drill": "%1$sはメカニカルドリルに突き抜かれた",
"death.attack.create.mechanical_drill.player": "%1$sは%2$sにドリルの目の前に投げ込まれた",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$sはメカニカルソーで半分にカットされた",
"death.attack.create.mechanical_saw.player": "%1$sは%2$sによってメカニカルソーの回転する刃に投げ込まれた",
"death.attack.create.potato_cannon": "%1$sは%2$sのポテトキャンに撃ち抜かれた",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "常に動いている方向を向く",
"create.contraptions.cart_movement_mode.rotate_paused": "回転中に機械を一時停止する",
"create.contraptions.cart_movement_mode.rotation_locked": "常に向きを固定する",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "回転方向",
"create.contraptions.clockwork.clock_hands": "時計の針",
"create.contraptions.clockwork.hour_first": "時針を最初に",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "フィルターを%1$sに適用しました。",
"create.logistics.filter.apply_click_again": "フィルターを%1$sに適用しました。再度クリックすると数量をコピーします",
"create.logistics.filter.apply_count": "搬出入数をフィルターに適用しました。",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "原動機の統計:",
"create.gui.goggles.kinetic_stats": "動力の統計:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 50",
"_": "Missing Localizations: 58",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "쟁기",
"block.create.mechanical_press": "압착기",
"block.create.mechanical_pump": "펌프",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "톱",
"block.create.metal_bracket": "금속 지지대",
"block.create.metal_girder": "금속 거더",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s이(가) %2$s 때문에 용암 바람으로 재가 되었습니다",
"death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다",
"death.attack.create.mechanical_drill.player": "%1$s이(가) %2$s 때문에 드릴에 관통당했습니다",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다",
"death.attack.create.mechanical_saw.player": "%1$s이(가) %2$s 때문에 톱날에 반으로 갈라져 죽었습니다",
"death.attack.create.potato_cannon": "%1$s이(가) %2$s의 감자포에 맞고 죽었습니다.",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "구조물이 항상 전방을 향함",
"create.contraptions.cart_movement_mode.rotate_paused": "수레가 회전할때 구조물이 행동을 멈춤",
"create.contraptions.cart_movement_mode.rotation_locked": "구조물이 회전하지 않음",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "회전 방향",
"create.contraptions.clockwork.clock_hands": "시계침",
"create.contraptions.clockwork.hour_first": "시침 먼저",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "%1$s에 필터를 적용했습니다",
"create.logistics.filter.apply_click_again": "%1$s에 필터를 적용했습니다. 다시 클릭하면 가지고 있는 아이템의 수량을 복사하여 필터에 적용합니다",
"create.logistics.filter.apply_count": "필터에 수량을 적용했습니다",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "동력 상태:",
"create.gui.goggles.kinetic_stats": "작동 상태:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1832",
"_": "Missing Localizations: 1840",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Mechanische Ploeg",
"block.create.mechanical_press": "Mechanische Pers",
"block.create.mechanical_pump": "Mechanische Pomp",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Mechanische Zaag",
"block.create.metal_bracket": "Metalen Steun",
"block.create.metal_girder": "Metalen Draagbalk",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s",
"death.attack.create.mechanical_drill": "%1$s is gespietst door een mechanische boor",
"death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s",
"death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating",
"create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction",
"create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands",
"create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.",
"create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.",
"create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:",
"create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2360",
"_": "Missing Localizations: 2368",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Mekanisk plog",
"block.create.mechanical_press": "UNLOCALIZED: Mechanical Press",
"block.create.mechanical_pump": "Mekanisk pumpe",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Mekanisk sag",
"block.create.metal_bracket": "Metallbrakett",
"block.create.metal_girder": "UNLOCALIZED: Metal Girder",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s",
"death.attack.create.mechanical_drill": "UNLOCALIZED: %1$s was impaled by a Mechanical Drill",
"death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s",
"death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating",
"create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction",
"create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands",
"create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.",
"create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.",
"create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:",
"create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 51",
"_": "Missing Localizations: 59",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Mechaniczny pług",
"block.create.mechanical_press": "Mechaniczna prasa",
"block.create.mechanical_pump": "Mechaniczna pompa",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Mechaniczna piła",
"block.create.metal_bracket": "Metalowy wspornik",
"block.create.metal_girder": "Metalowa belka",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "Gracz %1$s został wepchnięty w strumień kropel lawy przez %2$s",
"death.attack.create.mechanical_drill": "Gracz %1$s nabił się na mechaniczne wiertło",
"death.attack.create.mechanical_drill.player": "Gracz %1$s został wepchnięty na mechaniczne wiertło przez %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "Gracz %1$s został przecięty na pół przez mechaniczną piłę",
"death.attack.create.mechanical_saw.player": "Gracz %1$s został wepchnięty na mechaniczną piłę przez %2$s",
"death.attack.create.potato_cannon": "Gracz %1$s został zestrzelowny przez armate na ziemniaki należącą do %2$s",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Zawsze kieruj w stronę ruchu",
"create.contraptions.cart_movement_mode.rotate_paused": "Zatrzymaj komponenty podczas obrotu",
"create.contraptions.cart_movement_mode.rotation_locked": "Zablokuj obrót",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Kierunek obrotu",
"create.contraptions.clockwork.clock_hands": "Wskazówki zegara",
"create.contraptions.clockwork.hour_first": "Najpierw wskazówka godzinowa",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Zastosowano filtr na %1$s.",
"create.logistics.filter.apply_click_again": "Zastosowano filtr na %1$s; kliknij ponownie, aby skopiować ilość.",
"create.logistics.filter.apply_count": "Zastosowano limit wyciągania do filtra.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Właściwości generatora:",
"create.gui.goggles.kinetic_stats": "Właściwości kinetyczne:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 47",
"_": "Missing Localizations: 55",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Arador Mecânico",
"block.create.mechanical_press": "Prensa Mecânica",
"block.create.mechanical_pump": "Bomba Mecânica",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Serra Mecânica",
"block.create.metal_bracket": "Suporte de metal",
"block.create.metal_girder": "Viga de metal",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "U%1$s foi jogado numa fundidora por %2$s",
"death.attack.create.mechanical_drill": "%1$s foi empalado pela Broca Mecânica",
"death.attack.create.mechanical_drill.player": "%1$s foi jogado na frente de uma broca por %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s foi cortado ao meio por uma serra mecânica",
"death.attack.create.mechanical_saw.player": "%1$s foi jogado numa serra por %2$s",
"death.attack.create.potato_cannon": "%1$s foi atirado pelo canhão de batatas do %2$",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Sempre apontar para a direção do movimento",
"create.contraptions.cart_movement_mode.rotate_paused": "Pausar atores quando girando",
"create.contraptions.cart_movement_mode.rotation_locked": "Travar a rotação",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Direção da rotação",
"create.contraptions.clockwork.clock_hands": "Ponteiros do relógio",
"create.contraptions.clockwork.hour_first": "Ponteiro da hora primeiro",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Aplicou filtro para %1$s.",
"create.logistics.filter.apply_click_again": "Aplicou filtro para %1$s, Clique denovo para copiar quantidade.",
"create.logistics.filter.apply_count": "Aplicou quantidade de extração para o filtro.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Estatísticas do gerador:",
"create.gui.goggles.kinetic_stats": "Estatísticas cinéticas:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2254",
"_": "Missing Localizations: 2262",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Arador Mecânico",
"block.create.mechanical_press": "Prensa Mecânica",
"block.create.mechanical_pump": "Bomba Mecânica",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Serra Mecânica",
"block.create.metal_bracket": "Suporte de metal",
"block.create.metal_girder": "UNLOCALIZED: Metal Girder",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "U%1$s foi jogado numa fundidora por %2$s",
"death.attack.create.mechanical_drill": "%1$s foi empalado pela Broca Mecânica",
"death.attack.create.mechanical_drill.player": "%1$s foi jogado na frente de uma broca por %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s foi cortado ao meio por uma serra mecânica",
"death.attack.create.mechanical_saw.player": "%1$s foi jogado numa serra por %2$s",
"death.attack.create.potato_cannon": "%1$s foi atirado pelo canhão de batatas do %2$",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating",
"create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction",
"create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands",
"create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.",
"create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.",
"create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Estatísticas do gerador:",
"create.gui.goggles.kinetic_stats": "Estatísticas cinéticas:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 741",
"_": "Missing Localizations: 749",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Plug Mecanic",
"block.create.mechanical_press": "Presă Mecanică",
"block.create.mechanical_pump": "Pompă Mecanică",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Ferăstrău Mecanic",
"block.create.metal_bracket": "Brachetă De Metal",
"block.create.metal_girder": "UNLOCALIZED: Metal Girder",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s a fost aruncat într-un topitor de către %2$s",
"death.attack.create.mechanical_drill": "%1$s a fost tras în țeapă de către un Burghiu Mecanic",
"death.attack.create.mechanical_drill.player": "%1$s a fost aruncat în fața unui Burghiu de către %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s a fost tăiat în jumătate de către un Ferăstrău Mecanic",
"death.attack.create.mechanical_saw.player": "%1$s a fost aruncat într-un Ferăstrău de către %2$s",
"death.attack.create.potato_cannon": "%1$s a fost împușcat de către Tunul De Cartofi al lui %2$s",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Mereu stă cu fața spre mișcare",
"create.contraptions.cart_movement_mode.rotate_paused": "Oprește Actorii când se rotește",
"create.contraptions.cart_movement_mode.rotation_locked": "Blochează Rotația",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Direcție De Rotație",
"create.contraptions.clockwork.clock_hands": "Ace de Ceas",
"create.contraptions.clockwork.hour_first": "Acul orei primul",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Filtru aplicat la %1$s.",
"create.logistics.filter.apply_click_again": "Filtru aplicat la %1$s, click din nou pentru a copia cantitatea.",
"create.logistics.filter.apply_count": "Număr de extracție applicat la filtru.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Statistici Generator:",
"create.gui.goggles.kinetic_stats": "Statistici Cinetice:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 47",
"_": "Missing Localizations: 55",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Механический плуг",
"block.create.mechanical_press": "Механический пресс",
"block.create.mechanical_pump": "Механическая помпа",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Механическая пила",
"block.create.metal_bracket": "Металлическая скоба",
"block.create.metal_girder": "Металлическая балка",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s был сожжён огненным потоком благодаря %2$s",
"death.attack.create.mechanical_drill": "%1$s был пронзён механической дрелью",
"death.attack.create.mechanical_drill.player": "%1$s был пронзён механической дрелью благодаря %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой",
"death.attack.create.mechanical_saw.player": "%1$s был разрезан пополам механической пилой благодаря %2$s",
"death.attack.create.potato_cannon": "%1$s был застрелен из картофельной пушки %2$s",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Вращение в сторону движения",
"create.contraptions.cart_movement_mode.rotate_paused": "Пауза во время вращения",
"create.contraptions.cart_movement_mode.rotation_locked": "Блокировка вращения",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Направление вращения",
"create.contraptions.clockwork.clock_hands": "Формат часов",
"create.contraptions.clockwork.hour_first": "Сначала часовая стрелка",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Фильтр применён (%1$s)",
"create.logistics.filter.apply_click_again": "Фильтр применён (%1$s); кликните ещё раз, чтобы скопировать количество",
"create.logistics.filter.apply_count": "Применено извлекаемое количество к фильтру",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Статистика генератора:",
"create.gui.goggles.kinetic_stats": "Кинетическая статистика:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1250",
"_": "Missing Localizations: 1258",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Mekanisk Plog",
"block.create.mechanical_press": "Mekanisk Tryckpress",
"block.create.mechanical_pump": "Mekanisk Pump",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Mekanisk Såg",
"block.create.metal_bracket": "Metallfäste",
"block.create.metal_girder": "Metallbalk",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s slängdes in i en smältare av %2$s",
"death.attack.create.mechanical_drill": "%1$s skar sig ordentligt av en Mekanisk Borr",
"death.attack.create.mechanical_drill.player": "%1$s slängdes in en Borr av %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s blev halverad av en Mekanisk Såg",
"death.attack.create.mechanical_saw.player": "%1$s kastades in i en Såg av %2$s",
"death.attack.create.potato_cannon": "%1$s blev skjuten av %2$ss Potatis Kanon",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Alltid riktad mot rörelse",
"create.contraptions.cart_movement_mode.rotate_paused": "Pausa aktörer vid rotation",
"create.contraptions.cart_movement_mode.rotation_locked": "Lås rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Rotationsriktning",
"create.contraptions.clockwork.clock_hands": "Klockvisare",
"create.contraptions.clockwork.hour_first": "Timvisaren först",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Tillämpade filter till %1$s.",
"create.logistics.filter.apply_click_again": "Tillämpade filter på %1$s, klicka igen för att kopiera beloppet.",
"create.logistics.filter.apply_count": "Applicerade antal extraheringar för filter.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Generator Statistik:",
"create.gui.goggles.kinetic_stats": "Kinetisk Statistik:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2711",
"_": "Missing Localizations: 2719",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough",
"block.create.mechanical_press": "UNLOCALIZED: Mechanical Press",
"block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw",
"block.create.metal_bracket": "UNLOCALIZED: Metal Bracket",
"block.create.metal_girder": "UNLOCALIZED: Metal Girder",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s",
"death.attack.create.mechanical_drill": "UNLOCALIZED: %1$s was impaled by a Mechanical Drill",
"death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw",
"death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s",
"death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating",
"create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction",
"create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands",
"create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.",
"create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.",
"create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:",
"create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 215",
"_": "Missing Localizations: 223",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "Механічний плуг",
"block.create.mechanical_press": "Механічний прес",
"block.create.mechanical_pump": "Механічний насос",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "Механічна пила",
"block.create.metal_bracket": "Металевий кронштейн",
"block.create.metal_girder": "Металевий брус",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%2$s скинув %1$s в плавильню",
"death.attack.create.mechanical_drill": "%1$s простромлено механічним буром",
"death.attack.create.mechanical_drill.player": "%2$s скинув %1$s попереду механічного бура",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s розрізано навпіл механічною пилою",
"death.attack.create.mechanical_saw.player": "%2$s скинув %1$s на пилу",
"death.attack.create.potato_cannon": "%2$s застрелив %1$s картопляною гарматою",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "Завжди бути повернутим в напрямку руху",
"create.contraptions.cart_movement_mode.rotate_paused": "Призупинити прилади під час обертання",
"create.contraptions.cart_movement_mode.rotation_locked": "Заблокувати обертання",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Напрям обертання",
"create.contraptions.clockwork.clock_hands": "Стрілки годинника",
"create.contraptions.clockwork.hour_first": "Спочатку годинна стрілка",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "Фільтр застосовано до блоку %1$s.",
"create.logistics.filter.apply_click_again": "Фільтр застосовано до блоку %1$s, натисніть ще раз, щоб скопіювати кількість.",
"create.logistics.filter.apply_count": "До фільтра застосовано кількість вилучення",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "Статистика генератора:",
"create.gui.goggles.kinetic_stats": "Кінетична статистика:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 50",
"_": "Missing Localizations: 58",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "动力犁",
"block.create.mechanical_press": "动力辊压机",
"block.create.mechanical_pump": "动力泵",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "动力锯",
"block.create.metal_bracket": "金属支架",
"block.create.metal_girder": "金属梁",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s被%2$s扔进了冶炼炉",
"death.attack.create.mechanical_drill": "%1$s被钻头刺穿了",
"death.attack.create.mechanical_drill.player": "%1$s被%2$s扔到钻头前",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s被动力锯切成了两截",
"death.attack.create.mechanical_saw.player": "%1$s被%2$s扔到动力锯上",
"death.attack.create.potato_cannon": "%1$s被%2$s的土豆加农炮射杀",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "始终面朝前进方向",
"create.contraptions.cart_movement_mode.rotate_paused": "矿车转向时机器停止工作",
"create.contraptions.cart_movement_mode.rotation_locked": "旋转锁定",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "旋转方向",
"create.contraptions.clockwork.clock_hands": "钟表指针",
"create.contraptions.clockwork.hour_first": "时针优先",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "已将过滤应用于%1$s",
"create.logistics.filter.apply_click_again": "已将过滤应用于%1$s再次点击可将手持物品数量复制到过滤器上",
"create.logistics.filter.apply_count": "已将提取数量应用至过滤器",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "应力发生器状态:",
"create.gui.goggles.kinetic_stats": "动力学状态:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 48",
"_": "Missing Localizations: 56",
"_": "->------------------------] Game Elements [------------------------<-",
@ -306,6 +306,7 @@
"block.create.mechanical_plough": "機械犁",
"block.create.mechanical_press": "機械鍛壓機",
"block.create.mechanical_pump": "機械幫浦",
"block.create.mechanical_roller": "UNLOCALIZED: Mechanical Roller",
"block.create.mechanical_saw": "機械圓鋸機",
"block.create.metal_bracket": "金屬支架",
"block.create.metal_girder": "金屬樑",
@ -880,6 +881,8 @@
"death.attack.create.fan_lava.player": "%1$s 被 %2$s 推進岩漿",
"death.attack.create.mechanical_drill": "%1$s 被鑽頭鑽爆腦袋",
"death.attack.create.mechanical_drill.player": "%1$s 被 %2$s 當成礦物放在鑽頭前面而死",
"death.attack.create.mechanical_roller": "UNLOCALIZED: %1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "UNLOCALIZED: %1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s 被鋸切成了兩半",
"death.attack.create.mechanical_saw.player": "%1$s 被 %2$s 鋸掉了",
"death.attack.create.potato_cannon": "%1$s 被 %2$s 的馬鈴薯大砲餵飽了",
@ -1057,6 +1060,10 @@
"create.contraptions.cart_movement_mode.rotate": "結構與礦車保持相同方向",
"create.contraptions.cart_movement_mode.rotate_paused": "礦車轉向時機器停止工作",
"create.contraptions.cart_movement_mode.rotation_locked": "結構方向保持不變",
"create.contraptions.roller_mode": "UNLOCALIZED: Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "UNLOCALIZED: Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "UNLOCALIZED: Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "UNLOCALIZED: Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "旋轉方向",
"create.contraptions.clockwork.clock_hands": "鐘錶指針",
"create.contraptions.clockwork.hour_first": "時針優先",
@ -1071,6 +1078,7 @@
"create.logistics.filter.apply": "將過濾器應用來 %1$s",
"create.logistics.filter.apply_click_again": "將過濾器應用來 %1$s再次點擊以複製數量",
"create.logistics.filter.apply_count": "使用提取計數過濾",
"create.logistics.filter.invalid_item": "UNLOCALIZED: Cannot use this item here.",
"create.gui.goggles.generator_stats": "發動機狀態:",
"create.gui.goggles.kinetic_stats": "動力學狀態:",

View file

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

View file

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

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "create:mechanical_roller"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,22 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"A",
"C",
"I"
],
"key": {
"C": {
"item": "create:andesite_casing"
},
"A": {
"item": "create:electron_tube"
},
"I": {
"item": "create:crushing_wheel"
}
},
"result": {
"item": "create:mechanical_roller"
}
}

View file

@ -56,6 +56,7 @@
"create:elevator_contact",
"create:mechanical_harvester",
"create:mechanical_plough",
"create:mechanical_roller",
"create:white_seat",
"create:orange_seat",
"create:magenta_seat",

View file

@ -105,6 +105,7 @@
"create:elevator_contact",
"create:mechanical_harvester",
"create:mechanical_plough",
"create:mechanical_roller",
"create:andesite_casing",
"create:brass_casing",
"create:copper_casing",

View file

@ -18,6 +18,8 @@ import com.simibubi.create.content.contraptions.components.actors.PSIInstance;
import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceBlockEntity;
import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceBlockEntity;
import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceRenderer;
import com.simibubi.create.content.contraptions.components.actors.RollerBlockEntity;
import com.simibubi.create.content.contraptions.components.actors.RollerRenderer;
import com.simibubi.create.content.contraptions.components.actors.controls.ContraptionControlsBlockEntity;
import com.simibubi.create.content.contraptions.components.actors.controls.ContraptionControlsRenderer;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockBlockEntity;
@ -535,6 +537,12 @@ public class AllBlockEntityTypes {
.renderer(() -> HarvesterRenderer::new)
.register();
public static final BlockEntityEntry<RollerBlockEntity> MECHANICAL_ROLLER =
REGISTRATE.blockEntity("mechanical_roller", RollerBlockEntity::new)
.validBlocks(AllBlocks.MECHANICAL_ROLLER)
.renderer(() -> RollerRenderer::new)
.register();
public static final BlockEntityEntry<PortableItemInterfaceBlockEntity> PORTABLE_STORAGE_INTERFACE =
REGISTRATE
.blockEntity("portable_storage_interface", PortableItemInterfaceBlockEntity::new)

View file

@ -53,6 +53,9 @@ public class AllBlockPartials {
BELT_FUNNEL_FLAP = block("belt_funnel/flap"), BELT_TUNNEL_FLAP = block("belt_tunnel/flap"),
FLEXPEATER_INDICATOR = block("diodes/indicator"),
ROLLER_WHEEL = block("mechanical_roller/wheel"),
ROLLER_FRAME = block("mechanical_roller/frame"),
CUCKOO_MINUTE_HAND = block("cuckoo_clock/minute_hand"), CUCKOO_HOUR_HAND = block("cuckoo_clock/hour_hand"),
CUCKOO_LEFT_DOOR = block("cuckoo_clock/left_door"), CUCKOO_RIGHT_DOOR = block("cuckoo_clock/right_door"),
CUCKOO_PIG = block("cuckoo_clock/pig"), CUCKOO_CREEPER = block("cuckoo_clock/creeper"),

View file

@ -26,6 +26,8 @@ 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.RollerBlock;
import com.simibubi.create.content.contraptions.components.actors.RollerMovementBehaviour;
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.SeatInteractionBehaviour;
@ -1356,6 +1358,19 @@ public class AllBlocks {
.simpleItem()
.register();
public static final BlockEntry<RollerBlock> MECHANICAL_ROLLER =
REGISTRATE.block("mechanical_roller", RollerBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.color(MaterialColor.COLOR_GRAY)
.noOcclusion())
.transform(axeOrPickaxe())
.onRegister(movementBehaviour(new RollerMovementBehaviour()))
.blockstate(BlockStateGen.horizontalBlockProvider(true))
.addLayer(() -> RenderType::cutoutMipped)
.item()
.transform(customItemModel())
.register();
public static final DyedBlockList<SeatBlock> SEATS = new DyedBlockList<>(colour -> {
String colourName = colour.getSerializedName();
SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour();
@ -1700,8 +1715,7 @@ public class AllBlocks {
public static final BlockEntry<ItemVaultBlock> ITEM_VAULT = REGISTRATE.block("item_vault", ItemVaultBlock::new)
.initialProperties(SharedProperties::softMetal)
.properties(p -> p.color(
MaterialColor.TERRACOTTA_BLUE))
.properties(p -> p.color(MaterialColor.TERRACOTTA_BLUE))
.properties(p -> p.sound(SoundType.NETHERITE_BLOCK)
.explosionResistance(1200))
.transform(pickaxeOnly())

View file

@ -49,6 +49,7 @@ public class AllShapes {
.forDirectional(),
SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(),
HARVESTER_BASE = shape(0, 2, 0, 16, 14, 3).forDirectional(SOUTH),
ROLLER_BASE = shape(0, 0, 0, 16, 16, 10).forDirectional(SOUTH),
NOZZLE = shape(2, 0, 2, 14, 14, 14).add(1, 13, 1, 15, 15, 15)
.erase(3, 13, 3, 13, 15, 13)
.forDirectional(),

View file

@ -4,6 +4,7 @@ import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllShapes;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
import com.simibubi.create.foundation.utility.BlockHelper;
import net.minecraft.MethodsReturnNonnullByDefault;
@ -13,21 +14,25 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public abstract class AttachedActorBlock extends HorizontalDirectionalBlock implements IWrenchable {
public abstract class AttachedActorBlock extends HorizontalDirectionalBlock
implements IWrenchable, ProperWaterloggedBlock {
protected AttachedActorBlock(Properties p_i48377_1_) {
super(p_i48377_1_);
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false));
}
@Override
@ -43,7 +48,7 @@ public abstract class AttachedActorBlock extends HorizontalDirectionalBlock impl
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
builder.add(FACING);
builder.add(FACING, WATERLOGGED);
super.createBlockStateDefinition(builder);
}
@ -57,17 +62,29 @@ public abstract class AttachedActorBlock extends HorizontalDirectionalBlock impl
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
Direction facing;
if (context.getClickedFace().getAxis().isVertical())
facing = context.getHorizontalDirection().getOpposite();
if (context.getClickedFace()
.getAxis()
.isVertical())
facing = context.getHorizontalDirection()
.getOpposite();
else {
BlockState blockState =
context.getLevel().getBlockState(context.getClickedPos().relative(context.getClickedFace().getOpposite()));
BlockState blockState = context.getLevel()
.getBlockState(context.getClickedPos()
.relative(context.getClickedFace()
.getOpposite()));
if (blockState.getBlock() instanceof AttachedActorBlock)
facing = blockState.getValue(FACING);
else
facing = context.getClickedFace();
}
return defaultBlockState().setValue(FACING, facing);
return withWater(defaultBlockState().setValue(FACING, facing), context);
}
@Override
public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState,
LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) {
updateWater(pLevel, pState, pCurrentPos);
return pState;
}
@Override
@ -75,4 +92,9 @@ public abstract class AttachedActorBlock extends HorizontalDirectionalBlock impl
return false;
}
@Override
public FluidState getFluidState(BlockState pState) {
return fluidState(pState);
}
}

View file

@ -40,9 +40,9 @@ public class BlockBreakingMovementBehaviour implements MovementBehaviour {
damageEntities(context, pos, world);
if (world.isClientSide)
return;
if (!canBreak(world, pos, stateVisited))
return;
context.data.put("BreakingPos", NbtUtils.writeBlockPos(pos));
context.stall = true;
}
@ -180,7 +180,7 @@ public class BlockBreakingMovementBehaviour implements MovementBehaviour {
return;
}
float breakSpeed = Mth.clamp(Math.abs(context.getAnimationSpeed()) / 500f, 1 / 128f, 16f);
float breakSpeed = getBlockBreakingSpeed(context);
destroyProgress += Mth.clamp((int) (breakSpeed / blockHardness), 1, 10 - destroyProgress);
world.playSound(null, breakingPos, stateToBreak.getSoundType()
.getHitSound(), SoundSource.NEUTRAL, .25f, 1);
@ -199,7 +199,7 @@ public class BlockBreakingMovementBehaviour implements MovementBehaviour {
context.stall = false;
if (shouldDestroyStartBlock(stateToBreak))
BlockHelper.destroyBlock(context.world, breakingPos, 1f, stack -> this.dropItem(context, stack));
destroyBlock(context, breakingPos);
onBlockBroken(context, ogPos, stateToBreak);
ticksUntilNextProgress = -1;
data.remove("Progress");
@ -214,6 +214,14 @@ public class BlockBreakingMovementBehaviour implements MovementBehaviour {
data.putInt("Progress", destroyProgress);
}
protected void destroyBlock(MovementContext context, BlockPos breakingPos) {
BlockHelper.destroyBlock(context.world, breakingPos, 1f, stack -> this.dropItem(context, stack));
}
protected float getBlockBreakingSpeed(MovementContext context) {
return Mth.clamp(Math.abs(context.getAnimationSpeed()) / 500f, 1 / 128f, 16f);
}
protected boolean shouldDestroyStartBlock(BlockState stateToBreak) {
return true;
}

View file

@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.actors;
import com.jozufozu.flywheel.api.Material;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.simibubi.create.AllBlockPartials;
@ -18,15 +19,13 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.phys.Vec3;
public class HarvesterActorInstance extends ActorInstance {
static double oneOverRadius = 16.0 / 6.5;
static float originOffset = 1 / 16f;
static Vec3 rotOffset = new Vec3(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f);
ModelData harvester;
private Direction facing;
private float horizontalAngle;
protected float horizontalAngle;
private double rotation;
private double previousRotation;
@ -41,13 +40,25 @@ public class HarvesterActorInstance extends ActorInstance {
facing = state.getValue(BlockStateProperties.HORIZONTAL_FACING);
harvester = material.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance();
harvester = material.getModel(getRollingPartial(), state).createInstance();
horizontalAngle = facing.toYRot() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0);
harvester.setBlockLight(localBlockLight());
}
protected PartialModel getRollingPartial() {
return AllBlockPartials.HARVESTER_BLADE;
}
protected Vec3 getRotationOffset() {
return rotOffset;
}
protected double getRadius() {
return 6.5;
}
@Override
public void tick() {
super.tick();
@ -60,7 +71,7 @@ public class HarvesterActorInstance extends ActorInstance {
double arcLength = context.motion.length();
double radians = arcLength * oneOverRadius;
double radians = arcLength * 16 / getRadius();
float deg = AngleHelper.deg(radians);
@ -78,9 +89,9 @@ public class HarvesterActorInstance extends ActorInstance {
.centre()
.rotateY(horizontalAngle)
.unCentre()
.translate(rotOffset)
.translate(getRotationOffset())
.rotateX(getRotation())
.translateBack(rotOffset);
.translateBack(getRotationOffset());
}
private double getRotation() {

View file

@ -18,7 +18,6 @@ import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
@ -26,16 +25,16 @@ import net.minecraft.world.phys.Vec3;
public class HarvesterRenderer extends SafeBlockEntityRenderer<HarvesterBlockEntity> {
public HarvesterRenderer(BlockEntityRendererProvider.Context context) {
}
private static final Vec3 PIVOT = new Vec3(0, 6, 9);
public HarvesterRenderer(BlockEntityRendererProvider.Context context) {}
@Override
protected void renderSafe(HarvesterBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer,
int light, int overlay) {
BlockState blockState = be.getBlockState();
SuperByteBuffer superBuffer = CachedBufferer.partial(AllBlockPartials.HARVESTER_BLADE, blockState);
transform(be.getLevel(), blockState.getValue(HarvesterBlock.FACING), superBuffer,
be.getAnimatedSpeed());
transform(be.getLevel(), blockState.getValue(HarvesterBlock.FACING), superBuffer, be.getAnimatedSpeed(), PIVOT);
superBuffer.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped()));
}
@ -52,17 +51,16 @@ public class HarvesterRenderer extends SafeBlockEntityRenderer<HarvesterBlockEnt
speed = 0;
superBuffer.transform(matrices.getModel());
transform(context.world, facing, superBuffer, speed);
transform(context.world, facing, superBuffer, speed, PIVOT);
superBuffer
.light(matrices.getWorld(),
ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld))
.light(matrices.getWorld(), ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld))
.renderInto(matrices.getViewProjection(), buffers.getBuffer(RenderType.cutoutMipped()));
}
public static void transform(Level world, Direction facing, SuperByteBuffer superBuffer, float speed) {
public static void transform(Level world, Direction facing, SuperByteBuffer superBuffer, float speed, Vec3 pivot) {
float originOffset = 1 / 16f;
Vec3 rotOffset = new Vec3(0, -2 * originOffset, originOffset).add(VecHelper.getCenterOf(BlockPos.ZERO));
Vec3 rotOffset = new Vec3(0, pivot.y * originOffset, pivot.z * originOffset);
float time = AnimationTickHolder.getRenderTime(world) / 20;
float angle = (time * speed) % 360;

View file

@ -0,0 +1,56 @@
package com.simibubi.create.content.contraptions.components.actors;
import com.jozufozu.flywheel.api.Material;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import net.minecraft.world.phys.Vec3;
public class RollerActorInstance extends HarvesterActorInstance {
static Vec3 rotOffset = new Vec3(0.5f, -12 * originOffset + 0.5f, 8 * originOffset + 0.5f);
ModelData frame;
public RollerActorInstance(MaterialManager materialManager, VirtualRenderWorld simulationWorld,
MovementContext context) {
super(materialManager, simulationWorld, context);
Material<ModelData> material = materialManager.defaultCutout()
.material(Materials.TRANSFORMED);
frame = material.getModel(AllBlockPartials.ROLLER_FRAME, context.state)
.createInstance();
frame.setBlockLight(localBlockLight());
}
@Override
public void beginFrame() {
super.beginFrame();
frame.loadIdentity()
.translate(context.localPos)
.centre()
.rotateY(horizontalAngle)
.unCentre();
}
@Override
protected PartialModel getRollingPartial() {
return AllBlockPartials.ROLLER_WHEEL;
}
@Override
protected Vec3 getRotationOffset() {
return rotOffset;
}
@Override
protected double getRadius() {
return 16.5;
}
}

View file

@ -0,0 +1,53 @@
package com.simibubi.create.content.contraptions.components.actors;
import com.simibubi.create.AllBlockEntityTypes;
import com.simibubi.create.AllShapes;
import com.simibubi.create.foundation.block.IBE;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class RollerBlock extends AttachedActorBlock implements IBE<RollerBlockEntity> {
public static DamageSource damageSourceRoller = new DamageSource("create.mechanical_roller");
public RollerBlock(Properties p_i48377_1_) {
super(p_i48377_1_);
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
return withWater(defaultBlockState().setValue(FACING, context.getHorizontalDirection()
.getOpposite()), context);
}
@Override
public Class<RollerBlockEntity> getBlockEntityClass() {
return RollerBlockEntity.class;
}
@Override
public BlockEntityType<? extends RollerBlockEntity> getBlockEntityType() {
return AllBlockEntityTypes.MECHANICAL_ROLLER.get();
}
@Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
Direction direction = state.getValue(FACING);
return AllShapes.ROLLER_BASE.get(direction);
}
@Override
public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) {
return true;
}
}

View file

@ -0,0 +1,138 @@
package com.simibubi.create.content.contraptions.components.actors;
import java.util.List;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.blockEntity.BlockEntityBehaviour;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.scrollvalue.INamedIconOptions;
import com.simibubi.create.foundation.blockEntity.behaviour.scrollvalue.ScrollOptionBehaviour;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.StairBlock;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
public class RollerBlockEntity extends SmartBlockEntity {
// For simulations such as Ponder
private float manuallyAnimatedSpeed;
public FilteringBehaviour filtering;
public ScrollOptionBehaviour<RollingMode> mode;
public RollerBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Override
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
behaviours.add(filtering = new FilteringBehaviour(this, new RollerValueBox(4)).moveText(new Vec3(-30, 23, 10))
.withCallback(this::onFilterChanged));
behaviours.add(mode = new ScrollOptionBehaviour<RollingMode>(RollingMode.class,
Lang.translateDirect("contraptions.roller_mode"), this, new RollerValueBox(-2)));
}
protected boolean onFilterChanged(ItemStack newFilter) {
BlockState appliedState = RollerMovementBehaviour.getStateToPaveWith(newFilter);
if (appliedState.isAir())
return false;
if (appliedState.getBlock() instanceof EntityBlock)
return false;
if (appliedState.getBlock() instanceof StairBlock)
return false;
VoxelShape shape = appliedState.getShape(level, worldPosition);
if (shape.isEmpty() || !shape.bounds()
.equals(Shapes.block()
.bounds()))
return false;
VoxelShape collisionShape = appliedState.getCollisionShape(level, worldPosition);
if (collisionShape.isEmpty())
return false;
return true;
}
@Override
protected AABB createRenderBoundingBox() {
return new AABB(worldPosition).inflate(1);
}
public float getAnimatedSpeed() {
return manuallyAnimatedSpeed;
}
public void setAnimatedSpeed(float speed) {
manuallyAnimatedSpeed = speed;
}
static enum RollingMode implements INamedIconOptions {
TUNNEL_PAVE(AllIcons.I_ROLLER_PAVE),
STRAIGHT_FILL(AllIcons.I_ROLLER_FILL),
WIDE_FILL(AllIcons.I_ROLLER_WIDE_FILL),
;
private String translationKey;
private AllIcons icon;
private RollingMode(AllIcons icon) {
this.icon = icon;
translationKey = "contraptions.roller_mode." + Lang.asId(name());
}
@Override
public AllIcons getIcon() {
return icon;
}
@Override
public String getTranslationKey() {
return translationKey;
}
}
private final class RollerValueBox extends ValueBoxTransform {
private int hOffset;
public RollerValueBox(int hOffset) {
this.hOffset = hOffset;
}
@Override
protected void rotate(BlockState state, PoseStack ms) {
Direction facing = state.getValue(RollerBlock.FACING);
float yRot = AngleHelper.horizontalAngle(facing) + 180;
TransformStack.cast(ms)
.rotateY(yRot)
.rotateX(90);
}
@Override
protected Vec3 getLocalOffset(BlockState state) {
Direction facing = state.getValue(RollerBlock.FACING);
float stateAngle = AngleHelper.horizontalAngle(facing) + 180;
return VecHelper.rotateCentered(VecHelper.voxelSpace(7.75 + hOffset, 15.5f, 11), stateAngle, Axis.Y);
}
}
}

View file

@ -0,0 +1,452 @@
package com.simibubi.create.content.contraptions.components.actors;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import javax.annotation.Nullable;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.actors.RollerBlockEntity.RollingMode;
import com.simibubi.create.content.contraptions.components.actors.trackPaver.PaveTask;
import com.simibubi.create.content.contraptions.components.actors.trackPaver.TrackPaverV2;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.content.logistics.item.filter.FilterItem;
import com.simibubi.create.content.logistics.trains.TrackEdge;
import com.simibubi.create.content.logistics.trains.TrackGraph;
import com.simibubi.create.content.logistics.trains.entity.Carriage;
import com.simibubi.create.content.logistics.trains.entity.CarriageBogey;
import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity;
import com.simibubi.create.content.logistics.trains.entity.Train;
import com.simibubi.create.content.logistics.trains.entity.TravellingPoint;
import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.ITrackSelector;
import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.SteerDirection;
import com.simibubi.create.content.logistics.trains.track.StandardBogeyBlock;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.util.Mth;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.FallingBlock;
import net.minecraft.world.level.block.SlabBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.SlabType;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.registries.ForgeRegistries;
public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour {
@Override
public boolean isActive(MovementContext context) {
return super.isActive(context) && !(context.contraption instanceof PulleyContraption)
&& VecHelper.isVecPointingTowards(context.relativeMotion, context.state.getValue(RollerBlock.FACING));
}
@Override
public boolean hasSpecialInstancedRendering() {
return true;
}
@Nullable
@Override
public ActorInstance createInstance(MaterialManager materialManager, VirtualRenderWorld simulationWorld,
MovementContext context) {
return new RollerActorInstance(materialManager, simulationWorld, context);
}
@Override
public void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld,
ContraptionMatrices matrices, MultiBufferSource buffers) {
if (!ContraptionRenderDispatcher.canInstance())
RollerRenderer.renderInContraption(context, renderWorld, matrices, buffers);
}
@Override
public Vec3 getActiveAreaOffset(MovementContext context) {
return Vec3.atLowerCornerOf(context.state.getValue(RollerBlock.FACING)
.getNormal())
.scale(.45)
.subtract(0, 2, 0);
}
@Override
protected float getBlockBreakingSpeed(MovementContext context) {
return Mth.clamp(super.getBlockBreakingSpeed(context) * 4, 1 / 128f, 16f);
}
@Override
public boolean canBreak(Level world, BlockPos breakingPos, BlockState state) {
return super.canBreak(world, breakingPos, state) && !state.getCollisionShape(world, breakingPos)
.isEmpty() && !AllBlocks.TRACK.has(state);
}
@Override
protected DamageSource getDamageSource() {
return RollerBlock.damageSourceRoller;
}
@Override
public void visitNewPosition(MovementContext context, BlockPos pos) {
Level world = context.world;
BlockState stateVisited = world.getBlockState(pos);
if (!stateVisited.isRedstoneConductor(world, pos))
damageEntities(context, pos, world);
if (world.isClientSide)
return;
List<BlockPos> positionsToBreak = getPositionsToBreak(context, pos);
if (positionsToBreak.isEmpty()) {
triggerPaver(context, pos);
return;
}
BlockPos argMax = null;
double max = Double.MIN_VALUE;
for (BlockPos toBreak : positionsToBreak) {
float hardness = context.world.getBlockState(toBreak)
.getDestroySpeed(world, toBreak);
if (hardness < max)
continue;
max = hardness;
argMax = toBreak;
}
context.data.put("ReferencePos", NbtUtils.writeBlockPos(pos));
context.data.put("BreakingPos", NbtUtils.writeBlockPos(argMax));
context.stall = true;
}
@Override
protected void onBlockBroken(MovementContext context, BlockPos pos, BlockState brokenState) {
super.onBlockBroken(context, pos, brokenState);
if (!context.data.contains("ReferencePos"))
return;
BlockPos referencePos = NbtUtils.readBlockPos(context.data.getCompound("ReferencePos"));
for (BlockPos otherPos : getPositionsToBreak(context, referencePos))
if (!otherPos.equals(pos))
destroyBlock(context, otherPos);
triggerPaver(context, referencePos);
context.data.remove("ReferencePos");
}
@Override
protected void destroyBlock(MovementContext context, BlockPos breakingPos) {
BlockState blockState = context.world.getBlockState(breakingPos);
boolean noHarvest = blockState.is(BlockTags.NEEDS_IRON_TOOL) || blockState.is(BlockTags.NEEDS_STONE_TOOL)
|| blockState.is(BlockTags.NEEDS_DIAMOND_TOOL);
BlockHelper.destroyBlock(context.world, breakingPos, 1f, stack -> {
if (noHarvest || context.world.random.nextBoolean())
return;
this.dropItem(context, stack);
});
super.destroyBlock(context, breakingPos);
}
RollerTravellingPoint rollerScout = new RollerTravellingPoint();
protected List<BlockPos> getPositionsToBreak(MovementContext context, BlockPos visitedPos) {
ArrayList<BlockPos> positions = new ArrayList<>();
RollingMode mode = getMode(context);
if (mode != RollingMode.TUNNEL_PAVE)
return positions;
// Train
PaveTask profileForTracks = createHeightProfileForTracks(context);
if (profileForTracks != null) {
for (Couple<Integer> coords : profileForTracks.keys()) {
float height = profileForTracks.get(coords);
BlockPos targetPosition = new BlockPos(coords.getFirst(), height, coords.getSecond());
boolean shouldPlaceSlab = height > Math.floor(height) + .45;
for (int i = 0; i <= (shouldPlaceSlab ? 3 : 2); i++)
if (testBreakerTarget(context, targetPosition.above(i), i))
positions.add(targetPosition.above(i));
}
return positions;
}
// Otherwise
for (int i = 0; i <= 2; i++)
if (testBreakerTarget(context, visitedPos.above(i), i))
positions.add(visitedPos.above(i));
return positions;
}
protected boolean testBreakerTarget(MovementContext context, BlockPos target, int columnY) {
BlockState stateToPaveWith = getStateToPaveWith(context);
BlockState stateToPaveWithAsSlab = getStateToPaveWithAsSlab(context);
BlockState stateAbove = context.world.getBlockState(target);
if (columnY == 0 && stateAbove.is(stateToPaveWith.getBlock()))
return false;
if (stateToPaveWithAsSlab != null && columnY == 1 && stateAbove.is(stateToPaveWithAsSlab.getBlock()))
return false;
return canBreak(context.world, target, stateAbove);
}
@Nullable
protected PaveTask createHeightProfileForTracks(MovementContext context) {
if (context.contraption == null)
return null;
if (!(context.contraption.entity instanceof CarriageContraptionEntity cce))
return null;
Carriage carriage = cce.getCarriage();
if (carriage == null)
return null;
Train train = carriage.train;
if (train == null || train.graph == null)
return null;
CarriageBogey mainBogey = carriage.bogeys.getFirst();
TravellingPoint point = mainBogey.trailing();
rollerScout.node1 = point.node1;
rollerScout.node2 = point.node2;
rollerScout.edge = point.edge;
rollerScout.position = point.position;
Axis axis = Axis.X;
StructureBlockInfo info = context.contraption.getBlocks()
.get(BlockPos.ZERO);
if (info != null && info.state.hasProperty(StandardBogeyBlock.AXIS))
axis = info.state.getValue(StandardBogeyBlock.AXIS);
Direction orientation = cce.getInitialOrientation();
Direction rollerFacing = context.state.getValue(RollerBlock.FACING);
int step = orientation.getAxisDirection()
.getStep();
double widthWiseOffset = axis.choose(-context.localPos.getZ(), 0, -context.localPos.getX()) * step;
double lengthWiseOffset = axis.choose(-context.localPos.getX(), 0, context.localPos.getZ()) * step - 1;
if (rollerFacing == orientation.getClockWise())
lengthWiseOffset += 1;
double distanceToTravel = 2;
PaveTask heightProfile = new PaveTask(widthWiseOffset, widthWiseOffset);
ITrackSelector steering = rollerScout.steer(SteerDirection.NONE, new Vec3(0, 1, 0));
rollerScout.traversalCallback = (edge, coords) -> {
};
rollerScout.travel(train.graph, lengthWiseOffset + 1, steering);
rollerScout.traversalCallback =
(edge, coords) -> TrackPaverV2.pave(heightProfile, edge, coords.getFirst(), coords.getSecond());
rollerScout.travel(train.graph, distanceToTravel, steering);
for (Couple<Integer> entry : heightProfile.keys())
heightProfile.put(entry.getFirst(), entry.getSecond(), context.localPos.getY() + heightProfile.get(entry));
return heightProfile;
}
protected void triggerPaver(MovementContext context, BlockPos pos) {
BlockState stateToPaveWith = getStateToPaveWith(context);
BlockState stateToPaveWithAsSlab = getStateToPaveWithAsSlab(context);
RollingMode mode = getMode(context);
Vec3 directionVec = Vec3.atLowerCornerOf(context.state.getValue(RollerBlock.FACING)
.getClockWise()
.getNormal());
directionVec = context.rotation.apply(directionVec);
PaveResult paveResult = PaveResult.PASS;
int yOffset = 0;
List<Pair<BlockPos, Boolean>> paveSet = new ArrayList<>();
PaveTask profileForTracks = createHeightProfileForTracks(context);
if (profileForTracks == null)
paveSet.add(Pair.of(pos, false));
else
for (Couple<Integer> coords : profileForTracks.keys()) {
float height = profileForTracks.get(coords);
boolean shouldPlaceSlab = height > Math.floor(height) + .45;
BlockPos targetPosition = new BlockPos(coords.getFirst(), height, coords.getSecond());
paveSet.add(Pair.of(targetPosition, shouldPlaceSlab));
}
if (paveSet.isEmpty())
return;
while (paveResult == PaveResult.PASS) {
if (yOffset > AllConfigs.SERVER.kinetics.rollerFillDepth.get()) {
paveResult = PaveResult.FAIL;
break;
}
Set<Pair<BlockPos, Boolean>> currentLayer = new HashSet<>();
if (mode == RollingMode.WIDE_FILL) {
for (Pair<BlockPos, Boolean> anchor : paveSet) {
int radius = (yOffset + 1) / 2;
for (int i = -radius; i <= radius; i++)
for (int j = -radius; j <= radius; j++)
if (BlockPos.ZERO.distManhattan(new BlockPos(i, 0, j)) <= radius)
currentLayer.add(Pair.of(anchor.getFirst()
.offset(i, -yOffset, j), anchor.getSecond()));
}
} else
for (Pair<BlockPos, Boolean> anchor : paveSet)
currentLayer.add(Pair.of(anchor.getFirst()
.below(yOffset), anchor.getSecond()));
boolean completelyBlocked = true;
boolean anyBlockPlaced = false;
for (Pair<BlockPos, Boolean> currentPos : currentLayer) {
if (stateToPaveWithAsSlab != null && yOffset == 0 && currentPos.getSecond())
tryFill(context, currentPos.getFirst()
.above(), stateToPaveWithAsSlab);
paveResult = tryFill(context, currentPos.getFirst(), stateToPaveWith);
if (paveResult != PaveResult.FAIL)
completelyBlocked = false;
if (paveResult == PaveResult.SUCCESS)
anyBlockPlaced = true;
}
if (anyBlockPlaced)
paveResult = PaveResult.SUCCESS;
else if (!completelyBlocked || yOffset == 0)
paveResult = PaveResult.PASS;
if (paveResult == PaveResult.SUCCESS && stateToPaveWith.getBlock() instanceof FallingBlock)
paveResult = PaveResult.PASS;
if (paveResult != PaveResult.PASS)
break;
if (mode == RollingMode.TUNNEL_PAVE)
break;
yOffset++;
}
if (paveResult == PaveResult.SUCCESS) {
context.data.putInt("WaitingTicks", 2);
context.data.put("LastPos", NbtUtils.writeBlockPos(pos));
context.stall = true;
}
}
public static BlockState getStateToPaveWith(ItemStack itemStack) {
if (itemStack.getItem()instanceof BlockItem bi) {
BlockState defaultBlockState = bi.getBlock()
.defaultBlockState();
if (defaultBlockState.hasProperty(SlabBlock.TYPE))
defaultBlockState = defaultBlockState.setValue(SlabBlock.TYPE, SlabType.DOUBLE);
return defaultBlockState;
}
return Blocks.AIR.defaultBlockState();
}
protected BlockState getStateToPaveWith(MovementContext context) {
return getStateToPaveWith(ItemStack.of(context.blockEntityData.getCompound("Filter")));
}
protected BlockState getStateToPaveWithAsSlab(MovementContext context) {
BlockState stateToPaveWith = getStateToPaveWith(context);
if (stateToPaveWith.hasProperty(SlabBlock.TYPE))
return stateToPaveWith.setValue(SlabBlock.TYPE, SlabType.BOTTOM);
Block block = stateToPaveWith.getBlock();
if (block == null)
return null;
ResourceLocation rl = block.getRegistryName();
String namespace = rl.getNamespace();
String blockName = rl.getPath();
int nameLength = blockName.length();
List<String> possibleSlabLocations = new ArrayList<>();
possibleSlabLocations.add(blockName + "_slab");
if (blockName.endsWith("s") && nameLength > 1)
possibleSlabLocations.add(blockName.substring(0, nameLength - 1) + "_slab");
if (blockName.endsWith("planks") && nameLength > 7)
possibleSlabLocations.add(blockName.substring(0, nameLength - 7) + "_slab");
for (String locationAttempt : possibleSlabLocations) {
Optional<Block> result = ForgeRegistries.BLOCKS.getHolder(new ResourceLocation(namespace, locationAttempt))
.map(slabHolder -> slabHolder.value());
if (result.isEmpty())
continue;
return result.get()
.defaultBlockState();
}
return null;
}
protected RollingMode getMode(MovementContext context) {
return RollingMode.values()[context.blockEntityData.getInt("ScrollValue")];
}
private final class RollerTravellingPoint extends TravellingPoint {
public BiConsumer<TrackEdge, Couple<Double>> traversalCallback;
@Override
protected Double edgeTraversedFrom(TrackGraph graph, boolean forward, IEdgePointListener edgePointListener,
ITurnListener turnListener, double prevPos, double totalDistance) {
double from = forward ? prevPos : position;
double to = forward ? position : prevPos;
traversalCallback.accept(edge, Couple.create(from, to));
return super.edgeTraversedFrom(graph, forward, edgePointListener, turnListener, prevPos, totalDistance);
}
}
private enum PaveResult {
FAIL, PASS, SUCCESS;
}
protected PaveResult tryFill(MovementContext context, BlockPos targetPos, BlockState toPlace) {
Level level = context.world;
if (!level.isLoaded(targetPos))
return PaveResult.FAIL;
BlockState existing = level.getBlockState(targetPos);
if (existing.is(toPlace.getBlock()))
return PaveResult.PASS;
if (!existing.is(BlockTags.LEAVES) && !existing.getMaterial()
.isReplaceable()
&& !existing.getCollisionShape(level, targetPos)
.isEmpty())
return PaveResult.FAIL;
ItemStack filter = ItemStack.of(context.blockEntityData.getCompound("Filter"));
ItemStack held = ItemHelper.extract(context.contraption.getSharedInventory(),
stack -> FilterItem.test(context.world, stack, filter), 1, false);
if (held.isEmpty())
return PaveResult.FAIL;
level.setBlockAndUpdate(targetPos, toPlace);
return PaveResult.SUCCESS;
}
}

View file

@ -0,0 +1,85 @@
package com.simibubi.create.content.contraptions.components.actors;
import static net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
public class RollerRenderer extends SmartBlockEntityRenderer<RollerBlockEntity> {
private static final Vec3 PIVOT = new Vec3(0, -4, 16);
public RollerRenderer(Context context) {
super(context);
}
@Override
protected void renderSafe(RollerBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer,
int light, int overlay) {
super.renderSafe(be, partialTicks, ms, buffer, light, overlay);
BlockState blockState = be.getBlockState();
ms.pushPose();
ms.translate(0, -.25, 0);
SuperByteBuffer superBuffer = CachedBufferer.partial(AllBlockPartials.ROLLER_WHEEL, blockState)
.translate(0, .25, 0);
Direction facing = blockState.getValue(RollerBlock.FACING);
HarvesterRenderer.transform(be.getLevel(), facing, superBuffer, be.getAnimatedSpeed(), PIVOT);
superBuffer.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped()));
ms.popPose();
CachedBufferer.partial(AllBlockPartials.ROLLER_FRAME, blockState)
.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing)))
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.solid()));
}
public static void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld,
ContraptionMatrices matrices, MultiBufferSource buffers) {
BlockState blockState = context.state;
Direction facing = blockState.getValue(HORIZONTAL_FACING);
SuperByteBuffer superBuffer = CachedBufferer.partial(AllBlockPartials.ROLLER_WHEEL, blockState);
float speed = (float) (!VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite())
? context.getAnimationSpeed()
: -context.getAnimationSpeed());
if (context.contraption.stalled)
speed = 0;
superBuffer.translate(0, .25, 0)
.transform(matrices.getModel());
HarvesterRenderer.transform(context.world, facing, superBuffer, speed, PIVOT);
PoseStack viewProjection = matrices.getViewProjection();
viewProjection.pushPose();
viewProjection.translate(0, -.25, 0);
int contraptionWorldLight = ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld);
superBuffer.light(matrices.getWorld(), contraptionWorldLight)
.renderInto(viewProjection, buffers.getBuffer(RenderType.cutoutMipped()));
viewProjection.popPose();
CachedBufferer.partial(AllBlockPartials.ROLLER_FRAME, blockState)
.transform(matrices.getModel())
.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing)))
.light(matrices.getWorld(), contraptionWorldLight)
.renderInto(viewProjection, buffers.getBuffer(RenderType.solid()));
}
}

View file

@ -0,0 +1,40 @@
package com.simibubi.create.content.contraptions.components.actors.trackPaver;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.simibubi.create.foundation.utility.Couple;
import net.minecraft.core.BlockPos;
public class PaveTask {
private Couple<Double> horizontalInterval;
private Map<Couple<Integer>, Float> heightValues = new HashMap<>();
public PaveTask(double h1, double h2) {
horizontalInterval = Couple.create(h1, h2);
}
public Couple<Double> getHorizontalInterval() {
return horizontalInterval;
}
public void put(int x, int z, float y) {
heightValues.put(Couple.create(x, z), y);
}
public float get(Couple<Integer> coords) {
return heightValues.get(coords);
}
public Set<Couple<Integer>> keys() {
return heightValues.keySet();
}
public void put(BlockPos p) {
put(p.getX(), p.getZ(), p.getY());
}
}

View file

@ -0,0 +1,215 @@
package com.simibubi.create.content.contraptions.components.actors.trackPaver;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.simibubi.create.content.logistics.trains.BezierConnection;
import com.simibubi.create.content.logistics.trains.TrackEdge;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.core.BlockPos;
import net.minecraft.util.Mth;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec2;
import net.minecraft.world.phys.Vec3;
public class TrackPaverV2 {
public static void pave(PaveTask task, TrackEdge edge, double from, double to) {
if (edge.isTurn()) {
paveCurve(task, edge.getTurn(), from, to);
return;
}
Vec3 location1 = edge.node1.getLocation()
.getLocation();
Vec3 location2 = edge.node2.getLocation()
.getLocation();
Vec3 diff = location2.subtract(location1);
Vec3 direction = VecHelper.clampComponentWise(diff, 1);
int extent = (int) Math.round((to - from) / direction.length());
double length = edge.getLength();
BlockPos pos = new BlockPos(edge.getPosition(Mth.clamp(from, 1 / 16f, length - 1 / 16f) / length)
.subtract(0, 0.5, 0));
paveStraight(task, pos, direction, extent);
}
public static void paveStraight(PaveTask task, BlockPos startPos, Vec3 direction, int extent) {
Set<BlockPos> toPlaceOn = new HashSet<>();
Vec3 start = VecHelper.getCenterOf(startPos);
Vec3 mainNormal = direction.cross(new Vec3(0, 1, 0));
Vec3 normalizedDirection = direction.normalize();
boolean isDiagonalTrack = direction.multiply(1, 0, 1)
.length() > 1.125f;
double r1 = task.getHorizontalInterval()
.getFirst();
int flip = (int) Math.signum(r1);
double r2 = r1 + flip;
if (isDiagonalTrack) {
r1 /= Mth.SQRT_OF_TWO;
r2 /= Mth.SQRT_OF_TWO;
}
int currentOffset = (int) (Math.abs(r1) * 2 + .5f);
int nextOffset = (int) (Math.abs(r2) * 2 + .5f);
for (int i = 0; i < extent; i++) {
Vec3 offset = direction.scale(i);
Vec3 mainPos = start.add(offset.x, offset.y, offset.z);
Vec3 targetVec = mainPos.add(mainNormal.scale(flip * (int) (currentOffset / 2.0)));
if (!isDiagonalTrack) {
toPlaceOn.add(new BlockPos(targetVec));
continue;
}
boolean placeRow = currentOffset % 2 == 0 || nextOffset % 2 == 1;
boolean placeSides = currentOffset % 2 == 1 || nextOffset % 2 == 0;
if (placeSides) {
for (int side : Iterate.positiveAndNegative) {
Vec3 sideOffset = normalizedDirection.scale(side)
.add(mainNormal.normalize()
.scale(flip))
.scale(.5);
toPlaceOn.add(new BlockPos(targetVec.add(sideOffset)));
}
}
if (placeRow) {
if (Math.abs(currentOffset % 2) == 1)
targetVec = mainPos.add(mainNormal.scale(flip * (int) ((currentOffset + 1) / 2.0)));
toPlaceOn.add(new BlockPos(targetVec));
}
}
toPlaceOn.forEach(task::put);
}
public static void paveCurve(PaveTask task, BezierConnection bc, double from, double to) {
Map<Pair<Integer, Integer>, Double> yLevels = new HashMap<>();
Map<Pair<Integer, Integer>, Double> tLevels = new HashMap<>();
BlockPos tePosition = bc.tePositions.getFirst();
double radius = -task.getHorizontalInterval()
.getFirst();
double r1 = radius - .575;
double r2 = radius + .575;
double handleLength = bc.getHandleLength();
Vec3 start = bc.starts.getFirst()
.subtract(Vec3.atLowerCornerOf(tePosition))
.add(0, 3 / 16f, 0);
Vec3 end = bc.starts.getSecond()
.subtract(Vec3.atLowerCornerOf(tePosition))
.add(0, 3 / 16f, 0);
Vec3 startHandle = bc.axes.getFirst()
.scale(handleLength)
.add(start);
Vec3 endHandle = bc.axes.getSecond()
.scale(handleLength)
.add(end);
Vec3 startNormal = bc.normals.getFirst();
Vec3 endNormal = bc.normals.getSecond();
int segCount = bc.getSegmentCount();
float[] lut = bc.getStepLUT();
double localFrom = from / bc.getLength();
double localTo = to / bc.getLength();
for (int i = 0; i < segCount; i++) {
float t = i == segCount ? 1 : i * lut[i] / segCount;
float t1 = (i + 1) == segCount ? 1 : (i + 1) * lut[(i + 1)] / segCount;
if (t1 < localFrom)
continue;
if (t > localTo)
continue;
Vec3 vt = VecHelper.bezier(start, end, startHandle, endHandle, t);
Vec3 vNormal = startNormal.equals(endNormal) ? startNormal : VecHelper.slerp(t, startNormal, endNormal);
Vec3 hNormal = vNormal.cross(VecHelper.bezierDerivative(start, end, startHandle, endHandle, t)
.normalize())
.normalize();
vt = vt.add(vNormal.scale(-1.175f));
Vec3 vt1 = VecHelper.bezier(start, end, startHandle, endHandle, t1);
Vec3 vNormal1 = startNormal.equals(endNormal) ? startNormal : VecHelper.slerp(t1, startNormal, endNormal);
Vec3 hNormal1 = vNormal1.cross(VecHelper.bezierDerivative(start, end, startHandle, endHandle, t1)
.normalize())
.normalize();
vt1 = vt1.add(vNormal1.scale(-1.175f));
Vec3 a3 = vt.add(hNormal.scale(r2));
Vec3 b3 = vt1.add(hNormal1.scale(r2));
Vec3 c3 = vt1.add(hNormal1.scale(r1));
Vec3 d3 = vt.add(hNormal.scale(r1));
Vec2 a = vec2(a3);
Vec2 b = vec2(b3);
Vec2 c = vec2(c3);
Vec2 d = vec2(d3);
AABB aabb = new AABB(a3, b3).minmax(new AABB(c3, d3));
double y = vt.add(vt1).y / 2f;
for (int scanX = Mth.floor(aabb.minX); scanX <= aabb.maxX; scanX++) {
for (int scanZ = Mth.floor(aabb.minZ); scanZ <= aabb.maxZ; scanZ++) {
Vec2 p = new Vec2(scanX + .5f, scanZ + .5f);
if (!isInTriangle(a, b, c, p) && !isInTriangle(a, c, d, p))
continue;
Pair<Integer, Integer> key = Pair.of(scanX, scanZ);
if (!yLevels.containsKey(key) || yLevels.get(key) > y) {
yLevels.put(key, y);
tLevels.put(key, (t + t1) / 2d);
}
}
}
}
//
for (Entry<Pair<Integer, Integer>, Double> entry : yLevels.entrySet()) {
double yValue = entry.getValue();
int floor = Mth.floor(yValue);
BlockPos targetPos = new BlockPos(entry.getKey()
.getFirst(), floor,
entry.getKey()
.getSecond()).offset(tePosition);
task.put(targetPos.getX(), targetPos.getZ(), targetPos.getY() + (yValue - floor >= .5 ? .5f : 0));
}
}
private static Vec2 vec2(Vec3 vec3) {
return new Vec2((float) vec3.x, (float) vec3.z);
}
private static boolean isInTriangle(Vec2 a, Vec2 b, Vec2 c, Vec2 p) {
float pcx = p.x - c.x;
float pcy = p.y - c.y;
float cbx = c.x - b.x;
float bcy = b.y - c.y;
float d = bcy * (a.x - c.x) + cbx * (a.y - c.y);
float s = bcy * pcx + cbx * pcy;
float t = (c.y - a.y) * pcx + (a.x - c.x) * pcy;
return d < 0 ? s <= 0 && t <= 0 && s + t >= d : s >= 0 && t >= 0 && s + t <= d;
}
public static double lineToPointDiff2d(Vec3 l1, Vec3 l2, Vec3 p) {
return Math.abs((l2.x - l1.x) * (l1.z - p.z) - (l1.x - p.x) * (l2.z - l1.z));
}
}

View file

@ -8,7 +8,6 @@ import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.api.connectivity.ConnectivityHandler;
import com.simibubi.create.content.contraptions.components.actors.AttachedActorBlock;
import com.simibubi.create.content.contraptions.components.actors.HarvesterBlock;
import com.simibubi.create.content.contraptions.components.actors.PloughBlock;
import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock;
import com.simibubi.create.content.contraptions.components.crank.HandCrankBlock;
import com.simibubi.create.content.contraptions.components.fan.NozzleBlock;
@ -353,10 +352,6 @@ public class BlockMovementChecks {
return state.getValue(BlockStateProperties.FACING) == facing;
if (AllBlocks.MECHANICAL_BEARING.has(state))
return state.getValue(BlockStateProperties.FACING) == facing;
if (AllBlocks.MECHANICAL_HARVESTER.has(state))
return state.getValue(HarvesterBlock.FACING) == facing;
if (AllBlocks.MECHANICAL_PLOUGH.has(state))
return state.getValue(PloughBlock.FACING) == facing;
if (AllBlocks.CART_ASSEMBLER.has(state))
return Direction.DOWN == facing;
@ -364,7 +359,7 @@ public class BlockMovementChecks {
return state.getValue(BlockStateProperties.FACING) == facing;
if (AllBlocks.PORTABLE_STORAGE_INTERFACE.has(state))
return state.getValue(PortableStorageInterfaceBlock.FACING) == facing;
if (state.getBlock() instanceof AttachedActorBlock)
if (state.getBlock() instanceof AttachedActorBlock && !AllBlocks.MECHANICAL_ROLLER.has(state))
return state.getValue(BlockStateProperties.HORIZONTAL_FACING) == facing;
if (AllBlocks.ROPE_PULLEY.has(state))
return facing == Direction.DOWN;

View file

@ -39,10 +39,11 @@ public class SmartFluidPipeBlockEntity extends SmartBlockEntity {
registerAwardables(behaviours, FluidPropagator.getSharedTriggers());
}
private void onFilterChanged(ItemStack newFilter) {
private boolean onFilterChanged(ItemStack newFilter) {
if (level.isClientSide)
return;
return true;
FluidPropagator.propagateChangedPipe(level, worldPosition, getBlockState());
return true;
}
class SmartPipeBehaviour extends StraightPipeFluidTransportBehaviour {

View file

@ -195,7 +195,10 @@ public class StockpileSwitchBlockEntity extends SmartBlockEntity {
@Override
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
filtering = new FilteringBehaviour(this, new FilteredDetectorFilterSlot()).moveText(new Vec3(0, 5, 0))
.withCallback($ -> updateCurrentLevel());
.withCallback($ -> {
updateCurrentLevel();
return true;
});
behaviours.add(filtering);
InterfaceProvider towardBlockFacing = InterfaceProvider.towardBlockFacing();

View file

@ -358,7 +358,7 @@ public class TravellingPoint {
return traveled;
}
private Double edgeTraversedFrom(TrackGraph graph, boolean forward, IEdgePointListener edgePointListener,
protected Double edgeTraversedFrom(TrackGraph graph, boolean forward, IEdgePointListener edgePointListener,
ITurnListener turnListener, double prevPos, double totalDistance) {
if (edge.isTurn())
turnListener.accept(Math.max(0, totalDistance), edge);

View file

@ -39,12 +39,13 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans
behaviours.add(filtering = createFilter().withCallback(this::onFilterChanged));
}
private void onFilterChanged(ItemStack newFilter) {
private boolean onFilterChanged(ItemStack newFilter) {
if (level.isClientSide())
return;
return true;
TrackObserver observer = getObserver();
if (observer != null)
observer.setFilterAndNotify(level, newFilter);
return true;
}
@Override

View file

@ -1,6 +1,6 @@
package com.simibubi.create.foundation.blockEntity.behaviour.filtering;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
import com.simibubi.create.content.logistics.item.filter.FilterItem;
@ -33,7 +33,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour {
private ItemStack filter;
public int count;
private Consumer<ItemStack> callback;
private Predicate<ItemStack> callback;
private Supplier<Boolean> isActive;
private Supplier<Boolean> showCountPredicate;
@ -48,8 +48,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour {
filter = ItemStack.EMPTY;
slotPositioning = slot;
showCount = false;
callback = stack -> {
};
callback = stack -> true;
isActive = () -> true;
textShift = Vec3.ZERO;
count = 0;
@ -102,7 +101,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour {
ticksUntilScrollPacket = -1;
}
public FilteringBehaviour withCallback(Consumer<ItemStack> filterCallback) {
public FilteringBehaviour withCallback(Predicate<ItemStack> filterCallback) {
callback = filterCallback;
return this;
}
@ -143,20 +142,23 @@ public class FilteringBehaviour extends BlockEntityBehaviour {
scrollableValue = count;
}
public void setFilter(Direction face, ItemStack stack) {
setFilter(stack);
public boolean setFilter(Direction face, ItemStack stack) {
return setFilter(stack);
}
public void setFilter(ItemStack stack) {
public boolean setFilter(ItemStack stack) {
boolean confirm = ItemHandlerHelper.canItemStacksStack(stack, filter);
filter = stack.copy();
callback.accept(filter);
ItemStack toApply = stack.copy();
if (!callback.test(toApply))
return false;
filter = toApply;
count = !confirm ? 0
: (filter.getItem() instanceof FilterItem) ? 0 : Math.min(stack.getCount(), stack.getMaxStackSize());
forceClientState = true;
blockEntity.setChanged();
blockEntity.sendData();
return true;
}
@Override

View file

@ -81,11 +81,14 @@ public class FilteringHandler {
.shrink(1);
if (behaviour.getFilter()
.getItem() instanceof FilterItem)
player.getInventory().placeItemBackInInventory(behaviour.getFilter());
player.getInventory()
.placeItemBackInInventory(behaviour.getFilter());
}
if (toApply.getItem() instanceof FilterItem)
toApply.setCount(1);
behaviour.setFilter(toApply);
if (!behaviour.setFilter(toApply))
player.displayClientMessage(Lang.translateDirect("logistics.filter.invalid_item")
.withStyle(ChatFormatting.WHITE), true);
} else {
ItemStack filter = behaviour.getFilter();

View file

@ -91,11 +91,12 @@ public class SidedFilteringBehaviour extends FilteringBehaviour {
}
@Override
public void setFilter(Direction side, ItemStack stack) {
public boolean setFilter(Direction side, ItemStack stack) {
if (!sidedFilters.containsKey(side))
return;
return true;
sidedFilters.get(side)
.setFilter(stack);
return true;
}
@Override

View file

@ -37,6 +37,7 @@ public class CKinetics extends ConfigBase {
public final ConfigInt maxPistonPoles = i(64, 1, "maxPistonPoles", Comments.maxPistonPoles);
public final ConfigInt maxRopeLength = i(256, 1, "maxRopeLength", Comments.maxRopeLength);
public final ConfigInt maxCartCouplingLength = i(32, 1, "maxCartCouplingLength", Comments.maxCartCouplingLength);
public final ConfigInt rollerFillDepth = i(12, 1, "rollerFillDepth", Comments.rollerFillDepth);
public final ConfigBool survivalContraptionPickup = b(true, "survivalContraptionPickup", Comments.survivalContraptionPickup);
public final ConfigEnum<ContraptionMovementSetting> spawnerMovement =
e(ContraptionMovementSetting.NO_PICKUP, "movableSpawners", Comments.spawnerMovement);
@ -85,6 +86,7 @@ public class CKinetics extends ConfigBase {
static String maxPistonPoles = "Maximum amount of extension poles behind a Mechanical Piston.";
static String maxRopeLength = "Max length of rope available off a Rope Pulley.";
static String maxCartCouplingLength = "Maximum allowed distance of two coupled minecarts.";
static String rollerFillDepth = "Maximum depth of blocks filled in using a Mechanical Roller.";
static String moveItemsToStorage =
"Whether items mined or harvested by contraptions should be placed in their mounted storage.";
static String harvestPartiallyGrown = "Whether harvesters should break crops that aren't fully grown.";

View file

@ -812,6 +812,14 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.pattern("AAA")
.pattern(" C ")),
MECHANICAL_ROLLER = create(AllBlocks.MECHANICAL_ROLLER).unlockedBy(I::andesiteCasing)
.viaShaped(b -> b.define('C', I.andesiteCasing())
.define('A', I.electronTube())
.define('I', AllBlocks.CRUSHING_WHEEL.get())
.pattern("A")
.pattern("C")
.pattern("I")),
MECHANICAL_DRILL = create(AllBlocks.MECHANICAL_DRILL).unlockedBy(I::andesiteCasing)
.viaShaped(b -> b.define('C', I.andesiteCasing())
.define('A', I.andesite())

View file

@ -105,6 +105,10 @@ public class AllIcons implements ScreenElement {
I_ADD_INVERTED_ATTRIBUTE = next(),
I_FLIP = next(),
I_ROLLER_PAVE = next(),
I_ROLLER_FILL = next(),
I_ROLLER_WIDE_FILL = next(),
I_PLAY = newRow(),
I_PAUSE = next(),
I_STOP = next(),

View file

@ -11,6 +11,8 @@
"death.attack.create.fan_lava.player": "%1$s was thrown into a smelter by %2$s",
"death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill",
"death.attack.create.mechanical_drill.player": "%1$s was thrown in front of a Drill by %2$s",
"death.attack.create.mechanical_roller": "%1$s was flattened by a Mechanical Roller",
"death.attack.create.mechanical_roller.player": "%1$s was thrown in front of a Mechanical Roller by %2$s",
"death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw",
"death.attack.create.mechanical_saw.player": "%1$s was thrown into a Saw by %2$s",
"death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon",
@ -189,6 +191,10 @@
"create.contraptions.cart_movement_mode.rotate": "Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "Pause actors while rotating",
"create.contraptions.cart_movement_mode.rotation_locked": "Lock rotation",
"create.contraptions.roller_mode": "Roller Mode",
"create.contraptions.roller_mode.tunnel_pave": "Clear Blocks and Pave",
"create.contraptions.roller_mode.straight_fill": "Straight Fill Below",
"create.contraptions.roller_mode.wide_fill": "Sloped Fill Below",
"create.contraptions.windmill.rotation_direction": "Rotation Direction",
"create.contraptions.clockwork.clock_hands": "Clock Hands",
@ -205,6 +211,7 @@
"create.logistics.filter.apply": "Applied filter to %1$s.",
"create.logistics.filter.apply_click_again": "Applied filter to %1$s, click again to copy the amount.",
"create.logistics.filter.apply_count": "Applied extraction count to filter.",
"create.logistics.filter.invalid_item": "Cannot use this item here.",
"create.gui.goggles.generator_stats": "Generator Stats:",
"create.gui.goggles.kinetic_stats": "Kinetic Stats:",

View file

@ -0,0 +1,79 @@
{
"credit": "Made with Blockbench",
"ambientocclusion": false,
"textures": {
"6": "create:block/mechanical_roller",
"7": "create:block/sticker_side",
"particle": "create:block/palettes/stone_types/polished/andesite_cut_polished"
},
"elements": [
{
"from": [0, 6, 6],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "x", "origin": [16, 0, 16]},
"faces": {
"north": {"uv": [0, 11, 8, 16], "texture": "#6"},
"east": {"uv": [0, 11, 5, 16], "texture": "#6"},
"south": {"uv": [0, 11, 8, 16], "texture": "#6"},
"west": {"uv": [0, 11, 5, 16], "texture": "#6"},
"up": {"uv": [8, 11, 16, 16], "rotation": 180, "texture": "#6"},
"down": {"uv": [8, 11, 16, 16], "rotation": 180, "texture": "#6"}
}
},
{
"from": [1, -2, 0],
"to": [15, 6, 16],
"rotation": {"angle": 0, "axis": "x", "origin": [16, 0, 16]},
"faces": {
"north": {"uv": [1, 9, 15, 1], "texture": "#7"},
"east": {"uv": [0, 11, 16, 3], "texture": "#7"},
"south": {"uv": [1, 11, 15, 3], "texture": "#7"},
"west": {"uv": [0, 11, 16, 3], "texture": "#7"},
"up": {"uv": [1, 0, 15, 16], "rotation": 180, "texture": "#particle"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"translation": [-1.5, 3.5, 0],
"scale": [0.45, 0.45, 0.45]
},
"fixed": {
"translation": [0, 4.75, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "roller",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1]
}
]
}

View file

@ -0,0 +1,66 @@
{
"credit": "Made with Blockbench",
"ambientocclusion": false,
"textures": {
"6": "create:block/mechanical_roller",
"particle": "create:block/palettes/stone_types/polished/andesite_cut_polished"
},
"elements": [
{
"from": [-0.95, -8.05, -1.1],
"to": [16.95, 0.05, 25.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]},
"faces": {
"north": {"uv": [0, 4, 9, 8], "texture": "#6"},
"east": {"uv": [0, 0, 13, 4], "texture": "#6"},
"south": {"uv": [0, 4, 9, 8], "texture": "#6"},
"west": {"uv": [0, 0, 13, 4], "texture": "#6"},
"up": {"uv": [0, 0, 13, 4], "rotation": 270, "texture": "#6"},
"down": {"uv": [0, 0, 13, 4], "rotation": 270, "texture": "#6"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"translation": [-1.5, 3.5, 0],
"scale": [0.45, 0.45, 0.45]
},
"fixed": {
"translation": [0, 4.75, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "roller",
"origin": [8, 8, 8],
"color": 0,
"children": [0]
}
]
}

View file

@ -0,0 +1,144 @@
{
"credit": "Made with Blockbench",
"ambientocclusion": false,
"textures": {
"5": "create:block/crushing_wheel",
"6": "create:block/mechanical_roller",
"particle": "create:block/palettes/stone_types/polished/andesite_cut_polished"
},
"elements": [
{
"from": [0, -4, 11],
"to": [16, 6, 21],
"rotation": {"angle": 0, "axis": "x", "origin": [16, 0, 16]},
"faces": {
"north": {"uv": [0, 11, 8, 16], "texture": "#6"},
"east": {"uv": [0, 11, 5, 16], "texture": "#6"},
"south": {"uv": [0, 11, 8, 16], "texture": "#6"},
"west": {"uv": [0, 11, 5, 16], "texture": "#6"},
"up": {"uv": [8, 11, 16, 16], "rotation": 180, "texture": "#6"},
"down": {"uv": [8, 11, 16, 16], "rotation": 180, "texture": "#6"}
}
},
{
"from": [-1, -8, -9.1],
"to": [17, 0, 17.1],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 14]},
"faces": {
"north": {"uv": [0, 4, 9, 8], "texture": "#6"},
"east": {"uv": [0, 0, 13, 4], "texture": "#6"},
"south": {"uv": [0, 4, 9, 8], "texture": "#6"},
"west": {"uv": [0, 0, 13, 4], "texture": "#6"},
"up": {"uv": [0, 0, 13, 4], "rotation": 90, "texture": "#6"},
"down": {"uv": [0, 0, 13, 4], "rotation": 90, "texture": "#6"}
}
},
{
"from": [0.15, -16, -5],
"to": [15.85, 8, 5],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 0]},
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"east": {"uv": [15, 16, 16, 6], "rotation": 270, "texture": "#particle"},
"south": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"},
"west": {"uv": [15, 16, 16, 6], "rotation": 270, "texture": "#particle"},
"up": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"},
"down": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"}
}
},
{
"from": [0.1, -9, -12],
"to": [15.9, 1, 12],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, -4, 0]},
"faces": {
"north": {"uv": [0, 6, 16, 16], "texture": "#particle"},
"east": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"south": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"},
"west": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"},
"down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"}
}
},
{
"from": [0.15, -9, -12],
"to": [15.85, 1, 12],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 0]},
"faces": {
"north": {"uv": [0, 6, 16, 16], "texture": "#particle"},
"east": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"south": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"},
"west": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"},
"down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"}
}
},
{
"from": [0.1, -16, -5],
"to": [15.9, 8, 5],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, -4, 0]},
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"east": {"uv": [15, 6, 16, 16], "rotation": 270, "texture": "#particle"},
"south": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"},
"west": {"uv": [15, 6, 16, 16], "rotation": 270, "texture": "#particle"},
"up": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"},
"down": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"}
}
},
{
"from": [0.05, -15, -11],
"to": [15.95, 7, 11],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 0]},
"faces": {
"east": {"uv": [2, 2, 14, 14], "texture": "#5"},
"west": {"uv": [2, 2, 14, 14], "texture": "#5"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"translation": [-1.25, 4.75, 0],
"scale": [0.45, 0.45, 0.45]
},
"head": {
"translation": [0, 11, -5.75]
},
"fixed": {
"translation": [0, 4.75, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "roller",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6]
}
]
}

View file

@ -0,0 +1,114 @@
{
"credit": "Made with Blockbench",
"ambientocclusion": false,
"textures": {
"5": "create:block/crushing_wheel",
"particle": "create:block/palettes/stone_types/polished/andesite_cut_polished"
},
"elements": [
{
"from": [0.15, -16, 11],
"to": [15.85, 8, 21],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, -4, 16]},
"faces": {
"north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"},
"east": {"uv": [15, 16, 16, 6], "rotation": 270, "texture": "#particle"},
"south": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"west": {"uv": [15, 16, 16, 6], "rotation": 270, "texture": "#particle"},
"up": {"uv": [0, 6, 16, 16], "texture": "#particle"},
"down": {"uv": [0, 6, 16, 16], "texture": "#particle"}
}
},
{
"from": [0.1, -9, 4],
"to": [15.9, 1, 28],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 16]},
"faces": {
"north": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"},
"east": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"south": {"uv": [0, 6, 16, 16], "texture": "#particle"},
"west": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"up": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"down": {"uv": [0, 0, 16, 16], "texture": "#particle"}
}
},
{
"from": [0.15, -9, 4],
"to": [15.85, 1, 28],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, -4, 16]},
"faces": {
"north": {"uv": [0, 6, 16, 16], "rotation": 180, "texture": "#particle"},
"east": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"south": {"uv": [0, 6, 16, 16], "texture": "#particle"},
"west": {"uv": [16, 16, 15, 6], "rotation": 180, "texture": "#particle"},
"up": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"down": {"uv": [0, 0, 16, 16], "texture": "#particle"}
}
},
{
"from": [0.1, -16, 11],
"to": [15.9, 8, 21],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 16]},
"faces": {
"north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#particle"},
"east": {"uv": [15, 6, 16, 16], "rotation": 270, "texture": "#particle"},
"south": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"west": {"uv": [15, 6, 16, 16], "rotation": 270, "texture": "#particle"},
"up": {"uv": [0, 6, 16, 16], "texture": "#particle"},
"down": {"uv": [0, 6, 16, 16], "texture": "#particle"}
}
},
{
"from": [0.05, -15, 5],
"to": [15.95, 7, 27],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, -4, 16]},
"faces": {
"east": {"uv": [2, 2, 14, 14], "texture": "#5"},
"west": {"uv": [2, 2, 14, 14], "texture": "#5"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 45, 0],
"translation": [8.5, 2.25, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"translation": [-1.5, 3.5, 0],
"scale": [0.45, 0.45, 0.45]
},
"fixed": {
"translation": [0, 4.75, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "roller",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB