diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index b4ebf1790..104f85102 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -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 diff --git a/src/generated/resources/assets/create/blockstates/mechanical_harvester.json b/src/generated/resources/assets/create/blockstates/mechanical_harvester.json index 3c36b8627..bb5b3b0d5 100644 --- a/src/generated/resources/assets/create/blockstates/mechanical_harvester.json +++ b/src/generated/resources/assets/create/blockstates/mechanical_harvester.json @@ -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 } diff --git a/src/generated/resources/assets/create/blockstates/mechanical_plough.json b/src/generated/resources/assets/create/blockstates/mechanical_plough.json index 83bfa6dbd..6d273fdc8 100644 --- a/src/generated/resources/assets/create/blockstates/mechanical_plough.json +++ b/src/generated/resources/assets/create/blockstates/mechanical_plough.json @@ -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 } diff --git a/src/generated/resources/assets/create/blockstates/mechanical_roller.json b/src/generated/resources/assets/create/blockstates/mechanical_roller.json new file mode 100644 index 000000000..128a164ed --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/mechanical_roller.json @@ -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 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index a602dbf3f..ebd111718 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -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", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f130944a7..90b53d779 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/cs_cz.json b/src/generated/resources/assets/create/lang/unfinished/cs_cz.json index f0dc301a5..ca3e84e20 100644 --- a/src/generated/resources/assets/create/lang/unfinished/cs_cz.json +++ b/src/generated/resources/assets/create/lang/unfinished/cs_cz.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/da_dk.json b/src/generated/resources/assets/create/lang/unfinished/da_dk.json index b7054ea62..9cf3a3d68 100644 --- a/src/generated/resources/assets/create/lang/unfinished/da_dk.json +++ b/src/generated/resources/assets/create/lang/unfinished/da_dk.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index e8052a528..755404d7a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_cl.json b/src/generated/resources/assets/create/lang/unfinished/es_cl.json index 0d36653bc..b639e3354 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_cl.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_cl.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 28b9cd576..81ea82fe1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index b20fc4ba7..6b449a07f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 0bcc47348..59d8acac2 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -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 :", diff --git a/src/generated/resources/assets/create/lang/unfinished/hu_hu.json b/src/generated/resources/assets/create/lang/unfinished/hu_hu.json index 2a0c33527..97317ed67 100644 --- a/src/generated/resources/assets/create/lang/unfinished/hu_hu.json +++ b/src/generated/resources/assets/create/lang/unfinished/hu_hu.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index b1bbb6499..a12a33928 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index d3e6f65f6..073037c40 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -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": "動力の統計:", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 9290b4a17..a2277c7f0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -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": "작동 상태:", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index c59f0a676..0e31c01a8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/no_no.json b/src/generated/resources/assets/create/lang/unfinished/no_no.json index 493677b77..d6394c425 100644 --- a/src/generated/resources/assets/create/lang/unfinished/no_no.json +++ b/src/generated/resources/assets/create/lang/unfinished/no_no.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index 9952c34e4..410f1aa1f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 968e01c36..9b807fa66 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json index 39ed5e00f..76464f8f3 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json index 400b47ffd..4d84dd93e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json +++ b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 29bc1b209..9655072e4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -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": "Кинетическая статистика:", diff --git a/src/generated/resources/assets/create/lang/unfinished/sv_se.json b/src/generated/resources/assets/create/lang/unfinished/sv_se.json index f20a384b5..949917781 100644 --- a/src/generated/resources/assets/create/lang/unfinished/sv_se.json +++ b/src/generated/resources/assets/create/lang/unfinished/sv_se.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/th_th.json b/src/generated/resources/assets/create/lang/unfinished/th_th.json index d512efecf..539dfb1dd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/th_th.json +++ b/src/generated/resources/assets/create/lang/unfinished/th_th.json @@ -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:", diff --git a/src/generated/resources/assets/create/lang/unfinished/uk_ua.json b/src/generated/resources/assets/create/lang/unfinished/uk_ua.json index f928e6e40..d39d1fe26 100644 --- a/src/generated/resources/assets/create/lang/unfinished/uk_ua.json +++ b/src/generated/resources/assets/create/lang/unfinished/uk_ua.json @@ -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": "Кінетична статистика:", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index c2586f00b..c711dd855 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -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": "动力学状态:", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index d59fb054d..8b5f2e4ac 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -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": "動力學狀態:", diff --git a/src/generated/resources/assets/create/models/item/mechanical_roller.json b/src/generated/resources/assets/create/models/item/mechanical_roller.json new file mode 100644 index 000000000..fc689e02a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/mechanical_roller.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/mechanical_roller/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_roller.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_roller.json new file mode 100644 index 000000000..f7cbf0bc2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_roller.json @@ -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" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/mechanical_roller.json b/src/generated/resources/data/create/loot_tables/blocks/mechanical_roller.json new file mode 100644 index 000000000..b45d5c150 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/mechanical_roller.json @@ -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" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_roller.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_roller.json new file mode 100644 index 000000000..f6d780efd --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_roller.json @@ -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" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 898277218..1934a1de3 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -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", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 7e19837c9..5472d5b1d 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -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", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index c8c126fea..13492e562 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -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 MECHANICAL_ROLLER = + REGISTRATE.blockEntity("mechanical_roller", RollerBlockEntity::new) + .validBlocks(AllBlocks.MECHANICAL_ROLLER) + .renderer(() -> RollerRenderer::new) + .register(); + public static final BlockEntityEntry PORTABLE_STORAGE_INTERFACE = REGISTRATE .blockEntity("portable_storage_interface", PortableItemInterfaceBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 90402767f..41533f953 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -52,6 +52,9 @@ public class AllBlockPartials { ANALOG_LEVER_INDICATOR = block("analog_lever/indicator"), FUNNEL_FLAP = block("funnel/flap"), 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"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index d7cb680bd..fcceef5a9 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -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; @@ -1164,7 +1166,7 @@ public class AllBlocks { .item() .transform(customItemModel()) .register(); - + public static final BlockEntry CART_ASSEMBLER = REGISTRATE.block("cart_assembler", CartAssemblerBlock::new) .initialProperties(SharedProperties::stone) @@ -1315,7 +1317,7 @@ public class AllBlocks { .item(RedstoneContactItem::new) .transform(customItemModel("_", "block")) .register(); - + public static final BlockEntry ELEVATOR_CONTACT = REGISTRATE.block("elevator_contact", ElevatorContactBlock::new) .initialProperties(SharedProperties::softMetal) @@ -1356,6 +1358,19 @@ public class AllBlocks { .simpleItem() .register(); + public static final BlockEntry 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 SEATS = new DyedBlockList<>(colour -> { String colourName = colour.getSerializedName(); SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); @@ -1700,8 +1715,7 @@ public class AllBlocks { public static final BlockEntry 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()) diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 08868fe48..28e13b1ff 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -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(), diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java index 4ec3b6aa1..90cf20d64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java @@ -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 builder) { - builder.add(FACING); + builder.add(FACING, WATERLOGGED); super.createBlockStateDefinition(builder); } @@ -57,22 +62,39 @@ 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 public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; } - + + @Override + public FluidState getFluidState(BlockState pState) { + return fluidState(pState); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java index f12e7b7c4..f1ac2c4dd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java @@ -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; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java index 9b9efbf08..96b5b541e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java @@ -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() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 39eef7257..6585268ed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -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,18 +25,18 @@ import net.minecraft.world.phys.Vec3; public class HarvesterRenderer extends SafeBlockEntityRenderer { - 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())); + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); } public static void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld, @@ -46,23 +45,22 @@ public class HarvesterRenderer extends SafeBlockEntityRenderer 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; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlock.java new file mode 100644 index 000000000..748e4efd8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlock.java @@ -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 { + + 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 getBlockEntityClass() { + return RollerBlockEntity.class; + } + + @Override + public BlockEntityType 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; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockEntity.java new file mode 100644 index 000000000..84534e0c1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockEntity.java @@ -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 mode; + + public RollerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public void addBehaviours(List 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.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); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerMovementBehaviour.java new file mode 100644 index 000000000..9ecfe52c8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerMovementBehaviour.java @@ -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 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 getPositionsToBreak(MovementContext context, BlockPos visitedPos) { + ArrayList positions = new ArrayList<>(); + + RollingMode mode = getMode(context); + if (mode != RollingMode.TUNNEL_PAVE) + return positions; + + // Train + PaveTask profileForTracks = createHeightProfileForTracks(context); + if (profileForTracks != null) { + for (Couple 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 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> paveSet = new ArrayList<>(); + PaveTask profileForTracks = createHeightProfileForTracks(context); + if (profileForTracks == null) + paveSet.add(Pair.of(pos, false)); + else + for (Couple 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> currentLayer = new HashSet<>(); + if (mode == RollingMode.WIDE_FILL) { + for (Pair 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 anchor : paveSet) + currentLayer.add(Pair.of(anchor.getFirst() + .below(yOffset), anchor.getSecond())); + + boolean completelyBlocked = true; + boolean anyBlockPlaced = false; + + for (Pair 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 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 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> 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; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerRenderer.java new file mode 100644 index 000000000..c9a7caf65 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerRenderer.java @@ -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 { + + 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())); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/trackPaver/PaveTask.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/trackPaver/PaveTask.java new file mode 100644 index 000000000..9fc49e47f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/trackPaver/PaveTask.java @@ -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 horizontalInterval; + private Map, Float> heightValues = new HashMap<>(); + + public PaveTask(double h1, double h2) { + horizontalInterval = Couple.create(h1, h2); + } + + public Couple getHorizontalInterval() { + return horizontalInterval; + } + + public void put(int x, int z, float y) { + heightValues.put(Couple.create(x, z), y); + } + + public float get(Couple coords) { + return heightValues.get(coords); + } + + public Set> keys() { + return heightValues.keySet(); + } + + public void put(BlockPos p) { + put(p.getX(), p.getZ(), p.getY()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/trackPaver/TrackPaverV2.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/trackPaver/TrackPaverV2.java new file mode 100644 index 000000000..73c9daf1c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/trackPaver/TrackPaverV2.java @@ -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 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, Double> yLevels = new HashMap<>(); + Map, 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 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, 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)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java index 046b936ba..e0eddefec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java @@ -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; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java index c1676c5ab..8f632324b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java @@ -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 { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlockEntity.java index 20843fb95..bbfb36fbb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlockEntity.java @@ -101,10 +101,10 @@ public class StockpileSwitchBlockEntity extends SmartBlockEntity { if (targetBlockEntity instanceof StockpileSwitchObservable observable) { currentLevel = observable.getPercent() / 100f; - + } else if (StorageDrawers.isDrawer(targetBlockEntity) && observedInventory.hasInventory()) { currentLevel = StorageDrawers.getTrueFillLevel(observedInventory.getInventory(), filtering); - + } else if (observedInventory.hasInventory() || observedTank.hasInventory()) { if (observedInventory.hasInventory()) { // Item inventory @@ -154,7 +154,7 @@ public class StockpileSwitchBlockEntity extends SmartBlockEntity { currentLevel = Mth.clamp(currentLevel, 0, 1); changed = currentLevel != prevLevel; - + boolean previouslyPowered = redstoneState; if (redstoneState && currentLevel <= offWhenBelow) redstoneState = false; @@ -195,7 +195,10 @@ public class StockpileSwitchBlockEntity extends SmartBlockEntity { @Override public void addBehaviours(List 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(); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java index 194d926a6..2bb61ec9e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java @@ -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); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java index ef431470a..16657fc29 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java @@ -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 diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java index f1dab1936..c52f2b987 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java @@ -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 callback; + private Predicate callback; private Supplier isActive; private Supplier 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 filterCallback) { + public FilteringBehaviour withCallback(Predicate 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 diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringHandler.java index a71438220..e29d98a91 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringHandler.java @@ -73,7 +73,7 @@ public class FilteringHandler { return; if (AllBlocks.MECHANICAL_ARM.isIn(toApply)) return; - + if (event.getSide() != LogicalSide.CLIENT) { if (!player.isCreative()) { if (toApply.getItem() instanceof FilterItem) @@ -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(); @@ -132,14 +135,14 @@ public class FilteringHandler { ((Sided) filtering.slotPositioning).fromSide(result.getDirection()); if (!filtering.testHit(objectMouseOver.getLocation())) return false; - + ItemStack filterItem = filtering.getFilter(); filtering.ticksUntilScrollPacket = 10; int maxAmount = (filterItem.getItem() instanceof FilterItem) ? 64 : filterItem.getMaxStackSize(); int prev = filtering.scrollableValue; filtering.scrollableValue = (int) Mth.clamp(filtering.scrollableValue + delta * (AllKeys.ctrlDown() ? 16 : 1), 0, maxAmount); - + if (prev != filtering.scrollableValue) { float pitch = (filtering.scrollableValue) / (float) (maxAmount); pitch = Mth.lerp(pitch, 1.5f, 2f); diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java index 58b5a50a7..ac2d1354a 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java @@ -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 diff --git a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java index 8a6866249..1bb73f18a 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java @@ -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 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."; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 44819cb78..38bc54e12 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -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()) diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 3514e3246..b0bb6a60e 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -104,6 +104,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(), diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 5edce6b5d..caa192013 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -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:", diff --git a/src/main/resources/assets/create/models/block/mechanical_roller/block.json b/src/main/resources/assets/create/models/block/mechanical_roller/block.json new file mode 100644 index 000000000..cba9d19ea --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_roller/block.json @@ -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] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_roller/frame.json b/src/main/resources/assets/create/models/block/mechanical_roller/frame.json new file mode 100644 index 000000000..1c913ccd8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_roller/frame.json @@ -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] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_roller/item.json b/src/main/resources/assets/create/models/block/mechanical_roller/item.json new file mode 100644 index 000000000..9de894a3e --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_roller/item.json @@ -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] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_roller/wheel.json b/src/main/resources/assets/create/models/block/mechanical_roller/wheel.json new file mode 100644 index 000000000..15a5e8002 --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_roller/wheel.json @@ -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] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/mechanical_roller.png b/src/main/resources/assets/create/textures/block/mechanical_roller.png new file mode 100644 index 000000000..712aa4afb Binary files /dev/null and b/src/main/resources/assets/create/textures/block/mechanical_roller.png differ diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index 7e06ef746..ef0384d39 100644 Binary files a/src/main/resources/assets/create/textures/gui/icons.png and b/src/main/resources/assets/create/textures/gui/icons.png differ