diff --git a/gradle.properties b/gradle.properties index 1c23e4f1c..025cae5ea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,12 +4,12 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false # mod version info -mod_version=0.3c +mod_version=0.3.1 minecraft_version=1.15.2 forge_version=31.2.31 # dependency versions -registrate_version=0.0.4.18 +registrate_version=1.0.0-rc.17 jei_version=6.0.0.2 # curseforge information diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 2d84f9f0c..279e708c6 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -16,7 +16,7 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets/create/blockstates/andesite_bric 96b5284693da168ab8e0809d86515b5f1a7e763f assets/create/blockstates/andesite_cobblestone_stairs.json 82bd82270aff7d51e9239680ef4dd7b5c899ceb0 assets/create/blockstates/andesite_cobblestone_wall.json 9639b901ffdd2ecccab5575c5c9e6c7b5c901e02 assets/create/blockstates/andesite_encased_shaft.json -11908c2f8603e61bec88010bc6d0890e6339c6b1 assets/create/blockstates/andesite_funnel.json +7187eba21a32e6954261cc71008ec1834a2e8af7 assets/create/blockstates/andesite_funnel.json 398922758a6219544e5b85c91c9cf8a543b437e5 assets/create/blockstates/andesite_pillar.json 1d2d8081581e07d9be4b382aede4f2de4401cc6b assets/create/blockstates/andesite_tunnel.json e555e3c2b2d3f01440e48db4ba88f7e00fd99b6f assets/create/blockstates/basin.json @@ -34,7 +34,7 @@ ee1299a15fca849eb42bf81507f85a54c167bbfe assets/create/blockstates/brass_belt_fu 8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json 288bad07593a8a2c8efaf44bba0ffb0011d36cd3 assets/create/blockstates/brass_encased_shaft.json -3057e1121117c0cd651c288cd8e2d46bdf64afb1 assets/create/blockstates/brass_funnel.json +8b5e88dea4e10ba3c74f0f161e49fed31a376ea1 assets/create/blockstates/brass_funnel.json 672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json 11ebdd9bd0815833e62ec1bea03a4cdd86ce00f3 assets/create/blockstates/brown_sail.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json @@ -140,7 +140,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -499aade14db59f62b46e8a266998feb41e1922a1 assets/create/blockstates/fluid_pipe.json +4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -157,6 +157,8 @@ afff479c0e5284771afa9e7ce513595fe65860ee assets/create/blockstates/gabbro_cobble a1f31a194129cfb65e335b3b96490f9275f9c564 assets/create/blockstates/gabbro_cobblestone_stairs.json a64d8d0924c0b5b192f355343dd9b3a440875f6a assets/create/blockstates/gabbro_cobblestone_wall.json a6b44e8a1c4ce0c7442b2384b41ad36dd133f19b assets/create/blockstates/gabbro_pillar.json +2d7ffcb339b0a38b98935a382ac2a164866255b1 assets/create/blockstates/gantry_pinion.json +9fa39a44bba30c5ae8fa245b122a837c705462b4 assets/create/blockstates/gantry_shaft.json eca1f0e56efdadb241f42dc6ebb036f1d52213a9 assets/create/blockstates/gearbox.json f34814b17cde3231a1dfb271f3dabf8d6de4fbf6 assets/create/blockstates/gearshift.json 93f8bdc22d9a5e04268964e35e4285c8cbf2b89d assets/create/blockstates/glass_fluid_pipe.json @@ -335,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -9e7ea57c58889fa0021e3c4f19da3f763108399f assets/create/blockstates/radial_chassis.json +bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -363,6 +365,7 @@ b6e50f46a02f833f2f2bafa8585a909b6da5e229 assets/create/blockstates/scoria_cobble 81931eb1027dfb42ba4b2186185a4c0a36e0dbe4 assets/create/blockstates/sequenced_gearshift.json c4c3613ad353e721e7109628aa06ab0664d0862b assets/create/blockstates/shadow_steel_casing.json 79ae6d86a829b9ce82fce68a6377d3810fcfcb10 assets/create/blockstates/shaft.json +fa4ffec5eac02c0180226d994d51756e44f85674 assets/create/blockstates/smart_chute.json f0f72cc1faacc8f37c8ac1833c22eb910771c800 assets/create/blockstates/smart_fluid_pipe.json e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.json 1cb7cdbefa0ff199263782809287854b9d85074c assets/create/blockstates/spout.json @@ -397,17 +400,17 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -ff5ca8ad030f1dd58a05c2fef2c3788292db5bd1 assets/create/lang/en_ud.json -211b6a54a5e9eca29d4112aeb98796b250bd1ac7 assets/create/lang/en_us.json -0ffb102de8e43fb20a7efbd5887e01f6708642a1 assets/create/lang/unfinished/de_de.json -f1ae1b2b0e4b686bdee17cf357fb999462a90a56 assets/create/lang/unfinished/fr_fr.json -8634445232b6492effe3c790a6a6abdfc606d8c1 assets/create/lang/unfinished/it_it.json -c7ba4d035c7382b9c1f9dc0f4f310a1714b59fea assets/create/lang/unfinished/ja_jp.json -e484dee6af6788321928691164ae8b78a827afd4 assets/create/lang/unfinished/ko_kr.json -8bcf3a906818d89ebc9abb7ba35889d9ddc4ed32 assets/create/lang/unfinished/nl_nl.json -015c286766cf66b8482f08636b6c2ab5924d2bf6 assets/create/lang/unfinished/pt_br.json -7e337a8928f40aa29c69682b26190c134adbddb1 assets/create/lang/unfinished/ru_ru.json -9e5e9e4583543468ad3f7fe16c12dcfbad68d8cb assets/create/lang/unfinished/zh_cn.json +e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json +acc852d80378b426d7ee6cb59c169e06b6d63b25 assets/create/lang/en_us.json +1f5803d0479848c114b3c2b55956dabac01accad assets/create/lang/unfinished/de_de.json +c81d5b374365ca8fcce1ff7a199b28e3c969c878 assets/create/lang/unfinished/fr_fr.json +5ba7a1a73fb3d08b3777325266c8ed0360302eba assets/create/lang/unfinished/it_it.json +b7d067002e833c3f9864de2cdb401b30e6569600 assets/create/lang/unfinished/ja_jp.json +23aaf879d07a24775aeba3b98c355c992b24f28b assets/create/lang/unfinished/ko_kr.json +7372533759001f094dbcad787f01f3de7422d8c0 assets/create/lang/unfinished/nl_nl.json +0d1e5d79ef196a06b273962d5ac8f2013f91209c assets/create/lang/unfinished/pt_br.json +6568b0bd677b4b94e98d598852c90dcee07bf4a5 assets/create/lang/unfinished/ru_ru.json +1a3cd22ab046498269f80247cf6d6251f4b3dc36 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -455,8 +458,18 @@ ad255a62a5f54b578db06e89fd7160001f905675 assets/create/models/block/andesite_cob a033fbac3129bba9211c6c4a0e16c905643afa39 assets/create/models/block/andesite_cobblestone_stairs_outer.json 1c574ee47aeb6fcb305bfc95dd131e153b795a0e assets/create/models/block/andesite_cobblestone_wall_post.json 0ed983628e8868f77301bea1111570d3631f24fb assets/create/models/block/andesite_cobblestone_wall_side.json -51e851b15870c0922cfbe911ef1a2f22062969f3 assets/create/models/block/andesite_funnel.json -f28da6703691f1b08cfb49208f0f7bb0c5ca816d assets/create/models/block/andesite_funnel_powered.json +7d5faceb2a8d67acddd39625da6d5853f07ea8bd assets/create/models/block/andesite_funnel_ceiling_pull.json +82393ded7287660d16549e321317dfe4488cc81d assets/create/models/block/andesite_funnel_ceiling_pull_powered.json +40d7adae3b5eecd8ed08445b2d7f43d7a0684837 assets/create/models/block/andesite_funnel_ceiling_push.json +940cace1d38fef0d5d88a391b0ba8cf690b38a44 assets/create/models/block/andesite_funnel_ceiling_push_powered.json +c77c660ea142419e93754c9702445c269dbcd0cc assets/create/models/block/andesite_funnel_floor_pull.json +16d402c764364254a704a13736bd68455edc28ba assets/create/models/block/andesite_funnel_floor_pull_powered.json +6a809d0e0e53b845b587276444cb7b64a1e15e81 assets/create/models/block/andesite_funnel_floor_push.json +6eac3e4f593e4182f5c216a900136a62ea953fb5 assets/create/models/block/andesite_funnel_floor_push_powered.json +cc187c98c62b47f5bdb6e5187f52d3d927486376 assets/create/models/block/andesite_funnel_wall_pull.json +525cf080df53a428d1321d25c2021b5f3b80a4e6 assets/create/models/block/andesite_funnel_wall_pull_powered.json +78fcd6a91a84f5824e3e0006609b6f01760238d4 assets/create/models/block/andesite_funnel_wall_push.json +6c48d1a0b8cb007a6eddaa9b2f6cb8a98334d34e assets/create/models/block/andesite_funnel_wall_push_powered.json b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets/create/models/block/andesite_pillar.json aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tunnel/cross.json 75f628178fa21a2bd301eea8d1cebf7e94f7d5cc assets/create/models/block/andesite_tunnel/straight.json @@ -497,8 +510,18 @@ dfc6250e28e12ff193a45891978ec50c406fc0c2 assets/create/models/block/brass_belt_f 97410a12b7c1461f88fb633f26ff566a0636b627 assets/create/models/block/brass_belt_funnel__retracted.json 71d0ad31d89d4ea3f243c6003b17f57fd168c933 assets/create/models/block/brass_block.json 166a5c053a81e6aadc24509ed24dc144a7255969 assets/create/models/block/brass_casing.json -838e7ab4c0c9d89eacfa078daf64995e505db896 assets/create/models/block/brass_funnel.json -6099ba0366065d15d3b2821474850a1ae85485ea assets/create/models/block/brass_funnel_powered.json +f5f689dc8be53e560878d3dde7b6eda6b3bf28e3 assets/create/models/block/brass_funnel_ceiling_pull.json +142a56e522c74268d0b418985eb3fd285e371295 assets/create/models/block/brass_funnel_ceiling_pull_powered.json +e583d701961b68223778d28edc0e2686c1a5c5df assets/create/models/block/brass_funnel_ceiling_push.json +ccb2b596c3f190c26fdec06dd2b53ac3e59b1ff2 assets/create/models/block/brass_funnel_ceiling_push_powered.json +7f541d8235326fea3ecb370c4cf2913867f439ad assets/create/models/block/brass_funnel_floor_pull.json +5277d7c614991a5bce0e9234c4094f02c6d201c2 assets/create/models/block/brass_funnel_floor_pull_powered.json +1831d87b5a9784c12cecefbb9d3173c29f4ddc87 assets/create/models/block/brass_funnel_floor_push.json +6aee078641719086c9a98ebd1c0d0d61cd4d33a9 assets/create/models/block/brass_funnel_floor_push_powered.json +aa86ddeeb41aea5bd85dd488d932fbc913828b1f assets/create/models/block/brass_funnel_wall_pull.json +161b420ee4f41d436177e20314dcbe61ecec53a8 assets/create/models/block/brass_funnel_wall_pull_powered.json +24362e71ca3a6d0f2dbf129909eceb8b3937a66b assets/create/models/block/brass_funnel_wall_push.json +76cdebba3116be88926d9640917e579377ef3134 assets/create/models/block/brass_funnel_wall_push_powered.json 520087db8d479c66f85f3483af813fb668f27503 assets/create/models/block/brass_tunnel/cross.json 347ed67bf3426e323354e2d959fc9563dc7eeecd assets/create/models/block/brass_tunnel/straight.json a959e03ca339badb49fe58ba53d86a84352e91f3 assets/create/models/block/brass_tunnel/t_left.json @@ -730,6 +753,18 @@ f278ec09c13f98ccbce1a8488d4d51c72f398ed4 assets/create/models/block/gabbro_cobbl 5e50c62a9db350f3a2c0e4b1c37a8dc0d149f287 assets/create/models/block/gabbro_cobblestone_wall_post.json 820235f51e7c3b4c05a327c3aa66618ea1e89c9c assets/create/models/block/gabbro_cobblestone_wall_side.json ede9c9209f9cee3d8e1ffc5008b1b8b026aee998 assets/create/models/block/gabbro_pillar.json +f7f55d8107d9128f7be42b2a07fd99aeeba44954 assets/create/models/block/gantry_shaft_end_flipped.json +33196bb0c2f7ca356fc62854349a3ab5fdf2d119 assets/create/models/block/gantry_shaft_end_powered.json +410c0ae1995a079766cab96a3545bb61159feba3 assets/create/models/block/gantry_shaft_end_powered_flipped.json +d66f23d811a09c7e3dad5900f9851282be2f64b7 assets/create/models/block/gantry_shaft_middle_flipped.json +9551abd37c295fe2541f2aee01dd72bfb71b8ae1 assets/create/models/block/gantry_shaft_middle_powered.json +deff4f1163284c22a60d403000c0cd7553d6caff assets/create/models/block/gantry_shaft_middle_powered_flipped.json +16eb7950f81e7242d277f5b0b2710ade820f5645 assets/create/models/block/gantry_shaft_single_flipped.json +78b51bdfa1d26f909e2d3a3ddb70a5631f4fa75f assets/create/models/block/gantry_shaft_single_powered.json +c81b86c2186cbe9867ea041776c8e70059d70f7e assets/create/models/block/gantry_shaft_single_powered_flipped.json +347430ecc316d502cea2e0f90d43ff106e9cb15c assets/create/models/block/gantry_shaft_start_flipped.json +0e1a5a8f38cd6cd3e2f7d2c0d147d924414b0560 assets/create/models/block/gantry_shaft_start_powered.json +4b2f2e9eb3d426b56bb2e0f530b249469200afd0 assets/create/models/block/gantry_shaft_start_powered_flipped.json 392dd57e5b96214335867799347e21ac0d05457a assets/create/models/block/granite_bricks.json 0ee90049ce09f1f1c96063bc7239cd1fadbdb947 assets/create/models/block/granite_bricks_slab.json 37737d6767ba08b6bd96de1ff3b920522dc3cd51 assets/create/models/block/granite_bricks_slab_top.json @@ -1126,7 +1161,7 @@ d283f86cd05ed378efd82ce46cf49bc83783069b assets/create/models/item/andesite_bric b0f664dd6de3d0ee9afcb6223fbcd53b97fa0d65 assets/create/models/item/andesite_cobblestone_stairs.json 4856d13a72ec0af9f10226b4a4bf0567eb580b9a assets/create/models/item/andesite_cobblestone_wall.json bc6e7469744604e578200ea87690e4dd3b25e447 assets/create/models/item/andesite_encased_shaft.json -7490819e7e5445019b6b8cb2538f12a5b6717a46 assets/create/models/item/andesite_funnel.json +a3866ea9f44e80b64989f2b5f8a9f344da959c87 assets/create/models/item/andesite_funnel.json 75b8b00c2418b9660d35a7fabd0774925cf1c02f assets/create/models/item/andesite_pillar.json c0e35daccfb398947532e9499d6bda963387cd9c assets/create/models/item/andesite_tunnel.json 54875c992ec4e314826ca37257e64a96f1c0907e assets/create/models/item/bar_of_chocolate.json @@ -1144,7 +1179,7 @@ bec96ebf3369d3cffa9bb1b8bf9f2a5cd5d0ef96 assets/create/models/item/blue_valve_ha 17d340c3678bd24cb085ba49490b2b4cb341a9e7 assets/create/models/item/brass_block.json f5a18f4279c2e845a5967b1c2f9e807c2bb77afb assets/create/models/item/brass_casing.json c723011e09203821b6b59cff9de22454c5e4395a assets/create/models/item/brass_encased_shaft.json -099961ca4a75b6ecfddd1db6dd29909276759f3b assets/create/models/item/brass_funnel.json +12781f22d9b91df903d38bc55c4fe9f75dba8867 assets/create/models/item/brass_funnel.json 361f75a79de5007d7a99ad0a38103c9aa8c3017c assets/create/models/item/brass_hand.json 1786bdffa2ab5a07c88d2797db3d7b54461323c4 assets/create/models/item/brass_ingot.json a37be4a0ec9bf6c381527403c57ced4f81abd67c assets/create/models/item/brass_nugget.json @@ -1295,6 +1330,8 @@ b10971277417369f421324b28f0a4b47ce4c8625 assets/create/models/item/gabbro_bricks b3d7398dbc16c450928bd76b772c273382687447 assets/create/models/item/gabbro_cobblestone_stairs.json 5680f24b43838cb6632bfcedba282a244bd24db0 assets/create/models/item/gabbro_cobblestone_wall.json 20950b692eecfccd77d96678bb3d909d51f6d787 assets/create/models/item/gabbro_pillar.json +b10f1b188f2bf380628377bd42af2b8f8ffe5611 assets/create/models/item/gantry_pinion.json +b4bfd5041b62f3a0a955fa4872d178b590614f22 assets/create/models/item/gantry_shaft.json 6ab0d17f3d02678ed992e188ff09f6b2c00b5b03 assets/create/models/item/gearbox.json 2fe29893d74c176ea35aed73a169c13dd4ddb2a8 assets/create/models/item/gearshift.json 52108a61865dab38133b9f916496ca680ae364ea assets/create/models/item/golden_sheet.json @@ -1503,6 +1540,7 @@ b0061419cf7b7bd2dd548ff00ee28f1227ee2663 assets/create/models/item/scoria_cobble da72ccdc893fbdd3efa9c22143b88eb756c20e44 assets/create/models/item/shadow_steel.json 081326d6666cfcfe34c45c1b74bfceba0b01ae6e assets/create/models/item/shadow_steel_casing.json 106ae694f7e03a218c37003dca8291b1d39b3c55 assets/create/models/item/shaft.json +0f6bc6a4328ef317d50903c7b50ab5f78fce37eb assets/create/models/item/smart_chute.json 188c49e5d8d9a2d5a570dbccdf3efd1b472dae18 assets/create/models/item/smart_fluid_pipe.json d6fb0d38b1b5bcc199b52ac8889eaecd167f6725 assets/create/models/item/speedometer.json b9abe1331d49871838231f3a8e5d2973634e9325 assets/create/models/item/spout.json @@ -1622,6 +1660,7 @@ fc07b75f81782fa06990c7eb7febc635621df91a data/create/advancements/recipes/buildi e2475d1fad9aaa82e99415a2a5d07a2343ce84a6 data/create/advancements/recipes/building_blocks/blasting/nickel_ingot_compat_thermal.json f994f545e3a1990448e852c556d94f7eaf9954a0 data/create/advancements/recipes/building_blocks/blasting/platinum_ingot_compat_silents_mechanisms.json 85b1a8c173ca7e5421f9d2bd0f3f997c8431d15c data/create/advancements/recipes/building_blocks/blasting/quicksilver_ingot_compat_mysticalworld.json +a61045a27757950d96fee77768bfd96f935f98b2 data/create/advancements/recipes/building_blocks/blasting/silver_ingot_compat_iceandfire.json 9b48187d487ddabcad4f4e4f75b67813f26a746d data/create/advancements/recipes/building_blocks/blasting/silver_ingot_compat_mysticalworld.json 96bf046af4d23dddcca5915cfbfc04a46b0d2912 data/create/advancements/recipes/building_blocks/blasting/silver_ingot_compat_silents_mechanisms.json 96a3efecf663433123861136467d9fa28ea26a1e data/create/advancements/recipes/building_blocks/blasting/silver_ingot_compat_thermal.json @@ -1648,6 +1687,7 @@ cdf4697b74e4a6add2ea41825733f4d9ff2b83e6 data/create/advancements/recipes/buildi 6dff1a0b51d7a81d6a4e8f4fd8fa558f9befea1b data/create/advancements/recipes/building_blocks/smelting/nickel_ingot_compat_thermal.json 70d98f34671f09331f6765447b95cd00c3b8d4e5 data/create/advancements/recipes/building_blocks/smelting/platinum_ingot_compat_silents_mechanisms.json 8e5beb04ea241145f4e34320cba1745fd9d386e6 data/create/advancements/recipes/building_blocks/smelting/quicksilver_ingot_compat_mysticalworld.json +6c6fd69e9efb6a1bda750c6d73109c98e774a498 data/create/advancements/recipes/building_blocks/smelting/silver_ingot_compat_iceandfire.json 60fd25d05bfe101d83e3a13678cca9940665771c data/create/advancements/recipes/building_blocks/smelting/silver_ingot_compat_mysticalworld.json 29685c6f05455faa657cb51433352d005b798cf4 data/create/advancements/recipes/building_blocks/smelting/silver_ingot_compat_silents_mechanisms.json 05b68914ac2fb0da7609a32369bf739e28256e41 data/create/advancements/recipes/building_blocks/smelting/silver_ingot_compat_thermal.json @@ -1703,6 +1743,8 @@ b42213bffce4e51618e1bba481959208d247c120 data/create/advancements/recipes/create 11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json a91b11ae44d9b1f479c6dee1f1a4580104059287 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_valve.json +e17c45fc17e1a8e1e618b6eae02fa0aba3247495 data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json +d1d2fc2f5c4e89393808c65e015917eabb50dffe data/create/advancements/recipes/create.base/crafting/kinetics/gantry_shaft.json dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json 8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json 94b8a1f976b9f853cb6e24b0cef72d2e16c3282f data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json @@ -1770,6 +1812,7 @@ e9faf71b9597deecd2c1fb566f3c438ddc243e82 data/create/advancements/recipes/create b463cf9343f8d08b8ed3e87f46a19facadd657b0 data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json 191213ef824e7b73d66bb3aecc3115306b445e5a data/create/advancements/recipes/create.base/crafting/kinetics/sequenced_gearshift.json cd8cefee21a1690f9158b8e8661a92d20ad0f535 data/create/advancements/recipes/create.base/crafting/kinetics/shaft.json +1b460b6014cb298cbea3e658596f0e753fa8066a data/create/advancements/recipes/create.base/crafting/kinetics/smart_chute.json 232044be44da655ff09deeb99cb220bf71e31096 data/create/advancements/recipes/create.base/crafting/kinetics/smart_fluid_pipe.json e8a5d924ccf30b6eae4b9ec0a8040e31f0eb165b data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json 90ff137eb1533695d9d17296ed180c0a88ddd891 data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json @@ -2410,6 +2453,8 @@ e51893e1601c470da466b35b17251238e15d0361 data/create/loot_tables/blocks/gabbro_b 54879fe6ca3b7271fbb94ec26bef1c3031942d4d data/create/loot_tables/blocks/gabbro_cobblestone_stairs.json ae19749df10663efc51b8b27af310164f250ed38 data/create/loot_tables/blocks/gabbro_cobblestone_wall.json e8d09c919e3b8125d7da0f38383c01bcfc61c7a8 data/create/loot_tables/blocks/gabbro_pillar.json +04e42ba63002ed8ba67780123413f6ff3fb85b02 data/create/loot_tables/blocks/gantry_pinion.json +f2883656e417a78e5e4093002eb1e36ffa1157e9 data/create/loot_tables/blocks/gantry_shaft.json b0109b4a4f0f738cbbe6b5911e8c3c0310b76f99 data/create/loot_tables/blocks/gearbox.json 5f39461c5c9d3ad8d84195b06b9468fe2b0fb269 data/create/loot_tables/blocks/gearshift.json c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data/create/loot_tables/blocks/glass_fluid_pipe.json @@ -2615,6 +2660,7 @@ f70c5b7e7da7abffc82e3d1828499799883bbe85 data/create/loot_tables/blocks/secondar e4f6dccb8bce21b5214c1d8cfb440fc0ba4159d7 data/create/loot_tables/blocks/sequenced_gearshift.json 49f6b51c0618aa0c0133dc1f034ff6c031318cac data/create/loot_tables/blocks/shadow_steel_casing.json b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/shaft.json +22bbb9770388d2a30fa8e95e9a06b7546d66a606 data/create/loot_tables/blocks/smart_chute.json 9e4d8220e513f5ecef27f60001681e9d66331d7b data/create/loot_tables/blocks/smart_fluid_pipe.json 70b6e82e9198d3910877e62c2eab86d46ca27089 data/create/loot_tables/blocks/speedometer.json f6c497d625de67ea9377e840208b1be539d13b73 data/create/loot_tables/blocks/spout.json @@ -2689,6 +2735,7 @@ aeb345e5b4c266ac9e2ef6929b153cb535468d01 data/create/recipes/blasting/lead_ingot bd26be2cc7044537628e10ff057a7ce78b720025 data/create/recipes/blasting/nickel_ingot_compat_thermal.json a99be7aae1706cce96a3b6fadd38295bb53d10b7 data/create/recipes/blasting/platinum_ingot_compat_silents_mechanisms.json 3419a88787e331d59e0da8b9084d8c8a72a84ec0 data/create/recipes/blasting/quicksilver_ingot_compat_mysticalworld.json +88ee97cacce93436dcb6d2cb37219435bcaaf3cb data/create/recipes/blasting/silver_ingot_compat_iceandfire.json 84b73c8ef561ab0ecc2954cd86160595975811d6 data/create/recipes/blasting/silver_ingot_compat_mysticalworld.json 3ce20049c90fc3ce446efac1d166b5e1b2855980 data/create/recipes/blasting/silver_ingot_compat_silents_mechanisms.json c49e88f38ad624a56865bb293e2b81da09ebdf37 data/create/recipes/blasting/silver_ingot_compat_thermal.json @@ -2755,6 +2802,8 @@ f4ae37f736d06ccda5fbba7831a7a174ec916a05 data/create/recipes/crafting/kinetics/f 86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json 3dad2a849796df268cd3a06ed37376f2cc529957 data/create/recipes/crafting/kinetics/fluid_valve.json 84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json +5299a12e9272089e64073c8e151b70a5bc57b53c data/create/recipes/crafting/kinetics/gantry_pinion.json +21095a156547d4a7d215964be793f1e960b81c09 data/create/recipes/crafting/kinetics/gantry_shaft.json 5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json 4d4124b4f1df38d892cb19da19c6464522d3e37d data/create/recipes/crafting/kinetics/gearshift.json @@ -2823,6 +2872,7 @@ d0d7fb94621f6f02fa3137666f20e677022d9d5b data/create/recipes/crafting/kinetics/s 66922e18791c87fadb7629cdf32d3dd2f50ccd13 data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json a17db27e61baa45f8a6ecb46a6d2a5a464704f8b data/create/recipes/crafting/kinetics/sequenced_gearshift.json 2e36438665bfb97265fd4e6ea85505970eae67fd data/create/recipes/crafting/kinetics/shaft.json +683c9e128a976282eaa6cdbbee3914e4c66b1676 data/create/recipes/crafting/kinetics/smart_chute.json 319e75dc4be645efd4809dafc1331581a8022e93 data/create/recipes/crafting/kinetics/smart_fluid_pipe.json b1a74f0b51fa37ca1ed814266b3d69b8b7e69fa3 data/create/recipes/crafting/kinetics/speedometer.json 8d632845deeb723e1a56083536ee5f9d60de2fcb data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json @@ -3184,6 +3234,7 @@ ea6fb7e30fa22cd87ff4760288e11f909b78ac86 data/create/recipes/milling/red_tulip.j bda581c2039f41f7d55527814a46903f10da7e05 data/create/recipes/milling/rose_bush.json 54be62a1bf098a370d315f79068ec326e4f4d6c2 data/create/recipes/milling/saddle.json 8bc6124293f4efb5f2d0fa4a3166c6d00a88a14c data/create/recipes/milling/sand.json +42c5837c16132632da52325cddea3cdbb318e822 data/create/recipes/milling/sandstone.json 87e30347cc28aa5fb2daefae4c25fa81ce92b0f1 data/create/recipes/milling/silver_ore.json 1e14bd30032aab6dfaff5bca50c791332ffc1aaa data/create/recipes/milling/sugar_cane.json af2beca9f934601ad029f34bad08be3cee07f6b4 data/create/recipes/milling/sunflower.json @@ -3395,6 +3446,7 @@ bf0e5df5a88e583e39a4e14b006cbf33b99611e1 data/create/recipes/smelting/limestone. 92c308baf81fe2c8a63c90b0dfc7cf8cc2183c4b data/create/recipes/smelting/quicksilver_ingot_compat_mysticalworld.json 2c230522bb0946bde6a51442cb15c5efeea99b15 data/create/recipes/smelting/scoria.json f5317c85a9e10a5f9346e13aef8bb364a5203346 data/create/recipes/smelting/scoria_from_natural.json +893a857a02ef643296473148216da05102a09e05 data/create/recipes/smelting/silver_ingot_compat_iceandfire.json 96c2b799b812e469bb1785200d68c1e8f8cfacf7 data/create/recipes/smelting/silver_ingot_compat_mysticalworld.json 21c5fbce648ca8812d4c75e3c71934bc269e2216 data/create/recipes/smelting/silver_ingot_compat_silents_mechanisms.json c01f5fdef7419a2da5e0f24d61637ec35a006fd1 data/create/recipes/smelting/silver_ingot_compat_thermal.json @@ -3418,6 +3470,7 @@ c4d680eed98791fe45fa93aeeae9e8dbd508d6f5 data/create/recipes/splashing/gravel.js 7af4d9ae50af13da0d4fc814687f9586ff872798 data/create/recipes/splashing/gray_concrete_powder.json 23fb61c0e4bcca58fa7241db9cbef07bf4bd9a9b data/create/recipes/splashing/green_concrete_powder.json 0a15fffe26190b78d2177c8302c92fc2232ce398 data/create/recipes/splashing/ice.json +42e05e89ad9c83bd74ea67878930056ee0491fa8 data/create/recipes/splashing/iceandfire/crushed_silver_ore.json 1c978c74c949e9325a4078f25d8b39ed2d70f4a0 data/create/recipes/splashing/immersiveengineering/crushed_aluminum_ore.json 10ce4f124a8caf28027f4976f49a54561bfb7d18 data/create/recipes/splashing/immersiveengineering/crushed_lead_ore.json ab433eb5d0739ca5932588f48308151d7e0bacc2 data/create/recipes/splashing/immersiveengineering/crushed_nickel_ore.json diff --git a/src/generated/resources/assets/create/blockstates/andesite_funnel.json b/src/generated/resources/assets/create/blockstates/andesite_funnel.json index 9056622b7..0161a1706 100644 --- a/src/generated/resources/assets/create/blockstates/andesite_funnel.json +++ b/src/generated/resources/assets/create/blockstates/andesite_funnel.json @@ -1,55 +1,183 @@ { "variants": { - "facing=down,powered=false": { - "model": "create:block/andesite_funnel", - "x": 180 + "extracting=false,face=floor,facing=north,powered=false": { + "model": "create:block/andesite_funnel_floor_pull" }, - "facing=up,powered=false": { - "model": "create:block/andesite_funnel" + "extracting=true,face=floor,facing=north,powered=false": { + "model": "create:block/andesite_funnel_floor_push" }, - "facing=north,powered=false": { - "model": "create:block/andesite_funnel", - "x": 90 + "extracting=false,face=wall,facing=north,powered=false": { + "model": "create:block/andesite_funnel_wall_pull" }, - "facing=south,powered=false": { - "model": "create:block/andesite_funnel", - "x": 90, + "extracting=true,face=wall,facing=north,powered=false": { + "model": "create:block/andesite_funnel_wall_push" + }, + "extracting=false,face=ceiling,facing=north,powered=false": { + "model": "create:block/andesite_funnel_ceiling_pull" + }, + "extracting=true,face=ceiling,facing=north,powered=false": { + "model": "create:block/andesite_funnel_ceiling_push" + }, + "extracting=false,face=floor,facing=south,powered=false": { + "model": "create:block/andesite_funnel_floor_pull", "y": 180 }, - "facing=west,powered=false": { - "model": "create:block/andesite_funnel", - "x": 90, + "extracting=true,face=floor,facing=south,powered=false": { + "model": "create:block/andesite_funnel_floor_push", + "y": 180 + }, + "extracting=false,face=wall,facing=south,powered=false": { + "model": "create:block/andesite_funnel_wall_pull", + "y": 180 + }, + "extracting=true,face=wall,facing=south,powered=false": { + "model": "create:block/andesite_funnel_wall_push", + "y": 180 + }, + "extracting=false,face=ceiling,facing=south,powered=false": { + "model": "create:block/andesite_funnel_ceiling_pull", + "y": 180 + }, + "extracting=true,face=ceiling,facing=south,powered=false": { + "model": "create:block/andesite_funnel_ceiling_push", + "y": 180 + }, + "extracting=false,face=floor,facing=west,powered=false": { + "model": "create:block/andesite_funnel_floor_pull", "y": 270 }, - "facing=east,powered=false": { - "model": "create:block/andesite_funnel", - "x": 90, + "extracting=true,face=floor,facing=west,powered=false": { + "model": "create:block/andesite_funnel_floor_push", + "y": 270 + }, + "extracting=false,face=wall,facing=west,powered=false": { + "model": "create:block/andesite_funnel_wall_pull", + "y": 270 + }, + "extracting=true,face=wall,facing=west,powered=false": { + "model": "create:block/andesite_funnel_wall_push", + "y": 270 + }, + "extracting=false,face=ceiling,facing=west,powered=false": { + "model": "create:block/andesite_funnel_ceiling_pull", + "y": 270 + }, + "extracting=true,face=ceiling,facing=west,powered=false": { + "model": "create:block/andesite_funnel_ceiling_push", + "y": 270 + }, + "extracting=false,face=floor,facing=east,powered=false": { + "model": "create:block/andesite_funnel_floor_pull", "y": 90 }, - "facing=down,powered=true": { - "model": "create:block/andesite_funnel_powered", - "x": 180 + "extracting=true,face=floor,facing=east,powered=false": { + "model": "create:block/andesite_funnel_floor_push", + "y": 90 }, - "facing=up,powered=true": { - "model": "create:block/andesite_funnel_powered" + "extracting=false,face=wall,facing=east,powered=false": { + "model": "create:block/andesite_funnel_wall_pull", + "y": 90 }, - "facing=north,powered=true": { - "model": "create:block/andesite_funnel_powered", - "x": 90 + "extracting=true,face=wall,facing=east,powered=false": { + "model": "create:block/andesite_funnel_wall_push", + "y": 90 }, - "facing=south,powered=true": { - "model": "create:block/andesite_funnel_powered", - "x": 90, + "extracting=false,face=ceiling,facing=east,powered=false": { + "model": "create:block/andesite_funnel_ceiling_pull", + "y": 90 + }, + "extracting=true,face=ceiling,facing=east,powered=false": { + "model": "create:block/andesite_funnel_ceiling_push", + "y": 90 + }, + "extracting=false,face=floor,facing=north,powered=true": { + "model": "create:block/andesite_funnel_floor_pull_powered" + }, + "extracting=true,face=floor,facing=north,powered=true": { + "model": "create:block/andesite_funnel_floor_push_powered" + }, + "extracting=false,face=wall,facing=north,powered=true": { + "model": "create:block/andesite_funnel_wall_pull_powered" + }, + "extracting=true,face=wall,facing=north,powered=true": { + "model": "create:block/andesite_funnel_wall_push_powered" + }, + "extracting=false,face=ceiling,facing=north,powered=true": { + "model": "create:block/andesite_funnel_ceiling_pull_powered" + }, + "extracting=true,face=ceiling,facing=north,powered=true": { + "model": "create:block/andesite_funnel_ceiling_push_powered" + }, + "extracting=false,face=floor,facing=south,powered=true": { + "model": "create:block/andesite_funnel_floor_pull_powered", "y": 180 }, - "facing=west,powered=true": { - "model": "create:block/andesite_funnel_powered", - "x": 90, + "extracting=true,face=floor,facing=south,powered=true": { + "model": "create:block/andesite_funnel_floor_push_powered", + "y": 180 + }, + "extracting=false,face=wall,facing=south,powered=true": { + "model": "create:block/andesite_funnel_wall_pull_powered", + "y": 180 + }, + "extracting=true,face=wall,facing=south,powered=true": { + "model": "create:block/andesite_funnel_wall_push_powered", + "y": 180 + }, + "extracting=false,face=ceiling,facing=south,powered=true": { + "model": "create:block/andesite_funnel_ceiling_pull_powered", + "y": 180 + }, + "extracting=true,face=ceiling,facing=south,powered=true": { + "model": "create:block/andesite_funnel_ceiling_push_powered", + "y": 180 + }, + "extracting=false,face=floor,facing=west,powered=true": { + "model": "create:block/andesite_funnel_floor_pull_powered", "y": 270 }, - "facing=east,powered=true": { - "model": "create:block/andesite_funnel_powered", - "x": 90, + "extracting=true,face=floor,facing=west,powered=true": { + "model": "create:block/andesite_funnel_floor_push_powered", + "y": 270 + }, + "extracting=false,face=wall,facing=west,powered=true": { + "model": "create:block/andesite_funnel_wall_pull_powered", + "y": 270 + }, + "extracting=true,face=wall,facing=west,powered=true": { + "model": "create:block/andesite_funnel_wall_push_powered", + "y": 270 + }, + "extracting=false,face=ceiling,facing=west,powered=true": { + "model": "create:block/andesite_funnel_ceiling_pull_powered", + "y": 270 + }, + "extracting=true,face=ceiling,facing=west,powered=true": { + "model": "create:block/andesite_funnel_ceiling_push_powered", + "y": 270 + }, + "extracting=false,face=floor,facing=east,powered=true": { + "model": "create:block/andesite_funnel_floor_pull_powered", + "y": 90 + }, + "extracting=true,face=floor,facing=east,powered=true": { + "model": "create:block/andesite_funnel_floor_push_powered", + "y": 90 + }, + "extracting=false,face=wall,facing=east,powered=true": { + "model": "create:block/andesite_funnel_wall_pull_powered", + "y": 90 + }, + "extracting=true,face=wall,facing=east,powered=true": { + "model": "create:block/andesite_funnel_wall_push_powered", + "y": 90 + }, + "extracting=false,face=ceiling,facing=east,powered=true": { + "model": "create:block/andesite_funnel_ceiling_pull_powered", + "y": 90 + }, + "extracting=true,face=ceiling,facing=east,powered=true": { + "model": "create:block/andesite_funnel_ceiling_push_powered", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/brass_funnel.json b/src/generated/resources/assets/create/blockstates/brass_funnel.json index bd9c61333..7458dae7c 100644 --- a/src/generated/resources/assets/create/blockstates/brass_funnel.json +++ b/src/generated/resources/assets/create/blockstates/brass_funnel.json @@ -1,55 +1,183 @@ { "variants": { - "facing=down,powered=false": { - "model": "create:block/brass_funnel", - "x": 180 + "extracting=false,face=floor,facing=north,powered=false": { + "model": "create:block/brass_funnel_floor_pull" }, - "facing=up,powered=false": { - "model": "create:block/brass_funnel" + "extracting=true,face=floor,facing=north,powered=false": { + "model": "create:block/brass_funnel_floor_push" }, - "facing=north,powered=false": { - "model": "create:block/brass_funnel", - "x": 90 + "extracting=false,face=wall,facing=north,powered=false": { + "model": "create:block/brass_funnel_wall_pull" }, - "facing=south,powered=false": { - "model": "create:block/brass_funnel", - "x": 90, + "extracting=true,face=wall,facing=north,powered=false": { + "model": "create:block/brass_funnel_wall_push" + }, + "extracting=false,face=ceiling,facing=north,powered=false": { + "model": "create:block/brass_funnel_ceiling_pull" + }, + "extracting=true,face=ceiling,facing=north,powered=false": { + "model": "create:block/brass_funnel_ceiling_push" + }, + "extracting=false,face=floor,facing=south,powered=false": { + "model": "create:block/brass_funnel_floor_pull", "y": 180 }, - "facing=west,powered=false": { - "model": "create:block/brass_funnel", - "x": 90, + "extracting=true,face=floor,facing=south,powered=false": { + "model": "create:block/brass_funnel_floor_push", + "y": 180 + }, + "extracting=false,face=wall,facing=south,powered=false": { + "model": "create:block/brass_funnel_wall_pull", + "y": 180 + }, + "extracting=true,face=wall,facing=south,powered=false": { + "model": "create:block/brass_funnel_wall_push", + "y": 180 + }, + "extracting=false,face=ceiling,facing=south,powered=false": { + "model": "create:block/brass_funnel_ceiling_pull", + "y": 180 + }, + "extracting=true,face=ceiling,facing=south,powered=false": { + "model": "create:block/brass_funnel_ceiling_push", + "y": 180 + }, + "extracting=false,face=floor,facing=west,powered=false": { + "model": "create:block/brass_funnel_floor_pull", "y": 270 }, - "facing=east,powered=false": { - "model": "create:block/brass_funnel", - "x": 90, + "extracting=true,face=floor,facing=west,powered=false": { + "model": "create:block/brass_funnel_floor_push", + "y": 270 + }, + "extracting=false,face=wall,facing=west,powered=false": { + "model": "create:block/brass_funnel_wall_pull", + "y": 270 + }, + "extracting=true,face=wall,facing=west,powered=false": { + "model": "create:block/brass_funnel_wall_push", + "y": 270 + }, + "extracting=false,face=ceiling,facing=west,powered=false": { + "model": "create:block/brass_funnel_ceiling_pull", + "y": 270 + }, + "extracting=true,face=ceiling,facing=west,powered=false": { + "model": "create:block/brass_funnel_ceiling_push", + "y": 270 + }, + "extracting=false,face=floor,facing=east,powered=false": { + "model": "create:block/brass_funnel_floor_pull", "y": 90 }, - "facing=down,powered=true": { - "model": "create:block/brass_funnel_powered", - "x": 180 + "extracting=true,face=floor,facing=east,powered=false": { + "model": "create:block/brass_funnel_floor_push", + "y": 90 }, - "facing=up,powered=true": { - "model": "create:block/brass_funnel_powered" + "extracting=false,face=wall,facing=east,powered=false": { + "model": "create:block/brass_funnel_wall_pull", + "y": 90 }, - "facing=north,powered=true": { - "model": "create:block/brass_funnel_powered", - "x": 90 + "extracting=true,face=wall,facing=east,powered=false": { + "model": "create:block/brass_funnel_wall_push", + "y": 90 }, - "facing=south,powered=true": { - "model": "create:block/brass_funnel_powered", - "x": 90, + "extracting=false,face=ceiling,facing=east,powered=false": { + "model": "create:block/brass_funnel_ceiling_pull", + "y": 90 + }, + "extracting=true,face=ceiling,facing=east,powered=false": { + "model": "create:block/brass_funnel_ceiling_push", + "y": 90 + }, + "extracting=false,face=floor,facing=north,powered=true": { + "model": "create:block/brass_funnel_floor_pull_powered" + }, + "extracting=true,face=floor,facing=north,powered=true": { + "model": "create:block/brass_funnel_floor_push_powered" + }, + "extracting=false,face=wall,facing=north,powered=true": { + "model": "create:block/brass_funnel_wall_pull_powered" + }, + "extracting=true,face=wall,facing=north,powered=true": { + "model": "create:block/brass_funnel_wall_push_powered" + }, + "extracting=false,face=ceiling,facing=north,powered=true": { + "model": "create:block/brass_funnel_ceiling_pull_powered" + }, + "extracting=true,face=ceiling,facing=north,powered=true": { + "model": "create:block/brass_funnel_ceiling_push_powered" + }, + "extracting=false,face=floor,facing=south,powered=true": { + "model": "create:block/brass_funnel_floor_pull_powered", "y": 180 }, - "facing=west,powered=true": { - "model": "create:block/brass_funnel_powered", - "x": 90, + "extracting=true,face=floor,facing=south,powered=true": { + "model": "create:block/brass_funnel_floor_push_powered", + "y": 180 + }, + "extracting=false,face=wall,facing=south,powered=true": { + "model": "create:block/brass_funnel_wall_pull_powered", + "y": 180 + }, + "extracting=true,face=wall,facing=south,powered=true": { + "model": "create:block/brass_funnel_wall_push_powered", + "y": 180 + }, + "extracting=false,face=ceiling,facing=south,powered=true": { + "model": "create:block/brass_funnel_ceiling_pull_powered", + "y": 180 + }, + "extracting=true,face=ceiling,facing=south,powered=true": { + "model": "create:block/brass_funnel_ceiling_push_powered", + "y": 180 + }, + "extracting=false,face=floor,facing=west,powered=true": { + "model": "create:block/brass_funnel_floor_pull_powered", "y": 270 }, - "facing=east,powered=true": { - "model": "create:block/brass_funnel_powered", - "x": 90, + "extracting=true,face=floor,facing=west,powered=true": { + "model": "create:block/brass_funnel_floor_push_powered", + "y": 270 + }, + "extracting=false,face=wall,facing=west,powered=true": { + "model": "create:block/brass_funnel_wall_pull_powered", + "y": 270 + }, + "extracting=true,face=wall,facing=west,powered=true": { + "model": "create:block/brass_funnel_wall_push_powered", + "y": 270 + }, + "extracting=false,face=ceiling,facing=west,powered=true": { + "model": "create:block/brass_funnel_ceiling_pull_powered", + "y": 270 + }, + "extracting=true,face=ceiling,facing=west,powered=true": { + "model": "create:block/brass_funnel_ceiling_push_powered", + "y": 270 + }, + "extracting=false,face=floor,facing=east,powered=true": { + "model": "create:block/brass_funnel_floor_pull_powered", + "y": 90 + }, + "extracting=true,face=floor,facing=east,powered=true": { + "model": "create:block/brass_funnel_floor_push_powered", + "y": 90 + }, + "extracting=false,face=wall,facing=east,powered=true": { + "model": "create:block/brass_funnel_wall_pull_powered", + "y": 90 + }, + "extracting=true,face=wall,facing=east,powered=true": { + "model": "create:block/brass_funnel_wall_push_powered", + "y": 90 + }, + "extracting=false,face=ceiling,facing=east,powered=true": { + "model": "create:block/brass_funnel_ceiling_pull_powered", + "y": 90 + }, + "extracting=true,face=ceiling,facing=east,powered=true": { + "model": "create:block/brass_funnel_ceiling_push_powered", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index a8a9a60dc..581373307 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -61,9 +61,9 @@ { "when": { "south": "false", - "north": "true", + "up": "true", "down": "false", - "up": "true" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -72,9 +72,9 @@ { "when": { "south": "true", - "north": "false", + "up": "true", "down": "false", - "up": "true" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -83,9 +83,9 @@ { "when": { "south": "false", - "north": "true", + "up": "false", "down": "true", - "up": "false" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -94,9 +94,9 @@ { "when": { "south": "true", - "north": "false", + "up": "false", "down": "true", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -105,9 +105,9 @@ { "when": { "south": "false", - "north": "false", + "up": "true", "down": "true", - "up": "true" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -116,9 +116,9 @@ { "when": { "south": "false", - "north": "false", + "up": "true", "down": "false", - "up": "true" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -127,9 +127,9 @@ { "when": { "south": "false", - "north": "false", + "up": "false", "down": "true", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -138,9 +138,9 @@ { "when": { "south": "true", - "north": "true", + "up": "false", "down": "false", - "up": "false" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -149,9 +149,9 @@ { "when": { "south": "false", - "north": "true", + "up": "false", "down": "false", - "up": "false" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -160,9 +160,9 @@ { "when": { "south": "true", - "north": "false", + "up": "false", "down": "false", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -171,9 +171,9 @@ { "when": { "south": "false", - "north": "false", + "up": "false", "down": "false", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -302,10 +302,10 @@ }, { "when": { - "west": "false", - "east": "true", + "up": "true", "down": "false", - "up": "true" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "west": "true", - "east": "false", + "up": "true", "down": "false", - "up": "true" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "west": "false", - "east": "true", + "up": "false", "down": "true", - "up": "false" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "west": "true", - "east": "false", + "up": "false", "down": "true", - "up": "false" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "true", "down": "true", - "up": "true" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "true", "down": "false", - "up": "true" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "false", "down": "true", - "up": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "true", - "east": "true", - "down": "false", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "false", - "east": "true", - "down": "false", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "true", - "east": "false", - "down": "false", - "up": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "false", "down": "false", - "up": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/gantry_pinion.json b/src/generated/resources/assets/create/blockstates/gantry_pinion.json new file mode 100644 index 000000000..1280e18d4 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gantry_pinion.json @@ -0,0 +1,52 @@ +{ + "variants": { + "axis_along_first=false,facing=down": { + "model": "create:block/gantry_pinion/horizontal", + "x": 270, + "y": 90 + }, + "axis_along_first=true,facing=down": { + "model": "create:block/gantry_pinion/horizontal", + "x": 270 + }, + "axis_along_first=false,facing=up": { + "model": "create:block/gantry_pinion/horizontal", + "x": 90, + "y": 90 + }, + "axis_along_first=true,facing=up": { + "model": "create:block/gantry_pinion/horizontal", + "x": 90 + }, + "axis_along_first=false,facing=north": { + "model": "create:block/gantry_pinion/vertical", + "y": 180 + }, + "axis_along_first=true,facing=north": { + "model": "create:block/gantry_pinion/horizontal", + "y": 180 + }, + "axis_along_first=false,facing=south": { + "model": "create:block/gantry_pinion/vertical" + }, + "axis_along_first=true,facing=south": { + "model": "create:block/gantry_pinion/horizontal" + }, + "axis_along_first=false,facing=west": { + "model": "create:block/gantry_pinion/horizontal", + "y": 90 + }, + "axis_along_first=true,facing=west": { + "model": "create:block/gantry_pinion/vertical", + "y": 90 + }, + "axis_along_first=false,facing=east": { + "model": "create:block/gantry_pinion/horizontal", + "y": 270 + }, + "axis_along_first=true,facing=east": { + "model": "create:block/gantry_pinion/vertical", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/gantry_shaft.json b/src/generated/resources/assets/create/blockstates/gantry_shaft.json new file mode 100644 index 000000000..379d7a3da --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gantry_shaft.json @@ -0,0 +1,212 @@ +{ + "variants": { + "facing=down,part=start,powered=false": { + "model": "create:block/gantry_shaft_start_flipped", + "x": 180 + }, + "facing=up,part=start,powered=false": { + "model": "create:block/gantry_shaft/block_start" + }, + "facing=north,part=start,powered=false": { + "model": "create:block/gantry_shaft_start_flipped", + "x": 90 + }, + "facing=south,part=start,powered=false": { + "model": "create:block/gantry_shaft/block_start", + "x": 90, + "y": 180 + }, + "facing=west,part=start,powered=false": { + "model": "create:block/gantry_shaft_start_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=start,powered=false": { + "model": "create:block/gantry_shaft/block_start", + "x": 90, + "y": 90 + }, + "facing=down,part=middle,powered=false": { + "model": "create:block/gantry_shaft_middle_flipped", + "x": 180 + }, + "facing=up,part=middle,powered=false": { + "model": "create:block/gantry_shaft/block_middle" + }, + "facing=north,part=middle,powered=false": { + "model": "create:block/gantry_shaft_middle_flipped", + "x": 90 + }, + "facing=south,part=middle,powered=false": { + "model": "create:block/gantry_shaft/block_middle", + "x": 90, + "y": 180 + }, + "facing=west,part=middle,powered=false": { + "model": "create:block/gantry_shaft_middle_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=middle,powered=false": { + "model": "create:block/gantry_shaft/block_middle", + "x": 90, + "y": 90 + }, + "facing=down,part=end,powered=false": { + "model": "create:block/gantry_shaft_end_flipped", + "x": 180 + }, + "facing=up,part=end,powered=false": { + "model": "create:block/gantry_shaft/block_end" + }, + "facing=north,part=end,powered=false": { + "model": "create:block/gantry_shaft_end_flipped", + "x": 90 + }, + "facing=south,part=end,powered=false": { + "model": "create:block/gantry_shaft/block_end", + "x": 90, + "y": 180 + }, + "facing=west,part=end,powered=false": { + "model": "create:block/gantry_shaft_end_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=end,powered=false": { + "model": "create:block/gantry_shaft/block_end", + "x": 90, + "y": 90 + }, + "facing=down,part=single,powered=false": { + "model": "create:block/gantry_shaft_single_flipped", + "x": 180 + }, + "facing=up,part=single,powered=false": { + "model": "create:block/gantry_shaft/block_single" + }, + "facing=north,part=single,powered=false": { + "model": "create:block/gantry_shaft_single_flipped", + "x": 90 + }, + "facing=south,part=single,powered=false": { + "model": "create:block/gantry_shaft/block_single", + "x": 90, + "y": 180 + }, + "facing=west,part=single,powered=false": { + "model": "create:block/gantry_shaft_single_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=single,powered=false": { + "model": "create:block/gantry_shaft/block_single", + "x": 90, + "y": 90 + }, + "facing=down,part=start,powered=true": { + "model": "create:block/gantry_shaft_start_powered_flipped", + "x": 180 + }, + "facing=up,part=start,powered=true": { + "model": "create:block/gantry_shaft_start_powered" + }, + "facing=north,part=start,powered=true": { + "model": "create:block/gantry_shaft_start_powered_flipped", + "x": 90 + }, + "facing=south,part=start,powered=true": { + "model": "create:block/gantry_shaft_start_powered", + "x": 90, + "y": 180 + }, + "facing=west,part=start,powered=true": { + "model": "create:block/gantry_shaft_start_powered_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=start,powered=true": { + "model": "create:block/gantry_shaft_start_powered", + "x": 90, + "y": 90 + }, + "facing=down,part=middle,powered=true": { + "model": "create:block/gantry_shaft_middle_powered_flipped", + "x": 180 + }, + "facing=up,part=middle,powered=true": { + "model": "create:block/gantry_shaft_middle_powered" + }, + "facing=north,part=middle,powered=true": { + "model": "create:block/gantry_shaft_middle_powered_flipped", + "x": 90 + }, + "facing=south,part=middle,powered=true": { + "model": "create:block/gantry_shaft_middle_powered", + "x": 90, + "y": 180 + }, + "facing=west,part=middle,powered=true": { + "model": "create:block/gantry_shaft_middle_powered_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=middle,powered=true": { + "model": "create:block/gantry_shaft_middle_powered", + "x": 90, + "y": 90 + }, + "facing=down,part=end,powered=true": { + "model": "create:block/gantry_shaft_end_powered_flipped", + "x": 180 + }, + "facing=up,part=end,powered=true": { + "model": "create:block/gantry_shaft_end_powered" + }, + "facing=north,part=end,powered=true": { + "model": "create:block/gantry_shaft_end_powered_flipped", + "x": 90 + }, + "facing=south,part=end,powered=true": { + "model": "create:block/gantry_shaft_end_powered", + "x": 90, + "y": 180 + }, + "facing=west,part=end,powered=true": { + "model": "create:block/gantry_shaft_end_powered_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=end,powered=true": { + "model": "create:block/gantry_shaft_end_powered", + "x": 90, + "y": 90 + }, + "facing=down,part=single,powered=true": { + "model": "create:block/gantry_shaft_single_powered_flipped", + "x": 180 + }, + "facing=up,part=single,powered=true": { + "model": "create:block/gantry_shaft_single_powered" + }, + "facing=north,part=single,powered=true": { + "model": "create:block/gantry_shaft_single_powered_flipped", + "x": 90 + }, + "facing=south,part=single,powered=true": { + "model": "create:block/gantry_shaft_single_powered", + "x": 90, + "y": 180 + }, + "facing=west,part=single,powered=true": { + "model": "create:block/gantry_shaft_single_powered_flipped", + "x": 90, + "y": 270 + }, + "facing=east,part=single,powered=true": { + "model": "create:block/gantry_shaft_single_powered", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 899486339..1aa3d3728 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/blockstates/smart_chute.json b/src/generated/resources/assets/create/blockstates/smart_chute.json new file mode 100644 index 000000000..6f7f38d80 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/smart_chute.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "create:block/smart_chute/block" + }, + "powered=true": { + "model": "create:block/smart_chute/block_powered" + } + } +} \ 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 6e3dcc151..65c0554be 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -158,6 +158,8 @@ "block.create.gabbro_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141", "block.create.gabbro_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141", "block.create.gabbro_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 o\u0279qq\u0250\u2141", + "block.create.gantry_pinion": "uo\u0131u\u0131\u0500 \u028E\u0279\u0287u\u0250\u2141", + "block.create.gantry_shaft": "\u0287\u025F\u0250\u0265S \u028E\u0279\u0287u\u0250\u2141", "block.create.gearbox": "xoq\u0279\u0250\u01DD\u2141", "block.create.gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141", "block.create.glass_fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132 ss\u0250\u05DF\u2141", @@ -364,6 +366,7 @@ "block.create.sequenced_gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141 p\u01DD\u0254u\u01DDnb\u01DDS", "block.create.shadow_steel_casing": "bu\u0131s\u0250\u0186 \u028Dop\u0250\u0265S", "block.create.shaft": "\u0287\u025F\u0250\u0265S", + "block.create.smart_chute": "\u01DD\u0287n\u0265\u0186 \u0287\u0279\u0250\u026FS", "block.create.smart_fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132 \u0287\u0279\u0250\u026FS", "block.create.speedometer": "\u0279\u01DD\u0287\u01DD\u026Fop\u01DD\u01DDdS", "block.create.spout": "\u0287nodS", @@ -399,11 +402,10 @@ "block.create.zinc_block": "\u029E\u0254o\u05DF\u15FA \u0254u\u0131Z", "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", + "entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141", "entity.create.seat": "\u0287\u0250\u01DDS", "entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S", "entity.create.super_glue": "\u01DDn\u05DF\u2141 \u0279\u01DDdnS", - "fluid.create.chocolate": "\u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186", - "fluid.create.honey": "\u028E\u01DDuoH", "fluid.create.milk": "\u029E\u05DF\u0131W", "fluid.create.potion": "uo\u0131\u0287o\u0500", "fluid.create.tea": "\u0250\u01DD\u27D8 s,\u0279\u01DDp\u05DF\u0131n\u15FA", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a501c4056..fb30e864a 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -161,6 +161,8 @@ "block.create.gabbro_cobblestone_stairs": "Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "Gabbro Pillar", + "block.create.gantry_pinion": "Gantry Pinion", + "block.create.gantry_shaft": "Gantry Shaft", "block.create.gearbox": "Gearbox", "block.create.gearshift": "Gearshift", "block.create.glass_fluid_pipe": "Glass Fluid Pipe", @@ -367,6 +369,7 @@ "block.create.sequenced_gearshift": "Sequenced Gearshift", "block.create.shadow_steel_casing": "Shadow Casing", "block.create.shaft": "Shaft", + "block.create.smart_chute": "Smart Chute", "block.create.smart_fluid_pipe": "Smart Fluid Pipe", "block.create.speedometer": "Speedometer", "block.create.spout": "Spout", @@ -403,12 +406,11 @@ "block.create.zinc_ore": "Zinc Ore", "entity.create.contraption": "Contraption", + "entity.create.gantry_contraption": "Gantry Contraption", "entity.create.seat": "Seat", "entity.create.stationary_contraption": "Stationary Contraption", "entity.create.super_glue": "Super Glue", - "fluid.create.chocolate": "Chocolate", - "fluid.create.honey": "Honey", "fluid.create.milk": "Milk", "fluid.create.potion": "Potion", "fluid.create.tea": "Builder's Tea", @@ -1083,7 +1085,10 @@ "create.tooltip.chute.fans_push_down": "Fans push from Above", "create.tooltip.chute.fans_pull_up": "Fans pull from Above", "create.tooltip.chute.fans_pull_down": "Fans pull from Below", + "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "Bottomless Supply", + "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "No Targets", "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "Horizontal Funnels", @@ -1160,7 +1165,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "_Adjusts window shutters_ if the tunnel has a window on that face.", @@ -1174,7 +1179,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "_Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "_Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "Filtering", @@ -1503,7 +1508,7 @@ "block.create.reinforced_rail.tooltip.summary": "A timber stabilized rail, _does not need supports_.", "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", - "block.create.mechanical_mixer.tooltip.summary": "A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", + "block.create.mechanical_mixer.tooltip.summary": "A kinetic whisk providing automated shapeless crafting recipes of multiple ingredients. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", "block.create.mechanical_mixer.tooltip.condition1": "When above Basin", "block.create.mechanical_mixer.tooltip.behaviour1": "Starts to mix items in the basin whenever all necessary ingredients are present. To prevent unwanted recipes, use the filter slot on the basin or cut the rotational force until all desired ingredients have been added.", 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 8277dc346..c4b5223f1 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: 1209", + "_": "Missing Localizations: 1214", "_": "->------------------------] Game Elements [------------------------<-", @@ -26,97 +26,97 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesittunnel", "block.create.basin": "UNLOCALIZED: Behälter", "block.create.belt": "Mechanischer Riemen", - "block.create.birch_window": "UNLOCALIZED: Birkenfenster", - "block.create.birch_window_pane": "UNLOCALIZED: Birkenfensterscheibe", - "block.create.black_sail": "UNLOCALIZED: Black Sail", - "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", - "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", - "block.create.blue_sail": "UNLOCALIZED: Blue Sail", - "block.create.blue_seat": "UNLOCALIZED: Blue Seat", - "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", - "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", - "block.create.brass_block": "UNLOCALIZED: Brass Block", - "block.create.brass_casing": "UNLOCALIZED: Brass Casing", - "block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft", - "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", - "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", - "block.create.brown_sail": "UNLOCALIZED: Brown Sail", - "block.create.brown_seat": "UNLOCALIZED: Brown Seat", - "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", - "block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", - "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", - "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", - "block.create.chiseled_gabbro": "UNLOCALIZED: Chiseled Gabbro", - "block.create.chiseled_limestone": "UNLOCALIZED: Chiseled Limestone", - "block.create.chiseled_scoria": "UNLOCALIZED: Chiseled Scoria", - "block.create.chiseled_weathered_limestone": "UNLOCALIZED: Chiseled Weathered Limestone", - "block.create.chocolate": "UNLOCALIZED: Chocolate", - "block.create.chute": "UNLOCALIZED: Chute", - "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", + "block.create.birch_window": "UNLOCALIZED: Birch Window", + "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Schwarzes Segel", + "block.create.black_seat": "UNLOCALIZED: Schwarzer Sitz", + "block.create.black_valve_handle": "UNLOCALIZED: Schwarzer Ventilgriff", + "block.create.blaze_burner": "UNLOCALIZED: Lohenbrenner", + "block.create.blue_sail": "UNLOCALIZED: Blaues Segel", + "block.create.blue_seat": "UNLOCALIZED: Blauer Sitz", + "block.create.blue_valve_handle": "UNLOCALIZED: Blauer Ventilgriff", + "block.create.brass_belt_funnel": "UNLOCALIZED: Riementrichter aus Messing", + "block.create.brass_block": "UNLOCALIZED: Messing Block", + "block.create.brass_casing": "UNLOCALIZED: Messingrahmen", + "block.create.brass_encased_shaft": "UNLOCALIZED: Messingummantelte Welle", + "block.create.brass_funnel": "UNLOCALIZED: Messingtrichter", + "block.create.brass_tunnel": "UNLOCALIZED: Messingtunnel", + "block.create.brown_sail": "UNLOCALIZED: Braunes Segel", + "block.create.brown_seat": "UNLOCALIZED: Brauner Sitz", + "block.create.brown_valve_handle": "UNLOCALIZED: Brauner Ventilgriff", + "block.create.cart_assembler": "UNLOCALIZED: Lohrenmonteur", + "block.create.chiseled_dark_scoria": "UNLOCALIZED: Gemeißelte dunkle Schlacke", + "block.create.chiseled_dolomite": "UNLOCALIZED: Gemeißeltes Dolomit", + "block.create.chiseled_gabbro": "UNLOCALIZED: Gemeißeltes Gabbro", + "block.create.chiseled_limestone": "UNLOCALIZED: Gemeißelter Kalkstein", + "block.create.chiseled_scoria": "UNLOCALIZED: Gemeißelte Schlacke", + "block.create.chiseled_weathered_limestone": "UNLOCALIZED: Gemeißelter verwitterter Kalkstein", + "block.create.chocolate": "UNLOCALIZED: Schokolade", + "block.create.chute": "UNLOCALIZED: Rinne", + "block.create.clockwork_bearing": "UNLOCALIZED: Uhrwerk-Lager", "block.create.clutch": "Kupplung", "block.create.cogwheel": "Zahnrad", - "block.create.content_observer": "UNLOCALIZED: Content Observer", - "block.create.controller_rail": "UNLOCALIZED: Controller Rail", - "block.create.copper_block": "UNLOCALIZED: Copper Block", - "block.create.copper_casing": "UNLOCALIZED: Copper Casing", - "block.create.copper_ore": "UNLOCALIZED: Copper Ore", - "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", - "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", - "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", - "block.create.creative_crate": "Bauplankanonenmacher", - "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", - "block.create.creative_motor": "UNLOCALIZED: Creative Motor", + "block.create.content_observer": "UNLOCALIZED: Inhalts Beobachter", + "block.create.controller_rail": "UNLOCALIZED: Steureungsschiene", + "block.create.copper_block": "UNLOCALIZED: Kupfer Block", + "block.create.copper_casing": "UNLOCALIZED: Kupferrahmen", + "block.create.copper_ore": "UNLOCALIZED: Kupfererz", + "block.create.copper_shingles": "UNLOCALIZED: Kupferschindeln", + "block.create.copper_tiles": "UNLOCALIZED: Kupferfliesen", + "block.create.copper_valve_handle": "UNLOCALIZED: Kupfer Ventilgriff", + "block.create.creative_crate": "Kreative anpassbare Kiste", + "block.create.creative_fluid_tank": "UNLOCALIZED: Kreativer Flüssigkeitstank", + "block.create.creative_motor": "UNLOCALIZED: Kreativer Motor", "block.create.crushing_wheel": "Mahlwerkrad", - "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", - "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", - "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", - "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", - "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", - "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", - "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", - "block.create.dark_scoria": "UNLOCALIZED: Dark Scoria", - "block.create.dark_scoria_bricks": "UNLOCALIZED: Dark Scoria Bricks", - "block.create.dark_scoria_bricks_slab": "UNLOCALIZED: Dark Scoria Bricks Slab", - "block.create.dark_scoria_bricks_stairs": "UNLOCALIZED: Dark Scoria Bricks Stairs", - "block.create.dark_scoria_bricks_wall": "UNLOCALIZED: Dark Scoria Bricks Wall", - "block.create.dark_scoria_cobblestone": "UNLOCALIZED: Dark Scoria Cobblestone", - "block.create.dark_scoria_cobblestone_slab": "UNLOCALIZED: Dark Scoria Cobblestone Slab", - "block.create.dark_scoria_cobblestone_stairs": "UNLOCALIZED: Dark Scoria Cobblestone Stairs", - "block.create.dark_scoria_cobblestone_wall": "UNLOCALIZED: Dark Scoria Cobblestone Wall", - "block.create.dark_scoria_pillar": "UNLOCALIZED: Dark Scoria Pillar", - "block.create.deployer": "UNLOCALIZED: Deployer", + "block.create.crushing_wheel_controller": "UNLOCALIZED: Mahlwerkrad Steurung", + "block.create.cuckoo_clock": "UNLOCALIZED: Kuckucksuhr", + "block.create.cyan_sail": "UNLOCALIZED: Türkises Segel", + "block.create.cyan_seat": "UNLOCALIZED: Türkiser Sitz", + "block.create.cyan_valve_handle": "UNLOCALIZED: Türkiser Ventilgriff", + "block.create.dark_oak_window": "UNLOCALIZED: Schwarzeichenholzfenster", + "block.create.dark_oak_window_pane": "UNLOCALIZED: Schwarzeichenholzfensterscheibe", + "block.create.dark_scoria": "UNLOCALIZED: Dunkle Schlacke", + "block.create.dark_scoria_bricks": "UNLOCALIZED: Dunkle Schlackenziegel", + "block.create.dark_scoria_bricks_slab": "UNLOCALIZED: Dunkle Schlackenziegelstufe", + "block.create.dark_scoria_bricks_stairs": "UNLOCALIZED: Dunkle Schlackenziegeltreppe", + "block.create.dark_scoria_bricks_wall": "UNLOCALIZED: Dunkle Schlackenziegelmauer", + "block.create.dark_scoria_cobblestone": "UNLOCALIZED: Dunkler Schlackebruchstein", + "block.create.dark_scoria_cobblestone_slab": "UNLOCALIZED: Dunkle Schlackebruchsteinstufe", + "block.create.dark_scoria_cobblestone_stairs": "UNLOCALIZED: Dunkle Schlackebruchsteintreppe", + "block.create.dark_scoria_cobblestone_wall": "UNLOCALIZED: Dunkle Schlackebruchsteinmauer", + "block.create.dark_scoria_pillar": "UNLOCALIZED: Dunkle Schlackesäule", + "block.create.deployer": "UNLOCALIZED: Einsatzgerät", "block.create.depot": "UNLOCALIZED: Depot", "block.create.diorite_bricks": "Dioritziegel", - "block.create.diorite_bricks_slab": "UNLOCALIZED: Diorite Bricks Slab", - "block.create.diorite_bricks_stairs": "UNLOCALIZED: Diorite Bricks Stairs", - "block.create.diorite_bricks_wall": "UNLOCALIZED: Diorite Bricks Wall", - "block.create.diorite_cobblestone": "UNLOCALIZED: Diorite Cobblestone", - "block.create.diorite_cobblestone_slab": "UNLOCALIZED: Diorite Cobblestone Slab", - "block.create.diorite_cobblestone_stairs": "UNLOCALIZED: Diorite Cobblestone Stairs", - "block.create.diorite_cobblestone_wall": "UNLOCALIZED: Diorite Cobblestone Wall", - "block.create.diorite_pillar": "UNLOCALIZED: Diorite Pillar", + "block.create.diorite_bricks_slab": "UNLOCALIZED: Dioritziegelstufe", + "block.create.diorite_bricks_stairs": "UNLOCALIZED: Dioritziegeltreppe", + "block.create.diorite_bricks_wall": "UNLOCALIZED: Dioritziegelmauer", + "block.create.diorite_cobblestone": "UNLOCALIZED: Dioritbruchstein", + "block.create.diorite_cobblestone_slab": "UNLOCALIZED: Dioritbruchsteinstufe", + "block.create.diorite_cobblestone_stairs": "UNLOCALIZED: Dioritbruchsteintreppe", + "block.create.diorite_cobblestone_wall": "UNLOCALIZED: Dioritbruchsteinmauer", + "block.create.diorite_pillar": "UNLOCALIZED: Dioritsäule", "block.create.dolomite": "Dolomit", "block.create.dolomite_bricks": "Dolomitziegel", "block.create.dolomite_bricks_slab": "Dolomitziegelstufe", "block.create.dolomite_bricks_stairs": "Dolomitziegeltreppe", "block.create.dolomite_bricks_wall": "Dolomitziegelmauer", - "block.create.dolomite_cobblestone": "UNLOCALIZED: Dolomite Cobblestone", - "block.create.dolomite_cobblestone_slab": "UNLOCALIZED: Dolomite Cobblestone Slab", - "block.create.dolomite_cobblestone_stairs": "UNLOCALIZED: Dolomite Cobblestone Stairs", - "block.create.dolomite_cobblestone_wall": "UNLOCALIZED: Dolomite Cobblestone Wall", + "block.create.dolomite_cobblestone": "UNLOCALIZED: Dolomitbruchstein", + "block.create.dolomite_cobblestone_slab": "UNLOCALIZED: Dolomitbruchsteinstufe", + "block.create.dolomite_cobblestone_stairs": "UNLOCALIZED: Dolomitbruchsteintreppe", + "block.create.dolomite_cobblestone_wall": "UNLOCALIZED: Dolomitbruchsteinmauer", "block.create.dolomite_pillar": "Dolomitsäule", - "block.create.encased_chain_drive": "UNLOCALIZED: Encased Chain Drive", - "block.create.encased_fan": "Eingeschlossener Propeller", - "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", - "block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks", - "block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab", - "block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs", - "block.create.fancy_andesite_bricks_wall": "UNLOCALIZED: Fancy Andesite Bricks Wall", - "block.create.fancy_dark_scoria_bricks": "UNLOCALIZED: Fancy Dark Scoria Bricks", - "block.create.fancy_dark_scoria_bricks_slab": "UNLOCALIZED: Fancy Dark Scoria Bricks Slab", - "block.create.fancy_dark_scoria_bricks_stairs": "UNLOCALIZED: Fancy Dark Scoria Bricks Stairs", - "block.create.fancy_dark_scoria_bricks_wall": "UNLOCALIZED: Fancy Dark Scoria Bricks Wall", + "block.create.encased_chain_drive": "UNLOCALIZED: Ummantelter Kettenriemen", + "block.create.encased_fan": "Ummantelter Lüfter", + "block.create.encased_fluid_pipe": "UNLOCALIZED: Ummanteltes Rohr", + "block.create.fancy_andesite_bricks": "UNLOCALIZED: Schicke Andesitziegel", + "block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Schicke Andesitziegelstufe", + "block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Schicke Andesitziegeltreppe", + "block.create.fancy_andesite_bricks_wall": "UNLOCALIZED: Schicke Andesitziegelmauer", + "block.create.fancy_dark_scoria_bricks": "UNLOCALIZED: Schicke dunkle Schlackenziegel", + "block.create.fancy_dark_scoria_bricks_slab": "UNLOCALIZED: Schicke dunkle Schlackenziegelstufe", + "block.create.fancy_dark_scoria_bricks_stairs": "UNLOCALIZED: Schicke dunkle Schlackenziegeltreppe", + "block.create.fancy_dark_scoria_bricks_wall": "UNLOCALIZED: Schicke dunkle Schlackenziegelmauer", "block.create.fancy_diorite_bricks": "UNLOCALIZED: Fancy Diorite Bricks", "block.create.fancy_diorite_bricks_slab": "UNLOCALIZED: Fancy Diorite Bricks Slab", "block.create.fancy_diorite_bricks_stairs": "UNLOCALIZED: Fancy Diorite Bricks Stairs", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Getriebe", "block.create.gearshift": "Gangschaltung", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Welle", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", "block.create.speedometer": "UNLOCALIZED: Speedometer", "block.create.spout": "UNLOCALIZED: Spout", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", - "fluid.create.chocolate": "UNLOCALIZED: Chocolate", - "fluid.create.honey": "UNLOCALIZED: Honey", "fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.tea": "UNLOCALIZED: Builder's Tea", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", @@ -1161,7 +1166,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "UNLOCALIZED: ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", @@ -1175,7 +1180,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "UNLOCALIZED: BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: _Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "UNLOCALIZED: When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "UNLOCALIZED: _Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "UNLOCALIZED: Filtering", @@ -1504,7 +1509,7 @@ "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does not need supports_.", "block.create.mechanical_mixer.tooltip": "UNLOCALIZED: MECHANICAL MIXER", - "block.create.mechanical_mixer.tooltip.summary": "UNLOCALIZED: A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", + "block.create.mechanical_mixer.tooltip.summary": "UNLOCALIZED: A kinetic whisk providing automated shapeless crafting recipes of multiple ingredients. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", "block.create.mechanical_mixer.tooltip.condition1": "UNLOCALIZED: When above Basin", "block.create.mechanical_mixer.tooltip.behaviour1": "UNLOCALIZED: Starts to mix items in the basin whenever all necessary ingredients are present. To prevent unwanted recipes, use the filter slot on the basin or cut the rotational force until all desired ingredients have been added.", 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 67345a2ab..96e48c700 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: 860", + "_": "Missing Localizations: 865", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Boîte à roue dentée", "block.create.gearshift": "Décaleur de rotation", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "Décaleur de rotation séquencé", "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Arbre mécanique", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", "block.create.speedometer": "Compteur de vitesse", "block.create.spout": "UNLOCALIZED: Spout", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "Minerai de zinc", "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", - "fluid.create.chocolate": "UNLOCALIZED: Chocolate", - "fluid.create.honey": "UNLOCALIZED: Honey", "fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.tea": "UNLOCALIZED: Builder's Tea", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", @@ -1161,7 +1166,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "UNLOCALIZED: ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", @@ -1175,7 +1180,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "UNLOCALIZED: BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: _Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "UNLOCALIZED: When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "UNLOCALIZED: _Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "UNLOCALIZED: Filtering", 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 f92be8e9f..5df2cb28b 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: 844", + "_": "Missing Localizations: 849", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Riduttore", "block.create.gearshift": "Cambio", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "Cambio Sequenziale", "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Albero", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", "block.create.speedometer": "Tachimetro", "block.create.spout": "UNLOCALIZED: Spout", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "Zinco Grezzo", "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", - "fluid.create.chocolate": "UNLOCALIZED: Chocolate", - "fluid.create.honey": "UNLOCALIZED: Honey", "fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.tea": "UNLOCALIZED: Builder's Tea", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", @@ -1161,7 +1166,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "UNLOCALIZED: ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", @@ -1175,7 +1180,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "UNLOCALIZED: BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: _Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "UNLOCALIZED: When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "UNLOCALIZED: _Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "UNLOCALIZED: Filtering", 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 ad0899eb4..10510018e 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: 843", + "_": "Missing Localizations: 848", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "ギアボックス", "block.create.gearshift": "ギアシフト", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "シーケンスギアシフト", "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "軸", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", "block.create.speedometer": "スピードメーター", "block.create.spout": "UNLOCALIZED: Spout", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "亜鉛鉱石", "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", - "fluid.create.chocolate": "UNLOCALIZED: Chocolate", - "fluid.create.honey": "UNLOCALIZED: Honey", "fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.tea": "UNLOCALIZED: Builder's Tea", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", @@ -1161,7 +1166,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "UNLOCALIZED: ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", @@ -1175,7 +1180,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "UNLOCALIZED: BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: _Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "UNLOCALIZED: When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "UNLOCALIZED: _Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "UNLOCALIZED: Filtering", 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 bdfc2bc12..f9779a768 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: 48", + "_": "Missing Localizations: 55", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단", "block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장", "block.create.gabbro_pillar": "반려암 기둥", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "기어박스", "block.create.gearshift": "기어쉬프트", "block.create.glass_fluid_pipe": "액체 파이프", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "순서 기어쉬프트", "block.create.shadow_steel_casing": "그림자 케이스", "block.create.shaft": "축", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "스마트 액체 파이프", "block.create.speedometer": "속도 계측기", "block.create.spout": "수도꼭지", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "아연 광석", "entity.create.contraption": "장치", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "좌석", "entity.create.stationary_contraption": "고정된 장치", "entity.create.super_glue": "강력 접착제", - "fluid.create.chocolate": "초콜릿", - "fluid.create.honey": "꿀", "fluid.create.milk": "우유", "fluid.create.potion": "포션", "fluid.create.tea": "건축가의 차", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "선풍기가 위에서 밈", "create.tooltip.chute.fans_pull_up": "선풍기가 위에서 당김", "create.tooltip.chute.fans_pull_down": "선풍기가 아래에서 당김", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "목표 없음", "create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않은 것 같습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 깔때기를 _우클릭_하여 목표로 지정하세요.", "create.hint.horizontal_funnel.title": "깔때기가 수평임", 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 83c50646e..cbd42c8a8 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: 1150", + "_": "Missing Localizations: 1155", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Versnellingsbak", "block.create.gearshift": "Versnellingspook", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Drijfas", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", "block.create.speedometer": "Snelheidsmeter", "block.create.spout": "UNLOCALIZED: Spout", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", - "fluid.create.chocolate": "UNLOCALIZED: Chocolate", - "fluid.create.honey": "UNLOCALIZED: Honey", "fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.tea": "UNLOCALIZED: Builder's Tea", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", @@ -1161,7 +1166,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "UNLOCALIZED: ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", @@ -1175,7 +1180,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "UNLOCALIZED: BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: _Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "UNLOCALIZED: When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "UNLOCALIZED: _Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "UNLOCALIZED: Filtering", 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 2afee1718..a967dbbe6 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: 1216", + "_": "Missing Localizations: 1221", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Caixa de Transmissão", "block.create.gearshift": "Câmbio", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Eixo", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", "block.create.speedometer": "UNLOCALIZED: Speedometer", "block.create.spout": "UNLOCALIZED: Spout", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", - "fluid.create.chocolate": "UNLOCALIZED: Chocolate", - "fluid.create.honey": "UNLOCALIZED: Honey", "fluid.create.milk": "UNLOCALIZED: Milk", "fluid.create.potion": "UNLOCALIZED: Potion", "fluid.create.tea": "UNLOCALIZED: Builder's Tea", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", @@ -1161,7 +1166,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "UNLOCALIZED: ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", @@ -1175,7 +1180,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "UNLOCALIZED: BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: _Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "UNLOCALIZED: When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "UNLOCALIZED: _Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "UNLOCALIZED: Filtering", @@ -1504,7 +1509,7 @@ "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does not need supports_.", "block.create.mechanical_mixer.tooltip": "UNLOCALIZED: MECHANICAL MIXER", - "block.create.mechanical_mixer.tooltip.summary": "UNLOCALIZED: A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", + "block.create.mechanical_mixer.tooltip.summary": "UNLOCALIZED: A kinetic whisk providing automated shapeless crafting recipes of multiple ingredients. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", "block.create.mechanical_mixer.tooltip.condition1": "UNLOCALIZED: When above Basin", "block.create.mechanical_mixer.tooltip.behaviour1": "UNLOCALIZED: Starts to mix items in the basin whenever all necessary ingredients are present. To prevent unwanted recipes, use the filter slot on the basin or cut the rotational force until all desired ingredients have been added.", 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 2de728f54..17e6ae242 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,16 +1,16 @@ { - "_": "Missing Localizations: 519", + "_": "Missing Localizations: 5", "_": "->------------------------] Game Elements [------------------------<-", "block.create.acacia_window": "Акациевое окно", "block.create.acacia_window_pane": "Панель из акациевого окна", - "block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", + "block.create.adjustable_chain_gearshift": "Регулируемый цепной механизм", "block.create.adjustable_crate": "Регулируемый ящик", "block.create.adjustable_pulse_repeater": "Регулируемый импульсный повторитель", "block.create.adjustable_repeater": "Регулируемый повторитель", "block.create.analog_lever": "Аналоговый рычаг", - "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", + "block.create.andesite_belt_funnel": "Андезитовая конвейерная воронка", "block.create.andesite_bricks": "Андезитовый кирпич", "block.create.andesite_bricks_slab": "Плита из андезитового кирпича", "block.create.andesite_bricks_stairs": "Ступени из андезитового кирпича", @@ -20,30 +20,30 @@ "block.create.andesite_cobblestone_slab": "Андезит-булыжниковая плита", "block.create.andesite_cobblestone_stairs": "Андезит-булыжниковые ступени", "block.create.andesite_cobblestone_wall": "Андезит-булыжниковая стена", - "block.create.andesite_encased_shaft": "UNLOCALIZED: Andesite Encased Shaft", - "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", + "block.create.andesite_encased_shaft": "Андезитовый вал в кожухе", + "block.create.andesite_funnel": "Андезитовая воронка", "block.create.andesite_pillar": "Андезитовая колонна", - "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", + "block.create.andesite_tunnel": "Андезитовый туннель", "block.create.basin": "Чаша", "block.create.belt": "Конвейер", "block.create.birch_window": "Берёзовое окно", "block.create.birch_window_pane": "Панель берёзового окна", - "block.create.black_sail": "UNLOCALIZED: Black Sail", - "block.create.black_seat": "UNLOCALIZED: Black Seat", - "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", - "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", - "block.create.blue_sail": "UNLOCALIZED: Blue Sail", - "block.create.blue_seat": "UNLOCALIZED: Blue Seat", - "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", - "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", + "block.create.black_sail": "Чёрный парус", + "block.create.black_seat": "Чёрное сиденье", + "block.create.black_valve_handle": "Чёрная ручка крана", + "block.create.blaze_burner": "Горелка Всполоха", + "block.create.blue_sail": "Синий парус", + "block.create.blue_seat": "Синее сиденье", + "block.create.blue_valve_handle": "Синяя ручка крана", + "block.create.brass_belt_funnel": "Латунная конвейерная воронка", "block.create.brass_block": "Латунный блок", "block.create.brass_casing": "Латунный корпус", - "block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft", - "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", - "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", - "block.create.brown_sail": "UNLOCALIZED: Brown Sail", - "block.create.brown_seat": "UNLOCALIZED: Brown Seat", - "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", + "block.create.brass_encased_shaft": "Латунный вал в кожухе", + "block.create.brass_funnel": "Латунная воронка", + "block.create.brass_tunnel": "Латунный туннель", + "block.create.brown_sail": "Коричневый парус", + "block.create.brown_seat": "Коричневое сиденье", + "block.create.brown_valve_handle": "Коричневая ручка крана", "block.create.cart_assembler": "Сборщик вагонеток", "block.create.chiseled_dark_scoria": "Резной тёмный пепел", "block.create.chiseled_dolomite": "Резной доломит", @@ -51,28 +51,28 @@ "block.create.chiseled_limestone": "Резной известняк", "block.create.chiseled_scoria": "Резной пепел", "block.create.chiseled_weathered_limestone": "Выветренный резной известняк", - "block.create.chocolate": "UNLOCALIZED: Chocolate", - "block.create.chute": "UNLOCALIZED: Chute", + "block.create.chocolate": "Шоколад", + "block.create.chute": "Желоб", "block.create.clockwork_bearing": "Часовой механизм", "block.create.clutch": "Сцепление", "block.create.cogwheel": "Шестерня", - "block.create.content_observer": "UNLOCALIZED: Content Observer", - "block.create.controller_rail": "UNLOCALIZED: Controller Rail", + "block.create.content_observer": "Наблюдетель за содержимым", + "block.create.controller_rail": "Контролирующая рельса", "block.create.copper_block": "Медный блок", "block.create.copper_casing": "Медный корпус", "block.create.copper_ore": "Медная руда", "block.create.copper_shingles": "Медная черепица", - "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", - "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", + "block.create.copper_tiles": "Медная плитка", + "block.create.copper_valve_handle": "Медная ручка крана", "block.create.creative_crate": "Творческий ящик", - "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", + "block.create.creative_fluid_tank": "Творческиф жидкостный бак", "block.create.creative_motor": "Творческий мотор", "block.create.crushing_wheel": "Колесо дробления", "block.create.crushing_wheel_controller": "Контроллер колеса дробления", "block.create.cuckoo_clock": "Часы с кукушкой", - "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", - "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", - "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", + "block.create.cyan_sail": "Бирюзовый парус", + "block.create.cyan_seat": "Бирюзовое сииденье", + "block.create.cyan_valve_handle": "Бирюзовая ручка крана", "block.create.dark_oak_window": "Окно из тёмного дуба", "block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб", "block.create.dark_scoria": "Тёмный пепел", @@ -86,7 +86,7 @@ "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепел-булыжника", "block.create.dark_scoria_pillar": "Колонна из тёмного пепел-булыжника", "block.create.deployer": "Автономный активатор", - "block.create.depot": "UNLOCALIZED: Depot", + "block.create.depot": "Депо", "block.create.diorite_bricks": "Диоритовый кирпич", "block.create.diorite_bricks_slab": "Плита из диоритового кирпича", "block.create.diorite_bricks_stairs": "Ступени из диоритового кирпича", @@ -106,9 +106,9 @@ "block.create.dolomite_cobblestone_stairs": "Ступени доломит-булыжника", "block.create.dolomite_cobblestone_wall": "Стена доломит-булыжника", "block.create.dolomite_pillar": "Доломитовая колонна", - "block.create.encased_chain_drive": "UNLOCALIZED: Encased Chain Drive", + "block.create.encased_chain_drive": "Цепной привод в кожухе", "block.create.encased_fan": "Вентилятор в кожухе", - "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", + "block.create.encased_fluid_pipe": "Жидкостная труба в кожухе", "block.create.fancy_andesite_bricks": "Красивый андезитовый кирпич", "block.create.fancy_andesite_bricks_slab": "Плита из красивого андезитового кирпича", "block.create.fancy_andesite_bricks_stairs": "Ступени из красивого андезитового кирпича", @@ -145,9 +145,9 @@ "block.create.fancy_weathered_limestone_bricks_slab": "Плита из красивого выветренного известнякового кирпича", "block.create.fancy_weathered_limestone_bricks_stairs": "Ступени из красивого выветренного известнякового кирпича", "block.create.fancy_weathered_limestone_bricks_wall": "Стена из красивого выветренного известнякового кирпича", - "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", - "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", - "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", + "block.create.fluid_pipe": "Жидкостная труба", + "block.create.fluid_tank": "Жидкостный бак", + "block.create.fluid_valve": "Жидкостный вентиль", "block.create.flywheel": "Маховик", "block.create.framed_glass": "Обрамлённое стекло", "block.create.framed_glass_pane": "Обрамлённая стеклянная панель", @@ -162,9 +162,11 @@ "block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника", "block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника", "block.create.gabbro_pillar": "Габбро колонна", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Коробка передач", "block.create.gearshift": "Реверсивный механизм", - "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", + "block.create.glass_fluid_pipe": "Стеклянная жидкостная труба", "block.create.granite_bricks": "Гранитный кирпич", "block.create.granite_bricks_slab": "Плита из гранитного кирпича", "block.create.granite_bricks_stairs": "Ступени из гранитного кирпича", @@ -174,18 +176,18 @@ "block.create.granite_cobblestone_stairs": "Ступени из гранит-булыжника", "block.create.granite_cobblestone_wall": "Стена из гранит-булыжника", "block.create.granite_pillar": "Гранитная колонна", - "block.create.gray_sail": "UNLOCALIZED: Gray Sail", - "block.create.gray_seat": "UNLOCALIZED: Gray Seat", - "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", - "block.create.green_sail": "UNLOCALIZED: Green Sail", - "block.create.green_seat": "UNLOCALIZED: Green Seat", - "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", + "block.create.gray_sail": "Серый парус", + "block.create.gray_seat": "Серое сиденье", + "block.create.gray_valve_handle": "Серная ручка крана", + "block.create.green_sail": "Зелёный парус", + "block.create.green_seat": "Зелёное сиденье", + "block.create.green_valve_handle": "Зелёная ручка крана", "block.create.hand_crank": "Рукоятка", - "block.create.honey": "UNLOCALIZED: Honey", + "block.create.honey": "Мёд", "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", - "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", - "block.create.item_drain": "UNLOCALIZED: Item Drain", + "block.create.hose_pulley": "Шкив для шланга", + "block.create.item_drain": "Предметный осушитель", "block.create.jungle_window": "Окно из тропического дерева", "block.create.jungle_window_pane": "Панель окна из тропического дерева", "block.create.large_cogwheel": "Большая шестерня", @@ -198,15 +200,15 @@ "block.create.layered_limestone": "Слоистый известняк", "block.create.layered_scoria": "Слоистый пепел", "block.create.layered_weathered_limestone": "Слоистый выветренный известняк", - "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", - "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", - "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", - "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", - "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", - "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", - "block.create.lime_sail": "UNLOCALIZED: Lime Sail", - "block.create.lime_seat": "UNLOCALIZED: Lime Seat", - "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", + "block.create.light_blue_sail": "Голубой парус", + "block.create.light_blue_seat": "Голубое сиденье", + "block.create.light_blue_valve_handle": "Голубая ручка крана", + "block.create.light_gray_sail": "Светло-серый парус", + "block.create.light_gray_seat": "Светло-серое сиденье", + "block.create.light_gray_valve_handle": "Светло-серая ручка крана", + "block.create.lime_sail": "Лаймовый парус", + "block.create.lime_seat": "Лаймовое сиденье", + "block.create.lime_valve_handle": "Лаймовая ручка крана", "block.create.limesand": "Известковый песок", "block.create.limestone": "Известняк", "block.create.limestone_bricks": "Известняковый кирпич", @@ -219,11 +221,11 @@ "block.create.limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.limestone_pillar": "Известковая колонна", "block.create.linear_chassis": "Линейное шасси", - "block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner", - "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", - "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", - "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", - "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.lit_blaze_burner": "Зажжёная горелка Всполоха", + "block.create.magenta_sail": "Пурпурный парус", + "block.create.magenta_seat": "Пурпурное сиденье", + "block.create.magenta_valve_handle": "Пурпурная ручка крана", + "block.create.mechanical_arm": "Механическая рука", "block.create.mechanical_bearing": "Механический вращатель", "block.create.mechanical_crafter": "Механический крафтер", "block.create.mechanical_drill": "Механическая дрель", @@ -233,9 +235,9 @@ "block.create.mechanical_piston_head": "Механическая головка поршня", "block.create.mechanical_plough": "Механический плуг", "block.create.mechanical_press": "Механический пресс", - "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", + "block.create.mechanical_pump": "Механическая помпа", "block.create.mechanical_saw": "Механическая пила", - "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", + "block.create.metal_bracket": "Металлический кронштейн", "block.create.millstone": "Жернов", "block.create.minecart_anchor": "Вагонеточный якорь", "block.create.mossy_andesite": "Замшелый андезит", @@ -253,9 +255,9 @@ "block.create.nozzle": "Форсунка", "block.create.oak_window": "Дубовое окно", "block.create.oak_window_pane": "Панель из дубового окна", - "block.create.orange_sail": "UNLOCALIZED: Orange Sail", - "block.create.orange_seat": "UNLOCALIZED: Orange Seat", - "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", + "block.create.orange_sail": "Оранжевый парус", + "block.create.orange_seat": "Оранжевое сиденье", + "block.create.orange_valve_handle": "Оранжевая ручка крана", "block.create.ornate_iron_window": "Украшенное железное окно", "block.create.ornate_iron_window_pane": "Панель из украшенного железного окна", "block.create.overgrown_andesite": "Заросший андезит", @@ -303,9 +305,9 @@ "block.create.paved_weathered_limestone_slab": "Плита из мощёного выветренного известняка", "block.create.paved_weathered_limestone_stairs": "Ступени из мощёного выветренного известняка", "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", - "block.create.pink_sail": "UNLOCALIZED: Pink Sail", - "block.create.pink_seat": "UNLOCALIZED: Pink Seat", - "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", + "block.create.pink_sail": "Розовый парус", + "block.create.pink_seat": "Розовое сиденье", + "block.create.pink_valve_handle": "Розовая ручка крана", "block.create.piston_extension_pole": "Удлинитель поршня", "block.create.polished_dark_scoria": "Полированный тёмный пепел", "block.create.polished_dark_scoria_slab": "Плита из полированного тёмного пепла", @@ -331,27 +333,27 @@ "block.create.polished_weathered_limestone_slab": "Плита из полированного выветренного известняка", "block.create.polished_weathered_limestone_stairs": "Ступени из полированного выветренного известняка", "block.create.polished_weathered_limestone_wall": "Стена из полированного выветренного известняка", - "block.create.portable_fluid_interface": "UNLOCALIZED: Portable Fluid Interface", + "block.create.portable_fluid_interface": "Портативный жидкостный интерфейс", "block.create.portable_storage_interface": "Портативный интерфейс хранения", "block.create.powered_latch": "Механизированная защёлка", "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", "block.create.pulley_magnet": "Шкивный магнит", "block.create.pulse_repeater": "Импульсный повторитель", - "block.create.purple_sail": "UNLOCALIZED: Purple Sail", - "block.create.purple_seat": "UNLOCALIZED: Purple Seat", - "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", + "block.create.purple_sail": "Фиолетовый парус", + "block.create.purple_seat": "Фиолетовое сиденье", + "block.create.purple_valve_handle": "Фиолетовая ручка крана", "block.create.radial_chassis": "Радиальное шасси", - "block.create.red_sail": "UNLOCALIZED: Red Sail", - "block.create.red_seat": "UNLOCALIZED: Red Seat", - "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", + "block.create.red_sail": "Красный парус", + "block.create.red_seat": "Красное сиденье", + "block.create.red_valve_handle": "Красная ручка крана", "block.create.redstone_contact": "Контакт сигнала красного камня", "block.create.redstone_link": "Беспроводной передатчик сигнала красного камня", - "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", + "block.create.refined_radiance_casing": "Сияющий корпус", "block.create.reinforced_rail": "Усиленные рельсы", "block.create.rope": "Канат", "block.create.rope_pulley": "Лебёдка", "block.create.rotation_speed_controller": "Регулятор скорости вращения", - "block.create.sail_frame": "UNLOCALIZED: Sail Frame", + "block.create.sail_frame": "Рама паруса", "block.create.schematic_table": "Схематичный стол", "block.create.schematicannon": "Схематичная пушка", "block.create.scoria": "Пепел", @@ -366,11 +368,12 @@ "block.create.scoria_pillar": "Колонна из пепла", "block.create.secondary_linear_chassis": "Вторичное линейное шасси", "block.create.sequenced_gearshift": "Последовательный переключатель передач", - "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", + "block.create.shadow_steel_casing": "Теневой кожух", "block.create.shaft": "Вал", - "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", + "block.create.smart_fluid_pipe": "Умная жидкостная труба", "block.create.speedometer": "Спидометр", - "block.create.spout": "UNLOCALIZED: Spout", + "block.create.spout": "Слив", "block.create.spruce_window": "Еловое окно", "block.create.spruce_window_pane": "Панель из елового окна", "block.create.sticky_mechanical_piston": "Липкий механический поршень", @@ -392,65 +395,64 @@ "block.create.weathered_limestone_cobblestone_stairs": "Ступени из известняк-булыжника", "block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", - "block.create.white_sail": "UNLOCALIZED: White Sail", - "block.create.white_seat": "UNLOCALIZED: White Seat", - "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", - "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", - "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", - "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", - "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", - "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", + "block.create.white_sail": "Белый парус", + "block.create.white_seat": "Белое сиденье", + "block.create.white_valve_handle": "Белая ручка крана", + "block.create.windmill_bearing": "Подшипник ветряной мельницы", + "block.create.wooden_bracket": "Деревянный кронштейн", + "block.create.yellow_sail": "Жёлтый парус", + "block.create.yellow_seat": "Жёлтое сиденье", + "block.create.yellow_valve_handle": "Жёлтая ручка крана", "block.create.zinc_block": "Цинковый блок", "block.create.zinc_ore": "Цинковая руда", "entity.create.contraption": "Штуковина", - "entity.create.seat": "UNLOCALIZED: Seat", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.seat": "сиденье", "entity.create.stationary_contraption": "Стационарная штуковина", - "entity.create.super_glue": "Супер клей", + "entity.create.super_glue": "Супер-клей", - "fluid.create.chocolate": "UNLOCALIZED: Chocolate", - "fluid.create.honey": "UNLOCALIZED: Honey", - "fluid.create.milk": "UNLOCALIZED: Milk", - "fluid.create.potion": "UNLOCALIZED: Potion", - "fluid.create.tea": "UNLOCALIZED: Builder's Tea", + "fluid.create.milk": "Молоко", + "fluid.create.potion": "Зелье", + "fluid.create.tea": "Чай Строителя", "item.create.andesite_alloy": "Андезитовый сплав", "item.create.attribute_filter": "Фильтр атрибутов", - "item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate", + "item.create.bar_of_chocolate": "Плитка шоколада", "item.create.belt_connector": "Механический ремень", - "item.create.blaze_cake": "UNLOCALIZED: Blaze Cake", - "item.create.blaze_cake_base": "UNLOCALIZED: Blaze Cake Base", + "item.create.blaze_cake": "Торт Всполоха", + "item.create.blaze_cake_base": "Основа торта Всполоха", "item.create.brass_hand": "Латунная рука", "item.create.brass_ingot": "Латунный слиток", "item.create.brass_nugget": "Кусочек латуни", "item.create.brass_sheet": "Латунный лист", - "item.create.builders_tea": "UNLOCALIZED: Builder's Tea", - "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", - "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", + "item.create.builders_tea": "Чай Строителя", + "item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина", + "item.create.chocolate_bucket": "Ведро шоколада", "item.create.chromatic_compound": "Хроматический компаунд", - "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", + "item.create.cinder_flour": "Пепельная мука", "item.create.copper_ingot": "Медный слиток", "item.create.copper_nugget": "Кусочек меди", "item.create.copper_sheet": "Медный лист", "item.create.crafter_slot_cover": "Крышка на слот крафтера", - "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", + "item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда", "item.create.crushed_brass": "Дробленая латунь", "item.create.crushed_copper_ore": "Измельчённая медная руда", "item.create.crushed_gold_ore": "Измельчённая золотая руда", "item.create.crushed_iron_ore": "Измельчённая железная руда", - "item.create.crushed_lead_ore": "UNLOCALIZED: Crushed Lead Ore", - "item.create.crushed_nickel_ore": "UNLOCALIZED: Crushed Nickel Ore", - "item.create.crushed_osmium_ore": "UNLOCALIZED: Crushed Osmium Ore", - "item.create.crushed_platinum_ore": "UNLOCALIZED: Crushed Platinum Ore", - "item.create.crushed_quicksilver_ore": "UNLOCALIZED: Crushed Quicksilver Ore", - "item.create.crushed_silver_ore": "UNLOCALIZED: Crushed Silver Ore", - "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", - "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", + "item.create.crushed_lead_ore": "Измельчённая свинцовая руда", + "item.create.crushed_nickel_ore": "Измельчённая никелевая руда", + "item.create.crushed_osmium_ore": "Измельчённая осмиевая руда", + "item.create.crushed_platinum_ore": "Измельчённая платиновая руда", + "item.create.crushed_quicksilver_ore": "Измельчённая ртутная руда", + "item.create.crushed_silver_ore": "Измельчённая серебрянная руда", + "item.create.crushed_tin_ore": "Измельчённая оловянная руда", + "item.create.crushed_uranium_ore": "Измельчённая урановая руда", "item.create.crushed_zinc_ore": "Измельчённая цинковая руда", "item.create.deforester": "Уничтожитель леса", "item.create.dough": "Тесто", "item.create.electron_tube": "Электронная лампа", - "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", + "item.create.empty_blaze_burner": "Пустая горелека Всполоха", "item.create.empty_schematic": "Пустая схематика", "item.create.extendo_grip": "Удлинённая рука", "item.create.filter": "Фильтр", @@ -459,12 +461,12 @@ "item.create.golden_sheet": "Золотой лист", "item.create.handheld_blockzapper": "Ручная блоковая пушка", "item.create.handheld_worldshaper": "Ручной редактор мира", - "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", + "item.create.honey_bucket": "Ведро мёда", "item.create.integrated_circuit": "Интегральная схема", "item.create.iron_sheet": "Железный лист", "item.create.lapis_sheet": "Лазуритовый лист", - "item.create.minecart_contraption": "Вагонетка штуковина", - "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", + "item.create.minecart_contraption": "Вагонеточная штуковина", + "item.create.minecart_coupling": "Связыватель вагонеток", "item.create.polished_rose_quartz": "Полированный розовый кварц", "item.create.powdered_obsidian": "Порошкообразный обсидиан", "item.create.propeller": "Пропеллер", @@ -475,7 +477,7 @@ "item.create.schematic": "Схематика", "item.create.schematic_and_quill": "Схематика и перо", "item.create.shadow_steel": "Призрачная сталь", - "item.create.super_glue": "Супер клей", + "item.create.super_glue": "Супер-клей", "item.create.tree_fertilizer": "Удобрение для деревьев", "item.create.vertical_gearbox": "Вертикальная коробка передач", "item.create.wand_of_symmetry": "Жезл симметрии", @@ -497,60 +499,60 @@ "advancement.create.shifting_gears": "Механизм переключения", "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к шестерне, что позволит изменить скорость вращения.", "advancement.create.overstressed": "Перегрузка", - "advancement.create.overstressed.desc": "Испытайте пределы стресса из первых рук.", - "advancement.create.belt": "Передай все это", + "advancement.create.overstressed.desc": "Испытайте предельную перегрузку из первых рук.", + "advancement.create.belt": "Передайте за проезд!", "advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.", - "advancement.create.tunnel": "UNLOCALIZED: Take cover!", - "advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.", - "advancement.create.splitter_tunnel": "UNLOCALIZED: Divide and Conquer", - "advancement.create.splitter_tunnel.desc": "UNLOCALIZED: Create a splitter with a group of Brass Tunnels.", - "advancement.create.chute": "UNLOCALIZED: Tumbling down", - "advancement.create.chute.desc": "UNLOCALIZED: Place a chute, the vertical counterpart of the belt.", - "advancement.create.upward_chute": "UNLOCALIZED: Aerial Abduction", - "advancement.create.upward_chute.desc": "UNLOCALIZED: Watch a thrown item fly up into a fan-powered chute.", - "advancement.create.belt_funnel": "UNLOCALIZED: Funnels' Flappy Danglers", - "advancement.create.belt_funnel.desc": "UNLOCALIZED: Place a sideways funnel on top of a belt or depot to create a special type.", - "advancement.create.belt_funnel_kiss": "UNLOCALIZED: The Parrots and the Flaps", - "advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two belt mounted funnels kiss.", - "advancement.create.fan": "UNLOCALIZED: Mechanical Airbender", - "advancement.create.fan.desc": "UNLOCALIZED: Ride the stream of air provided by an Encased Fan.", - "advancement.create.fan_lava": "UNLOCALIZED: Geothermal Space Heater", - "advancement.create.fan_lava.desc": "UNLOCALIZED: Get caught in a stream of air that smelts things.", - "advancement.create.fan_water": "UNLOCALIZED: Wacky Washing", - "advancement.create.fan_water.desc": "UNLOCALIZED: Get caught in a stream of air that washes things.", - "advancement.create.fan_smoke": "UNLOCALIZED: Mechanical Bellows", - "advancement.create.fan_smoke.desc": "UNLOCALIZED: Get caught in a stream of air that smokes items.", + "advancement.create.tunnel": "В укрытие!", + "advancement.create.tunnel.desc": "Украсьте свой механический ремень Туннелем.", + "advancement.create.splitter_tunnel": "Разделяй и властвуй", + "advancement.create.splitter_tunnel.desc": "Создайте разделитель из группы латунных туннелей..", + "advancement.create.chute": "Упало", + "advancement.create.chute.desc": "Разместите желоб, вертикальный аналог ремня.", + "advancement.create.upward_chute": "Воздушное похищение", + "advancement.create.upward_chute.desc": "Посмотрите как предмет засасывается в желоб с вентилятором.", + "advancement.create.belt_funnel": "Болтающиеся воронки", + "advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху ремня или депо, чтобы создать её специальный тип.", + "advancement.create.belt_funnel_kiss": "Механический ужин", + "advancement.create.belt_funnel_kiss.desc": "Заставте две смонтированные на ремнях воронки поцеловаться.", + "advancement.create.fan": "Механический маг воздуха", + "advancement.create.fan.desc": "Оседлайте поток воздуха от Венитлятора.", + "advancement.create.fan_lava": "Геотермальный пространственный нагреватель", + "advancement.create.fan_lava.desc": "Попадите в поток воздуха, плавящего вещи.", + "advancement.create.fan_water": "Сумасшедшая мойка", + "advancement.create.fan_water.desc": "Попадите в поток воздуха, моющего вещи.", + "advancement.create.fan_smoke": "Механические меха", + "advancement.create.fan_smoke.desc": "Попадите в поток воздуха, коптящего вещи.", "advancement.create.wrench": "Конфигурировать удобно", "advancement.create.wrench.desc": "Создайте гаечный ключ, чтобы помочь себе в создании изобретений.", "advancement.create.goggles": "Стресс-о-зрение", - "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации для компонентов.", - "advancement.create.speedometer": "Что действительно быстро?", + "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации о компонентах.", + "advancement.create.speedometer": "Так быстро?", "advancement.create.speedometer.desc": "Поставьте и подключите спидометр. Посмотрите на спидометр через очки, чтобы прочитать точное значение.", - "advancement.create.stressometer": "Что действительно сильно?", + "advancement.create.stressometer": "Так сильно?", "advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.", - "advancement.create.aesthetics": "UNLOCALIZED: Boom, Aesthetics!", - "advancement.create.aesthetics.desc": "UNLOCALIZED: Place brackets on a shaft, pipe and cogwheel.", - "advancement.create.reinforced": "UNLOCALIZED: Boom, Reinforced!", - "advancement.create.reinforced.desc": "UNLOCALIZED: Use fitting casing blocks on a shaft, pipe and mechanical belt.", + "advancement.create.aesthetics": "Бах! Эстетично!", + "advancement.create.aesthetics.desc": "Разместите кронштейн на валу, трубе или шестерне.", + "advancement.create.reinforced": "Бах! Усилено!", + "advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и механический ремень.", "advancement.create.water_wheel": "Гидравлика", "advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!", - "advancement.create.chocolate_wheel": "UNLOCALIZED: Tasteful power", - "advancement.create.chocolate_wheel.desc": "UNLOCALIZED: Run a Water Wheel with molten Chocolate.", + "advancement.create.chocolate_wheel": "Вкусная сила", + "advancement.create.chocolate_wheel.desc": "Зпустите водяное колесо с помощью раплавленного шоколада.", "advancement.create.lava_wheel": "Адское колесо", "advancement.create.lava_wheel.desc": "Это не должно было работать.", - "advancement.create.cuckoo": "UNLOCALIZED: Is it time?", - "advancement.create.cuckoo.desc": "UNLOCALIZED: Witness a cuckhoo clock announce bedtime.", + "advancement.create.cuckoo": "Уже?", + "advancement.create.cuckoo.desc": "Станьте свидетелем того, как часы с кукушкой объявляют время сна.", "advancement.create.millstone": "Карманная дробилка", "advancement.create.millstone.desc": "Поставьте и приведите в действие жернов", - "advancement.create.windmill": "UNLOCALIZED: A mild Breeze", - "advancement.create.windmill.desc": "UNLOCALIZED: Assemble a windmill.", - "advancement.create.maxed_windmill": "UNLOCALIZED: A strong breeze", - "advancement.create.maxed_windmill.desc": "UNLOCALIZED: Assemble a windmill of maximum strength.", + "advancement.create.windmill": "Ветерок", + "advancement.create.windmill.desc": "Соберите ветряную мельницу.", + "advancement.create.maxed_windmill": "Сильный ветер", + "advancement.create.maxed_windmill.desc": "Соберите ветряную мельницу максимальной силы.", "advancement.create.andesite_casing": "Андезитовый век", "advancement.create.andesite_casing.desc": "Используйте немного андезитового сплава и дерева для создания корпуса.", "advancement.create.mechanical_drill": "Стационарные выключатели", "advancement.create.mechanical_drill.desc": "Установите и приведите в действие механическую дрель", - "advancement.create.press": "Пресс делает «Бонк!'", + "advancement.create.press": "Пресс делает «Бонк!»", "advancement.create.press.desc": "Приведите механический пресс в действие и используйте его для создания пластин.", "advancement.create.polished_rose_quartz": "Розовый алмаз", "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет прозрачным.", @@ -560,10 +562,10 @@ "advancement.create.mechanical_saw.desc": "Поставьте и подключите механическую пилу", "advancement.create.basin": "Операция в чаше", "advancement.create.basin.desc": "Поставьте чашу и попытайтесь бросить в неё предметы.", - "advancement.create.mixer": "Смешай это", + "advancement.create.mixer": "Смешать, но не взбалтывать", "advancement.create.mixer.desc": "Поставьте механический смешиватель над чашей, подключите его и начните смешивать некоторые ингредиенты.", - "advancement.create.blaze_burner": "UNLOCALIZED: A living Fireplace", - "advancement.create.blaze_burner.desc": "UNLOCALIZED: Obtain a Blaze Burner.", + "advancement.create.blaze_burner": "Живая печка", + "advancement.create.blaze_burner.desc": "Получить Горелку Всполоха", "advancement.create.compact": "Автоматическое уплотнение", "advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.", "advancement.create.brass": "Действительный сплав", @@ -572,68 +574,68 @@ "advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.", "advancement.create.copper_casing": "Медный век", "advancement.create.copper_casing.desc": "Используйте несколько медных листов для создания медного корпуса.", - "advancement.create.spout": "UNLOCALIZED: Sploosh", - "advancement.create.spout.desc": "UNLOCALIZED: Watch a fluid item being filled using a spout.", - "advancement.create.spout_potion": "UNLOCALIZED: Global Brewery", - "advancement.create.spout_potion.desc": "UNLOCALIZED: Watch a spout fill a bottle with potion fluid.", - "advancement.create.chocolate": "UNLOCALIZED: A world of Imagination", - "advancement.create.chocolate.desc": "UNLOCALIZED: Obtain a bucket of Molten Chocolate.", - "advancement.create.item_drain": "UNLOCALIZED: Tumble Draining", - "advancement.create.item_drain.desc": "UNLOCALIZED: Watch a fluid item being emptied by an item drain.", - "advancement.create.chained_item_drain": "UNLOCALIZED: Let it roll!", - "advancement.create.chained_item_drain.desc": "UNLOCALIZED: Watch an item roll across several chained item drains.", - "advancement.create.glass_pipe": "UNLOCALIZED: Flow Spy", - "advancement.create.glass_pipe.desc": "UNLOCALIZED: Watch fluid propagate through a windowed fluid pipe. Straight fluid pipes become windowed when a wrench is used on them.", - "advancement.create.pipe_collision": "UNLOCALIZED: Never cross the Streams!", - "advancement.create.pipe_collision.desc": "UNLOCALIZED: Watch two fluids meet in your pipe network.", - "advancement.create.pipe_spill": "UNLOCALIZED: There's a leak!", - "advancement.create.pipe_spill.desc": "UNLOCALIZED: Watch an open end of a pipe take or place fluids into the world.", - "advancement.create.hose_pulley": "UNLOCALIZED: Industrial Spillage", - "advancement.create.hose_pulley.desc": "UNLOCALIZED: Lower a hose pulley and watch it drain or fill a body of fluid.", - "advancement.create.infinite_water": "UNLOCALIZED: Draining the Ocean", - "advancement.create.infinite_water.desc": "UNLOCALIZED: Pump from a body of Water large enough to be considered Infinite.", - "advancement.create.infinite_lava": "UNLOCALIZED: Draining the Planets' Core", - "advancement.create.infinite_lava.desc": "UNLOCALIZED: Pump from a body of Lava large enough to be considered Infinite.", - "advancement.create.infinite_chocolate": "UNLOCALIZED: Drowning in Imagination", - "advancement.create.infinite_chocolate.desc": "UNLOCALIZED: Pump from a body of Molten Chocolate large enough to be considered Infinite.", + "advancement.create.spout": "Буль", + "advancement.create.spout.desc": "Посмотрите как предмет наполняется с помощью Слива.", + "advancement.create.spout_potion": "Основательная пивоварня", + "advancement.create.spout_potion.desc": "Посмотрите как Слив наполняет бутылку зельем.", + "advancement.create.chocolate": "Сказочный мир", + "advancement.create.chocolate.desc": "Получите ведро расплавленного шоколада.", + "advancement.create.item_drain": "Осушение", + "advancement.create.item_drain.desc": "Посмотрите как жидкость выкачивается из предмета, в Предметном осушителе.", + "advancement.create.chained_item_drain": "Поехали!", + "advancement.create.chained_item_drain.desc": "Наблюдайте за тем как предмет едет через несколько соединённых предметных осушителей.", + "advancement.create.glass_pipe": "Поточный шпион", + "advancement.create.glass_pipe.desc": "Наблюдайте через окно в трубе за тем как распространяется жидкость. Окно появится на трубе при использовании гаечного ключа.", + "advancement.create.pipe_collision": "Никогда не скрещивайте потоки!", + "advancement.create.pipe_collision.desc": "Наблюдайте за тем как две жидкости встречаются в вашей сети труб.", + "advancement.create.pipe_spill": "Протечка!", + "advancement.create.pipe_spill.desc": "Посмотрите как открытый конец трубы забирает или размещает блоки жидкости в мире.", + "advancement.create.hose_pulley": "Промышленный полив", + "advancement.create.hose_pulley.desc": "Опустите шланг и смотрите как он высасывает или заполнят пространство жидкостью.", + "advancement.create.infinite_water": "Осушение океана", + "advancement.create.infinite_water.desc": "Выкачивайте воду из резервуара, считающегося бесконечным.", + "advancement.create.infinite_lava": "Уничтожение ядра", + "advancement.create.infinite_lava.desc": "Выкачивайте лаву из бассейна, считающегося бесконечным.", + "advancement.create.infinite_chocolate": "Утопая в воображении", + "advancement.create.infinite_chocolate.desc": "Выкачивайте раславленный шоколад из резервуара, считающегося бесконечным.", "advancement.create.crafter": "Автоматизированная сборка", "advancement.create.crafter.desc": "Поставьте и подключите механический крафтер", - "advancement.create.clockwork_bearing": "UNLOCALIZED: Contraption o'clock", - "advancement.create.clockwork_bearing.desc": "UNLOCALIZED: Assemble a Structure mounted on a Clockwork Bearing.", - "advancement.create.nixie_tube": "UNLOCALIZED: Signs of Style", - "advancement.create.nixie_tube.desc": "UNLOCALIZED: Obtain and place down a pair of Nixie Tubes.", + "advancement.create.clockwork_bearing": "Хитрые часы", + "advancement.create.clockwork_bearing.desc": "Соберите структуру, расположенную на часовом механизме.", + "advancement.create.nixie_tube": "Признаки стиля", + "advancement.create.nixie_tube.desc": "Получите и разместите пару Газоразрядных индикаторов.", "advancement.create.deployer": "Тыкайте, ставьте и атакуйте", "advancement.create.deployer.desc": "Приведите в действие автономный активатор, идеальное отражение себя.", - "advancement.create.speed_controller": "UNLOCALIZED: Engineers hate him!", - "advancement.create.speed_controller.desc": "UNLOCALIZED: Place a Rotation Speed Controller, the ultimate device for changing gear.", - "advancement.create.flywheel": "UNLOCALIZED: Heart of the Factory", - "advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.", - "advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress", - "advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.", - "advancement.create.integrated_circuit": "UNLOCALIZED: Complex Calculation", - "advancement.create.integrated_circuit.desc": "UNLOCALIZED: Assemble an Integrated Circuit.", - "advancement.create.mechanical_arm": "UNLOCALIZED: Busy Hands!", - "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", - "advancement.create.musical_arm": "UNLOCALIZED: Play Me My Theme Tune!", - "advancement.create.musical_arm.desc": "UNLOCALIZED: Watch a Mechanical Arm operate your Jukebox.", - "advancement.create.arm_many_targets": "UNLOCALIZED: Organize-o-Tron", - "advancement.create.arm_many_targets.desc": "UNLOCALIZED: Program a Mechanical Arm with ten or more output locations.", - "advancement.create.arm_blaze_burner": "UNLOCALIZED: Combust-o-Tron", - "advancement.create.arm_blaze_burner.desc": "UNLOCALIZED: Instruct a Mechanical Arm to feed your Blaze Burner.", + "advancement.create.speed_controller": "Его ненавидят инженеры!", + "advancement.create.speed_controller.desc": "Установите регулятор скорости вращения, идеальное устройство для переключения передач.", + "advancement.create.flywheel": "Сердце фабрики", + "advancement.create.flywheel.desc": "Успешно соедините двигатель с маховиком.", + "advancement.create.overstress_flywheel": "Перенапряжение", + "advancement.create.overstress_flywheel.desc": "Подайте слишком большую нагрузку на печной двигатель.", + "advancement.create.integrated_circuit": "Сложные вычисления", + "advancement.create.integrated_circuit.desc": "Создайте Интегральную схему.", + "advancement.create.mechanical_arm": "Золотые руки!", + "advancement.create.mechanical_arm.desc": "Создайте Механическую руку, выбирете входы и выходы, установите в мире и запитайте. Затем смотрите как она делает за вас всю работу.", + "advancement.create.musical_arm": "Сбацай что-нибудь!", + "advancement.create.musical_arm.desc": "Посмотрите как механическая рука меняет пластинки.", + "advancement.create.arm_many_targets": "Организатор", + "advancement.create.arm_many_targets.desc": "Запрограммируйте механическую руку на 10 и больше выходов.", + "advancement.create.arm_blaze_burner": "Поджигатель", + "advancement.create.arm_blaze_burner.desc": "Запрограммируйте механическую руку на кормление Горелки Всполоха.", "advancement.create.fist_bump": "Брось это, братан!", "advancement.create.fist_bump.desc": "Сделайте два удара кулаком.", "advancement.create.crushing_wheel": "Пара гигантов", "advancement.create.crushing_wheel.desc": "Создайте несколько дробящих колес, чтобы более эффективно разрушать больше материалов.", - "advancement.create.blaze_cake": "UNLOCALIZED: Sugar Rush", - "advancement.create.blaze_cake.desc": "UNLOCALIZED: Bake your blaze burner a special cake.", + "advancement.create.blaze_cake": "Сахарная лихорадка", + "advancement.create.blaze_cake.desc": "Испеките особый торт для вашей Горелки Всполоха.", "advancement.create.chromatic_compound": "Биполярные минералы", "advancement.create.chromatic_compound.desc": "Создайте хроматический компаунд", "advancement.create.shadow_steel": "Возвращение пустоты", "advancement.create.shadow_steel.desc": "Создайте призрачную сталь, металлический слиток небытия.", "advancement.create.refined_radiance": "Яркий и вдохновляющий", "advancement.create.refined_radiance.desc": "Создайте изысканное сияние, мощное хроматическое вещество.", - "advancement.create.chromatic_age": "UNLOCALIZED: The Chromatic Age", - "advancement.create.chromatic_age.desc": "UNLOCALIZED: Create casing blocks of the light and dark.", + "advancement.create.chromatic_age": "Хроматический век", + "advancement.create.chromatic_age.desc": "Создайте блоки корпуса из света и тьмы.", "advancement.create.zapper": "Строительство со стилем", "advancement.create.zapper.desc": "Создайте ручную блоковую пушку, которая поможет вам строить.", "advancement.create.upgraded_zapper": "Сияющий овердрайв", @@ -655,7 +657,7 @@ "itemGroup.create.base": "Create: Механизмы", "itemGroup.create.palettes": "Create: Декор", - "death.attack.create.crush": "%1$s был обработан колёсами дробления", + "death.attack.create.crush": "%1$s был передроблен", "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", @@ -667,31 +669,31 @@ "create.recipe.crushing": "Измельчение", "create.recipe.milling": "Помол", - "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", - "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", - "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", - "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", - "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", - "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.fan_washing": "Объёмная промывка", + "create.recipe.fan_washing.fan": "Вентилятор за текущей водой", + "create.recipe.fan_smoking": "Объёмное копчение", + "create.recipe.fan_smoking.fan": "Вентилятор за горящим огнём", + "create.recipe.fan_blasting": "Объёмное плавление", + "create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой", "create.recipe.pressing": "Прессование", "create.recipe.mixing": "Смешивание", - "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", - "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", + "create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка", + "create.recipe.automatic_brewing": "Автоматической смешивание", "create.recipe.packing": "Прессование", - "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", - "create.recipe.sawing": "UNLOCALIZED: Sawing", + "create.recipe.automatic_packing": "Автоматическая упаковка", + "create.recipe.sawing": "Распиливание", "create.recipe.mechanical_crafting": "Механическое создание", - "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", + "create.recipe.automatic_shaped": "Автоматическая форменная сборка", "create.recipe.block_cutting": "Резка блока", "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.mystery_conversion": "Хроматический метаморфоз", - "create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout", - "create.recipe.draining": "UNLOCALIZED: Item Draining", + "create.recipe.spout_filling": "Заполнение сливом", + "create.recipe.draining": "Осушение предметов", "create.recipe.processing.chance": "%1$s%% шанса", - "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", - "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", - "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", + "create.recipe.heat_requirement.none": "Не требует нагрева", + "create.recipe.heat_requirement.heated": "Нагрето", + "create.recipe.heat_requirement.superheated": "Перегрето", "create.generic.range": "Диапазон", "create.generic.radius": "Радиус", @@ -706,9 +708,9 @@ "create.generic.unit.rpm": "об./мин.", "create.generic.unit.stress": "Н*м", "create.generic.unit.degrees": "°", - "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", - "create.generic.clockwise": "UNLOCALIZED: Clockwise", - "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", + "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "По часовой стрелке", + "create.generic.counter_clockwise": "Против часовой стрелки", "create.action.scroll": "Прокрутка", "create.action.confirm": "Подтвердить", @@ -785,11 +787,11 @@ "create.blockzapper.leftClickToSet": "Щелкните ЛКМ по блоку, чтобы выбрать материал", "create.blockzapper.empty": "Вне блоков!", - "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", - "create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks", - "create.minecart_coupling.no_loops": "UNLOCALIZED: Couplings cannot form a loop", - "create.minecart_coupling.removed": "UNLOCALIZED: Removed all couplings from minecart", - "create.minecart_coupling.too_far": "UNLOCALIZED: Minecarts are too far apart", + "create.minecart_coupling.two_couplings_max": "Вагонетки могут иметь только две связи", + "create.minecart_coupling.unloaded": "Кажется, часть вашего поезда в незагруженных чанках", + "create.minecart_coupling.no_loops": "Связыватели не могут образовывать петлю", + "create.minecart_coupling.removed": "Убраны все связи между вагонетками", + "create.minecart_coupling.too_far": "Вагонетки слишком далеко друг от друга", "create.contraptions.movement_mode": "Режим движения", "create.contraptions.movement_mode.move_place": "Всегда ставить при остановке", @@ -802,25 +804,25 @@ "create.contraptions.cart_movement_mode.rotate": "Всегда лицом к движению", "create.contraptions.cart_movement_mode.rotate_paused": "Пауза во время вращения", "create.contraptions.cart_movement_mode.rotation_locked": "Блокировка вращения", - "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", - "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", - "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", + "create.contraptions.windmill.rotation_direction": "Направление вращения", + "create.contraptions.clockwork.clock_hands": "Стрелки часов", + "create.contraptions.clockwork.hour_first": "Сначала часовая стрелка", + "create.contraptions.clockwork.minute_first": "Сначала минутная стрелка", + "create.contraptions.clockwork.hour_first_24": "Сначала 24-часовая стрелка", "create.logistics.filter": "Фильтр", - "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", - "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", + "create.logistics.recipe_filter": "Фильтр рецепта", + "create.logistics.fluid_filter": "Фильтр жидкости", "create.logistics.firstFrequency": "Частота #1", "create.logistics.secondFrequency": "Частота #2", - "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.apply": "Фильтр применён к %1$s.", + "create.logistics.filter.apply_click_again": "Фильтр применён к %1$s, кликните еще раз чтобы скопировать количество.", + "create.logistics.filter.apply_count": "Применено извлекаемое количество к фильтру.", "create.gui.goggles.generator_stats": "Статистика генератора:", "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", "create.gui.goggles.at_current_speed": "На текущей скорости", - "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.goggles.pole_length": "Длина поршня", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", "create.gui.stressometer.title": "Сетевой момент", @@ -832,9 +834,9 @@ "create.gui.adjustable_crate.title": "Регулируемый ящик", "create.gui.adjustable_crate.storageSpace": "Ёмкость", "create.gui.stockpile_switch.title": "Настраиваемый компаратор", - "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", - "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", - "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", + "create.gui.stockpile_switch.invert_signal": "Инвертировать сигнал", + "create.gui.stockpile_switch.move_to_lower_at": "Двигаться к нижней линии при %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "Двигаться к верхней линии при %1$s%%", "create.gui.sequenced_gearshift.title": "Посл. переключ. передач", "create.gui.sequenced_gearshift.instruction": "Инструкция", "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", @@ -855,8 +857,8 @@ "create.schematicAndQuill.secondPos": "Вторая позиция установлена.", "create.schematicAndQuill.noTarget": "Удерживайте [Ctrl], чтобы выбрать воздушные блоки.", "create.schematicAndQuill.abort": "Выделение убрано", - "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.title": "Имя схематики:", + "create.schematicAndQuill.convert": "Сохранить и развернуть немедленно", "create.schematicAndQuill.fallbackName": "Моя схематика", "create.schematicAndQuill.saved": "Сохранено как %1$s", @@ -906,8 +908,8 @@ "create.schematics.uploadTooLarge": "Ваша схематика слишком велика.", "create.schematics.maxAllowedSize": "Максимально допустимый размер файла:", - "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", - "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.refresh": "Обновить файлы", + "create.gui.schematicTable.open_folder": "Открыть папку", "create.gui.schematicTable.title": "Схематичный стол", "create.gui.schematicTable.availableSchematics": "Доступные схемы", "create.gui.schematicTable.noSchematics": "Схемы не сохранены", @@ -920,16 +922,16 @@ "create.gui.schematicannon.shotsRemainingWithBackup": "С резервной копией: %1$s", "create.gui.schematicannon.optionEnabled": "В настоящее время включен", "create.gui.schematicannon.optionDisabled": "В настоящее время отключен", - "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", + "create.gui.schematicannon.showOptions": "Показать настройки печати", "create.gui.schematicannon.option.dontReplaceSolid": "Не заменять целые блоки", "create.gui.schematicannon.option.replaceWithSolid": "Заменять целые блоки целыми блоками", "create.gui.schematicannon.option.replaceWithAny": "Заменять целые блоки чем угодно", "create.gui.schematicannon.option.replaceWithEmpty": "Заменять целые блоки пустотой", "create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки", "create.gui.schematicannon.option.skipTileEntities": "Защитить имущество", - "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", - "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", - "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", + "create.gui.schematicannon.slot.gunpowder": "Добавьте порох чтобы запитать пушку", + "create.gui.schematicannon.slot.listPrinter": "Положите книгу чтобы создать список предметов для схематики", + "create.gui.schematicannon.slot.schematic": "Положите свою схематику здесь. Убедитесь что она размещена в правильном месте", "create.gui.schematicannon.option.skipMissing.description": "Если пушка не может найти требуемый блок, она будет строить в следующем месте.", "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения данных, такие как сундуки.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Пушка никогда не заменит целые блоки, только не целые и воздух.", @@ -955,8 +957,8 @@ "create.schematicannon.status.schematicNotPlaced": "Схема не загружена", "create.schematicannon.status.schematicExpired": "Срок действия файла схемы истек", - "create.materialChecklist": "UNLOCALIZED: Material Checklist", - "create.materialChecklist.blocksNotLoaded": "UNLOCALIZED: * Disclaimer *\n\nMaterial List may be inaccurate due to relevant chunks not being loaded.", + "create.materialChecklist": "Список материалов", + "create.materialChecklist.blocksNotLoaded": "* Дисклеймер *\n\nСписок материалов может быть неточным из-за незагруженных чанков.", "create.gui.filter.deny_list": "Чёрный список", "create.gui.filter.deny_list.description": "Предметы проходят, если они не соответствуют ни одному из вышеперечисленных. Пустой черный список принимает все.", @@ -968,66 +970,66 @@ "create.gui.filter.ignore_data.description": "Предметы совпадают независимо от их атрибутов.", "create.item_attributes.placeable": "можно разместить", - "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", + "create.item_attributes.placeable.inverted": "нельзя разместить", "create.item_attributes.consumable": "можно съесть", - "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", + "create.item_attributes.consumable.inverted": "нельзя съесть", "create.item_attributes.smeltable": "можно расплавить", - "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", + "create.item_attributes.smeltable.inverted": "нельзя расплавить", "create.item_attributes.washable": "можно промыть", - "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", - "create.item_attributes.smokable": "можно коптить", - "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", - "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", - "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", + "create.item_attributes.washable.inverted": "нельзя промыть", + "create.item_attributes.smokable": "можно прокоптить", + "create.item_attributes.smokable.inverted": "нельзя прокоптить", + "create.item_attributes.crushable": "можно измельчить", + "create.item_attributes.crushable.inverted": "нельзя разместить", "create.item_attributes.blastable": "плавится в доменной печи", - "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "не плавится в доменной печи", "create.item_attributes.enchanted": "зачарован", - "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", + "create.item_attributes.enchanted.inverted": "не зачарован", "create.item_attributes.damaged": "повреждён", - "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", + "create.item_attributes.damaged.inverted": "не повреждён", "create.item_attributes.badly_damaged": "сильно повреждён", - "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", + "create.item_attributes.badly_damaged.inverted": "не сильно повреждён", "create.item_attributes.not_stackable": "не может складываться", - "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", + "create.item_attributes.not_stackable.inverted": "складывается", "create.item_attributes.equipable": "может быть надет", - "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", - "create.item_attributes.furnace_fuel": "это топливо", - "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", + "create.item_attributes.equipable.inverted": "не ожет быть надет", + "create.item_attributes.furnace_fuel": "является топливом", + "create.item_attributes.furnace_fuel.inverted": "не является топливом", "create.item_attributes.in_tag": "помечен %1$s", - "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", + "create.item_attributes.in_tag.inverted": "не помечен %1$s", "create.item_attributes.in_item_group": "принадлежит %1$s", - "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", + "create.item_attributes.in_item_group.inverted": "не принадлежит '%1$s'", "create.item_attributes.added_by": "был добавлен %1$s", - "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", - "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", - "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", - "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", - "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", - "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", - "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", - "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", - "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", - "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", - "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", - "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", - "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", - "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", - "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", - "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", - "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", - "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", - "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", - "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", - "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", - "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", - "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", - "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", - "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", + "create.item_attributes.added_by.inverted": "не был добавлен %1$s", + "create.item_attributes.has_enchant": "зачарован на %1$s", + "create.item_attributes.has_enchant.inverted": "не зачарован на %1$s", + "create.item_attributes.has_fluid": "содержит %1$s", + "create.item_attributes.has_fluid.inverted": "не содержит %1$s", + "create.item_attributes.has_name": "имеет нестандартное имя %1$s", + "create.item_attributes.has_name.inverted": "не имеет нестандартное имя%1$s", + "create.item_attributes.book_author": "подписана %1$s", + "create.item_attributes.book_author.inverted": "неподписана %1$s", + "create.item_attributes.book_copy_original": "оригинал", + "create.item_attributes.book_copy_original.inverted": "не оригинал", + "create.item_attributes.book_copy_first": "копия первого порядка", + "create.item_attributes.book_copy_first.inverted": "не копия первого порядка", + "create.item_attributes.book_copy_second": "копия второго порядка", + "create.item_attributes.book_copy_second.inverted": "не копия второго порядка", + "create.item_attributes.book_copy_tattered": "полный беспорядок", + "create.item_attributes.book_copy_tattered.inverted": "не полный беспорядок", + "create.item_attributes.astralsorcery_crystal": "имеет характеристики кристалла %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "не имеет характеристики кристалла %1$s", + "create.item_attributes.astralsorcery_constellation": "настроено на %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "не настроено на %1$s", + "create.item_attributes.astralsorcery_perk_gem": "имеет характеристики перка %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "не имеет характеристики перка %1$s", + "create.item_attributes.astralsorcery_amulet": "исправляет %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "не исправляет %1$s", "create.gui.attribute_filter.no_selected_attributes": "Атрибуты не выбраны", "create.gui.attribute_filter.selected_attributes": "Выбранные атрибуты:", - "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", - "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", + "create.gui.attribute_filter.add_attribute": "Добавлены атрибуты", + "create.gui.attribute_filter.add_inverted_attribute": "Добавлены противоположные атрибуты в список", "create.gui.attribute_filter.allow_list_disjunctive": "Белый список (любой)", "create.gui.attribute_filter.allow_list_disjunctive.description": "Предметы проходят, если у них есть какой-либо из выбранных атрибутов.", "create.gui.attribute_filter.allow_list_conjunctive": "Белый список (все)", @@ -1044,12 +1046,12 @@ "create.tooltip.speedRequirement.none": "Нет", "create.tooltip.speedRequirement.medium": "Умеренная", "create.tooltip.speedRequirement.high": "Быстрая", - "create.tooltip.stressImpact": "Требование к моменту: %1$s", + "create.tooltip.stressImpact": "Требование к крутящему моменту: %1$s", "create.tooltip.stressImpact.low": "Низкий", "create.tooltip.stressImpact.medium": "Средний", "create.tooltip.stressImpact.high": "Высокий", "create.tooltip.stressImpact.overstressed": "Перегрузка", - "create.tooltip.capacityProvided": "Ёмкостный момент: %1$s", + "create.tooltip.capacityProvided": "Ёмкостный крутящий момент: %1$s", "create.tooltip.capacityProvided.low": "Маленький", "create.tooltip.capacityProvided.medium": "Средний", "create.tooltip.capacityProvided.high": "Большой", @@ -1057,58 +1059,61 @@ "create.tooltip.generationSpeed": "Создаёт %1$s %2$s", "create.tooltip.analogStrength": "Аналоговая сила: %1$s/15", - "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", - "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", - "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", - "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", + "create.mechanical_arm.extract_from": "Берёт предметы из %1$s", + "create.mechanical_arm.deposit_to": "Складывает предметы в %1$s", + "create.mechanical_arm.summary": "Механическая рука имеет %1$s вход(ов) и %2$s выход(ов).", + "create.mechanical_arm.points_outside_range": "%1$s выбранные точки взаимодействия удалены из-за ограничений диапазона.", - "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", + "create.logistics.when_multiple_outputs_available": "Когда доступно несколько выходов", - "create.mechanical_arm.selection_mode.round_robin": "UNLOCALIZED: Round Robin", - "create.mechanical_arm.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", - "create.mechanical_arm.selection_mode.prefer_first": "UNLOCALIZED: Prefer First Target", + "create.mechanical_arm.selection_mode.round_robin": "По кругу", + "create.mechanical_arm.selection_mode.forced_round_robin": "Принудительно по кругу", + "create.mechanical_arm.selection_mode.prefer_first": "Предпочтительна первичная цель", - "create.tunnel.selection_mode.split": "UNLOCALIZED: Split", - "create.tunnel.selection_mode.forced_split": "UNLOCALIZED: Forced Split", - "create.tunnel.selection_mode.round_robin": "UNLOCALIZED: Round Robin", - "create.tunnel.selection_mode.forced_round_robin": "UNLOCALIZED: Forced Round Robin", - "create.tunnel.selection_mode.prefer_nearest": "UNLOCALIZED: Prefer Nearest", - "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", - "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tunnel.selection_mode.split": "Разделить", + "create.tunnel.selection_mode.forced_split": "Принудительно разделить", + "create.tunnel.selection_mode.round_robin": "По кругу", + "create.tunnel.selection_mode.forced_round_robin": "Принудительно по кругу", + "create.tunnel.selection_mode.prefer_nearest": "Придпочтительно ближайшее", + "create.tunnel.selection_mode.randomize": "Случайно", + "create.tunnel.selection_mode.synchronize": "Синхронизировать входы", - "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", - "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", - "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", - "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", - "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", - "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", - "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", - "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.tooltip.chute.header": "Инвормация о желобе", + "create.tooltip.chute.items_move_down": "Предметы двигаются вниз", + "create.tooltip.chute.items_move_up": "Предметы двигаются вверх", + "create.tooltip.chute.no_fans_attached": "Нед подключеных вентиляторов", + "create.tooltip.chute.fans_push_up": "Вентилятор толкает снизу", + "create.tooltip.chute.fans_push_down": "Вентилятор толкает сверху", + "create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху", + "create.tooltip.chute.fans_pull_down": "Вентилятор тянет снизу", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", - "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", - "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", - "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", - "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", - "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", - "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", - "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", - "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.hint.hose_pulley.title": "Безграничное снабжение", + "create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.", + "create.hint.mechanical_arm_no_targets.title": "Нет целей", + "create.hint.mechanical_arm_no_targets": "Кажется, эта _Механическая рука_ не имеет никаких целей. Выберите _ремни_, _депо_, _воронки_, или другие блоки, с помощью _правого клика_, удерживая _Механическую руку_.", + "create.hint.horizontal_funnel.title": "Горизонтальные воронки", + "create.hint.horizontal_funnel": "Невозможно передавать предметы _напрямую_. Попробуйте запустить _механический ремень_ или _депо_ под вашей воронкой, чтобы извлекать предметы из присоеденённого инвентаря.", + "create.hint.upward_funnel.title": "Воронка направленна вверх", + "create.hint.upward_funnel": "Может перемещать только предметы, вставленные _рукой_, _желобами_ с вентиляторами, или брошенные на неё. Попробуйте использовать _желоба_, если вам нужно перемещать предметы по вертикали.", + "create.hint.empty_bearing.title": "Обновить подшипник", + "create.hint.empty_bearing": "_Правый клик_ по подшипнику _пустой рукой_, чтобы _присоединить_ к нему структуру, которую вы только что построили перед ним.", + "create.hint.full_deployer.title": "Переполнение автономного активатора", + "create.hint.full_deployer": "Похоже, этот _автономный активатор_ содержит _лишние_ _предметы_, которые необходимо _извлечь_. Используйте _воронку_ или _другие способы_, чтобы освободить его от переполнения.", - "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", - "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", - "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", - "create.gui.config.overlay4": "UNLOCALIZED: to move this preview", - "create.gui.config.overlay5": "UNLOCALIZED: Press ESC to exit this screen", - "create.gui.config.overlay6": "UNLOCALIZED: and save the new position", - "create.gui.config.overlay7": "UNLOCALIZED: Run /create overlay reset", - "create.gui.config.overlay8": "UNLOCALIZED: to reset to the default position", + "create.gui.config.overlay1": "Привет :)", + "create.gui.config.overlay2": "Это образец оверлея", + "create.gui.config.overlay3": "кликни и тащи с помощью мыши", + "create.gui.config.overlay4": "чтобы переместить его", + "create.gui.config.overlay5": "Нажми ESC чтобы выйти", + "create.gui.config.overlay6": "и сохранить новую позицию", + "create.gui.config.overlay7": "Запусти /create overlay reset", + "create.gui.config.overlay8": "чтобы сбросить позицию до стандартной", "create.command.killTPSCommand": "killtps", "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Тики сервера в настоящее время замедлены на %s мс :o", "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Тики сервера теперь замедлены на %s мс >:)", - "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Тики сервера вернулись к в норму :D", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Тики сервера вернулись в норму :D", "create.command.killTPSCommand.status.usage.0": "[Create]: используйте /killtps stop , чтобы вернуть тик сервера на обычную скорость", "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", "create.command.killTPSCommand.argument.tickTime": "Время тика", @@ -1122,7 +1127,7 @@ "create.subtitle.blockzapper_confirm": "Утвердительный динь", "create.subtitle.blockzapper_deny": "Тихий буп", "create.subtitle.block_funnel_eat": "Воронкообразный чмопс", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.blaze_munch": "Всполох радостно жуёт", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1136,160 +1141,160 @@ "item.create.example_item.tooltip.control1": "When Ctrl pressed", "item.create.example_item.tooltip.action1": "These controls are displayed.", - "block.create.andesite_encased_shaft.tooltip": "UNLOCALIZED: ANDESITE ENCASED SHAFT", - "block.create.andesite_encased_shaft.tooltip.summary": "UNLOCALIZED: _Creative only_ item. Encase shafts _in-world_ using _Andesite Casing_. Casing blocks will not be consumed.", + "block.create.andesite_encased_shaft.tooltip": "ANDESITE ENCASED SHAFT", + "block.create.andesite_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите кожух на вал, находящийся _в мире_ импользуя _Андезитовый корпус_. Блоки корпуса не будут использованы.", - "block.create.brass_encased_shaft.tooltip": "UNLOCALIZED: BRASS ENCASED SHAFT", - "block.create.brass_encased_shaft.tooltip.summary": "UNLOCALIZED: _Creative only_ item. Encase shafts _in-world_ using _Brass Casing_. Casing blocks will not be consumed.", + "block.create.brass_encased_shaft.tooltip": "BRASS ENCASED SHAFT", + "block.create.brass_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите кожух на вал, находящийся _в мире_ импользуя _Латунный корпус_. Блоки корпуса не будут использованы.", - "block.create.wooden_bracket.tooltip": "UNLOCALIZED: WOODEN BRACKET", - "block.create.wooden_bracket.tooltip.summary": "UNLOCALIZED: _Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with a cozy and wooden bit of reinforcement.", + "block.create.wooden_bracket.tooltip": "WOODEN BRACKET", + "block.create.wooden_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя уютное деревянное укрепление.", - "block.create.metal_bracket.tooltip": "UNLOCALIZED: METAL BRACKET", - "block.create.metal_bracket.tooltip.summary": "UNLOCALIZED: _Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with an industrial and sturdy bit of reinforcement.", + "block.create.metal_bracket.tooltip": "METAL BRACKET", + "block.create.metal_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя прочное индустриальное укрепление.", - "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", - "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._", + "block.create.andesite_casing.tooltip": "ANDESITE CASING", + "block.create.andesite_casing.tooltip.summary": "Простой корпус для механизмов с множеством применений. Безопасно для декора. Можно использовать для украшения _Валов_ и _механических ремней_.", - "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", - "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: A general item transfer component, transitioning items between means of transportation. Can be controlled with a _redstone signal_.", - "block.create.andesite_funnel.tooltip.condition1": "UNLOCALIZED: General Behaviour", - "block.create.andesite_funnel.tooltip.behaviour1": "UNLOCALIZED: The _open face_ will _collect ground items_ in the block space in front of it and _insert_ them into any container on the opposite side of the funnel.", - "block.create.andesite_funnel.tooltip.condition2": "UNLOCALIZED: When mounted on belts, depots and similar", - "block.create.andesite_funnel.tooltip.behaviour2": "UNLOCALIZED: _Collects_ or _Places_ items onto the mounted component, from or to the _inventory behind_ itself. Whenever the funnel has specific directionality, it can be reversed using a Wrench.", - "block.create.andesite_funnel.tooltip.condition3": "UNLOCALIZED: When vertically between two inventories", - "block.create.andesite_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", + "block.create.andesite_funnel.tooltip": "ANDESITE FUNNEL", + "block.create.andesite_funnel.tooltip.summary": "Стандартный компонент для транспортировки предметов. Может контролироваться _сигналом редстоуна_.", + "block.create.andesite_funnel.tooltip.condition1": "Стандартное поведение", + "block.create.andesite_funnel.tooltip.behaviour1": "_Открытая сторона_ будет собирать предметы с поверхности блока перед ней и _складывать_ их в контейнер на другой стороне воронки.", + "block.create.andesite_funnel.tooltip.condition2": "Если расположена на ремнях, депо и похожих штуках", + "block.create.andesite_funnel.tooltip.behaviour2": "_Собирает_ или _складывает_ предметы на связанный компонент, из или в _инвентарь за ней_. Если у воронки есть направление, его можно изменить с помощью _Гаечного ключа_.", + "block.create.andesite_funnel.tooltip.condition3": "Если расположена вертикально между двумя инвентарями", + "block.create.andesite_funnel.tooltip.behaviour3": "Будет _транспортировать_ предметы _вниз_, как воронка без буфера.", - "block.create.andesite_tunnel.tooltip": "UNLOCALIZED: ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "UNLOCALIZED: A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", - "block.create.andesite_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", - "block.create.andesite_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", + "block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL", + "block.create.andesite_tunnel.tooltip.summary": "Защитное покрытие для ваших _Механических ремней_! _Андезитовые туннели_ могут отделять один предмет от стака, когда еще один механический ремень или депо расположены рядом с соновным ремнём.", + "block.create.andesite_tunnel.tooltip.control1": "Правый клик Гаечным ключом по стороне", + "block.create.andesite_tunnel.tooltip.action1": "_Регулирует оконные ставни_, если на этой стороне туннеля есть окно.", - "block.create.brass_funnel.tooltip": "UNLOCALIZED: BRASS FUNNEL", - "block.create.brass_funnel.tooltip.summary": "UNLOCALIZED: A general item transfer component, transitioning items between means of transportation. Can be controlled with a _redstone signal_. Comes with a handy _filter_.", - "block.create.brass_funnel.tooltip.condition1": "UNLOCALIZED: General Behaviour", - "block.create.brass_funnel.tooltip.behaviour1": "UNLOCALIZED: The _open face_ will _collect ground items_ in the block space in front of it and _insert_ them into any container on the opposite side of the funnel.", - "block.create.brass_funnel.tooltip.condition2": "UNLOCALIZED: When mounted on belts, depots and similar", - "block.create.brass_funnel.tooltip.behaviour2": "UNLOCALIZED: _Collects_ or _Places_ items onto the mounted component, from or to the _inventory behind_ itself. Whenever the funnel has specific directionality, it can be reversed using a Wrench.", - "block.create.brass_funnel.tooltip.condition3": "UNLOCALIZED: When vertically between two inventories", - "block.create.brass_funnel.tooltip.behaviour3": "UNLOCALIZED: Will _transfer_ items _downward_, much like a buffer-less hopper.", + "block.create.brass_funnel.tooltip": "BRASS FUNNEL", + "block.create.brass_funnel.tooltip.summary": "Стандартный компонент для транспортировки предметов. Может контролироваться _сигналом редстоуна_. Поставляется в комплекте с _фильтром_.", + "block.create.brass_funnel.tooltip.condition1": "Стандарное поведение", + "block.create.brass_funnel.tooltip.behaviour1": "_Открытая сторона_ будет собирать предметы с поверхности блока перед ней и _складывать_ их в контейнер на другой стороне воронки.", + "block.create.brass_funnel.tooltip.condition2": "Если расположена на ремнях, депо и похожих штуках", + "block.create.brass_funnel.tooltip.behaviour2": "_Собирает_ или _складывает_ предметы на связанный компонент, из или в _инвентарь за ней_. Если у воронки есть направление, его можно изменить с помощью _Гаечного ключа_", + "block.create.brass_funnel.tooltip.condition3": "Если расположена вертикально между двумя инвентарями", + "block.create.brass_funnel.tooltip.behaviour3": "Будет _транспортировать_ предметы _вниз_, как воронка без буфера.", - "block.create.brass_tunnel.tooltip": "UNLOCALIZED: BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "UNLOCALIZED: _Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", - "block.create.brass_tunnel.tooltip.condition1": "UNLOCALIZED: When placed side by side", - "block.create.brass_tunnel.tooltip.behaviour1": "UNLOCALIZED: _Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", - "block.create.brass_tunnel.tooltip.condition2": "UNLOCALIZED: Filtering", - "block.create.brass_tunnel.tooltip.behaviour2": "UNLOCALIZED: _Brass Tunnels_ come with filters for both _Input_ and _Output_. If an _Item_ isn't permitted from the filtered output of a _Tunnel_ it will be transferred to the output of a connected _Tunnel_.", - "block.create.brass_tunnel.tooltip.condition3": "UNLOCALIZED: Splitting", - "block.create.brass_tunnel.tooltip.behaviour3": "UNLOCALIZED: _Brass Tunnels_ can be configured to change the method in which _Items_ are sorted onto connected _Belts_.", - "block.create.brass_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Side", - "block.create.brass_tunnel.tooltip.action1": "UNLOCALIZED: _Adjusts window shutters_ if the tunnel has a window on that face.", - "block.create.brass_tunnel.tooltip.control2": "UNLOCALIZED: Scroll with Wrench on Top", - "block.create.brass_tunnel.tooltip.action2": "UNLOCALIZED: Change the splitting method of connected _Tunnels_.", + "block.create.brass_tunnel.tooltip": "BRASS TUNNEL", + "block.create.brass_tunnel.tooltip.summary": "Красивое покрытие для ваших _Механических ремней_! _Латунные туннели_ так же поставляются с фильтрами и возможностью разделения стаков ваших предметов.", + "block.create.brass_tunnel.tooltip.condition1": "При размещении бок о бок", + "block.create.brass_tunnel.tooltip.behaviour1": "_Латунные туннели_ соединяются с другими, позволяя перенаправить поток предметов с одного _ремня_ на другой.", + "block.create.brass_tunnel.tooltip.condition2": "Фильтрация", + "block.create.brass_tunnel.tooltip.behaviour2": "_Латунные тунелли_ поставляюстя с фильтрами, для _входа_ и _выхода_. Если _предмет_ не соответствует _фильтру_, он будет перенаправлен на выход соседнего _туннеля_.", + "block.create.brass_tunnel.tooltip.condition3": "Разделение", + "block.create.brass_tunnel.tooltip.behaviour3": "_Латунный туннель_ может быть настроен для смены метода, по которому _предмет_ сортируется по присоеденённым _ремням_.", + "block.create.brass_tunnel.tooltip.control1": "Правый клик Гаечным ключом по стороне", + "block.create.brass_tunnel.tooltip.action1": "_Регулирует оконные ставни_, если на этой стороне туннеля есть окно.", + "block.create.brass_tunnel.tooltip.control2": "Прокрутка с гаечным ключом по верху", + "block.create.brass_tunnel.tooltip.action2": "Меняет метод разделения у присоеденённых _туннелей_.", - "block.create.copper_casing.tooltip": "UNLOCALIZED: COPPER CASING", - "block.create.copper_casing.tooltip.summary": "UNLOCALIZED: Robust machine casing with a variety of uses. Safe for decoration.", - "block.create.copper_casing.tooltip.condition1": "UNLOCALIZED: When used on Fluid Pipe", - "block.create.copper_casing.tooltip.behaviour1": "UNLOCALIZED: _Encases_ the _Fluid Pipe_ with the _Copper Casing_. Encased Fluid pipes will _lock their connections_ in place, no longer reacting to changes to neighbouring pipes.", + "block.create.copper_casing.tooltip": "COPPER CASING", + "block.create.copper_casing.tooltip.summary": "Прочный машинный корпус для разнообразного использования. Безопасно для украшения.", + "block.create.copper_casing.tooltip.condition1": "При использовании на жидкостной трубе", + "block.create.copper_casing.tooltip.behaviour1": "Покрывает _жидкостную трубу_ _кожухом_. Трубы в кожухе _закрепят свои соединения_ и не будут соединятся с другими трубами, расположенными по соседству.", - "block.create.encased_fluid_pipe.tooltip": "UNLOCALIZED: ENCASED FLUID PIPE", - "block.create.encased_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _Fluid Pipe_ encased with the _Copper Casing_.", + "block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE", + "block.create.encased_fluid_pipe.tooltip.summary": "_Труба_ в _Медном корпусе_.", - "block.create.copper_valve_handle.tooltip": "UNLOCALIZED: COPPER VALVE HANDLE", - "block.create.copper_valve_handle.tooltip.summary": "UNLOCALIZED: A precise _source_ of _Rotational Force_ that requires the interaction of players. Be careful not to wear yourself out!", - "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", - "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational Force_ to an attached contraption. _Sneak to reverse_ the rotation.", + "block.create.copper_valve_handle.tooltip": "COPPER VALVE HANDLE", + "block.create.copper_valve_handle.tooltip.summary": "Точный источник _вращательной силы_, требующий взаимодействия с игроками. Будьте осторожны, чтобы не утомиться!", + "block.create.copper_valve_handle.tooltip.condition1": "При использовании", + "block.create.copper_valve_handle.tooltip.behaviour1": "Обеспечивает _вращательную силу_ для соединённых устройств. _Присядьте_ чтобы изменить направление вращения.", - "block.create.seat.tooltip": "UNLOCALIZED: SEAT", - "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", - "block.create.seat.tooltip.condition1": "UNLOCALIZED: Right click on Seat", - "block.create.seat.tooltip.behaviour1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.seat.tooltip": "SEAT", + "block.create.seat.tooltip.summary": "Присядьте и насладитесь поездкой! Привязывает игроков к собранным _устройствам_. Отлично выглядит как простая мебель! Можно окрасить в разные цвета.", + "block.create.seat.tooltip.condition1": "ПКМ по сиденью", + "block.create.seat.tooltip.behaviour1": "Сажает игрока на _Сиденье_. Нажмите _кнопку_ _приседания_ чтобы слезть.", - "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", - "block.create.chute.tooltip.summary": "UNLOCALIZED: _Collect_ and transport items vertically or diagonally. Can both take and place items into _item containers_. You can also interact with chutes from the side using _hoppers_ or _mounted funnels_.", - "block.create.chute.tooltip.condition1": "UNLOCALIZED: When powered by a fan", - "block.create.chute.tooltip.behaviour1": "UNLOCALIZED: _Fan_ powered chutes can convey _Items_ upwards, and suck _items_ off of _Depots_ and _Belts_.", + "block.create.chute.tooltip": "CHUTE", + "block.create.chute.tooltip.summary": "_Собирает_ и транспортирует предметы по вертикали и диагонали. Может как брать так класть предметы в _контейнеры_. Вы так же можете взаиодействовать с желобом, разместив сбоку воронку.", + "block.create.chute.tooltip.condition1": "Если соединено с вентилятором", + "block.create.chute.tooltip.behaviour1": "Соеденённые с _вентилятором_ желоба могут двигать _предметы_ вверх, и засасывать их с _ремней_ и _депо_.", - "block.create.depot.tooltip": "UNLOCALIZED: DEPOT", - "block.create.depot.tooltip.summary": "UNLOCALIZED: A handy location to place your _Items_. Provides an interaction point for several machines", - "block.create.depot.tooltip.condition1": "UNLOCALIZED: Right Click on Depot", - "block.create.depot.tooltip.behaviour1": "UNLOCALIZED: Places or takes an _Item_ from the _Depot_. _Blocks_ and _Contraptions_ that would interact with a _Belt_ also work on a _Depot_.", + "block.create.depot.tooltip": "DEPOT", + "block.create.depot.tooltip.summary": "Полезное место куда вы можете класть свои _предметы_. Обеспечивает точку взаимодействия для некоторых машин", + "block.create.depot.tooltip.condition1": "При правом клике", + "block.create.depot.tooltip.behaviour1": "Размещает или забирает _предмет_ с _Депо_. _Блоки_ и _Устройства_, которые могут взаимодействовать с _ремнём_, так же работают с _Депо_.", - "item.create.blaze_cake.tooltip": "UNLOCALIZED: BLAZE CAKE", - "item.create.blaze_cake.tooltip.summary": "UNLOCALIZED: A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!", + "item.create.blaze_cake.tooltip": "BLAZE CAKE", + "item.create.blaze_cake.tooltip.summary": "Вкусное угощения для вашей трудяги _Горелки Всполоха_. Зажигает их всех!", - "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", - "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", - "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a Blaze or Blaze spawner", - "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + "item.create.empty_blaze_burner.tooltip": "EMPTY BLAZE BURNER", + "item.create.empty_blaze_burner.tooltip.summary": "Маленький железный дом для ваших огненных друзей. Уверен вы найдёте им хорошее применение.", + "item.create.empty_blaze_burner.tooltip.condition1": "При использовани на Всполохе или спавнере Всполохов", + "item.create.empty_blaze_burner.tooltip.behaviour1": "_Захватывает_ Всполоха в горелку", - "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", - "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical Pump_ to get the _fluid_ moving.", - "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", - "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", - "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", - "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + "block.create.fluid_pipe.tooltip": "FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "Используется для транспортировки _жидкостей_. Требует _Механическую помпу_ для движения _жидкости_.", + "block.create.fluid_pipe.tooltip.condition1": "Транспортировка жидкости", + "block.create.fluid_pipe.tooltip.behaviour1": "Может соединяться с _жидкостными контейнерами_, такими как _бак_ или _чаша_. Открытые части _трубы_ могут собирать или размещать блоки жидкости в мире. Опасайтесь протечек!", + "block.create.fluid_pipe.tooltip.control1": "Правый клик с ключом", + "block.create.fluid_pipe.tooltip.action1": "Размещает окно на трубе, если доступно.", - "block.create.hose_pulley.tooltip": "UNLOCALIZED: HOSE PULLEY", - "block.create.hose_pulley.tooltip.summary": "UNLOCALIZED: Used for _placing_ or _draining_ large _fluid bodies_ in the world.", - "block.create.hose_pulley.tooltip.condition1": "UNLOCALIZED: When Powered by Kinetics", - "block.create.hose_pulley.tooltip.behaviour1": "UNLOCALIZED: _Raises_ or _Lowers_ the hose, location of the hose determines up to which _height extraction_ or _filling_ will act.", - "block.create.hose_pulley.tooltip.condition2": "UNLOCALIZED: When Fluids pulled from Pulley", - "block.create.hose_pulley.tooltip.behaviour2": "UNLOCALIZED: Starts _taking fluid_ blocks from the body the hose end was lowered into. Very _large bodies_ of fluids will be _considered infinite_.", - "block.create.hose_pulley.tooltip.condition3": "UNLOCALIZED: When Fluids pushed to Pulley", - "block.create.hose_pulley.tooltip.behaviour3": "UNLOCALIZED: Starts _filling fluid_ into the world _up to_ the _hose_ ends' _height_.", + "block.create.hose_pulley.tooltip": "HOSE PULLEY", + "block.create.hose_pulley.tooltip.summary": "Используется для _размещения_ или _удаления_ больших _жидкостных резервуаров_ в мире.", + "block.create.hose_pulley.tooltip.condition1": "Когда управляется кинетически", + "block.create.hose_pulley.tooltip.behaviour1": "_Поднимает_ или _опускает_ шланг, расположение которого определяет максимальную высоту _сбора_ или _размещения_ жидкости.", + "block.create.hose_pulley.tooltip.condition2": "Когда жидкости вытягиваются из шланга", + "block.create.hose_pulley.tooltip.behaviour2": "Начинает _собирать_ блоки жидкости из резервуара, в который опущен шланг. Очень _большие резервуары_ жидкости будут считаться _бесконечными_.", + "block.create.hose_pulley.tooltip.condition3": "Когда жидкости закачиваются в шланг", + "block.create.hose_pulley.tooltip.behaviour3": "Начинает _заполнять_ жидкостью мир, до уровня расположения конца шланга.", - "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", - "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_. Scales in width and height.", - "block.create.fluid_tank.tooltip.condition1": "UNLOCALIZED: Right-clicked with Wrench", - "block.create.fluid_tank.tooltip.behaviour1": "UNLOCALIZED: Changes the optional window", + "block.create.fluid_tank.tooltip": "FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "_Хранит_ ваши любимые _жидкости_. Скалируется в высоту и ширину.", + "block.create.fluid_tank.tooltip.condition1": "Правый клик с гаечным ключом", + "block.create.fluid_tank.tooltip.behaviour1": "Переключает опциональное отображение окна", - "block.create.creative_fluid_tank.tooltip": "UNLOCALIZED: CREATIVE FLUID TANK", - "block.create.creative_fluid_tank.tooltip.summary": "UNLOCALIZED: This _Fluid Tank_ allows infinite replication of any Fluid. Scales in width and height.", - "block.create.creative_fluid_tank.tooltip.condition1": "UNLOCALIZED: When Fluid in Tank", - "block.create.creative_fluid_tank.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this tank will provide an _endless supply_ of the fluid specified. Fluids _inserted_ into this tank will be _voided._", - "block.create.creative_fluid_tank.tooltip.condition2": "UNLOCALIZED: Right-clicked with Wrench", - "block.create.creative_fluid_tank.tooltip.behaviour2": "UNLOCALIZED: Changes the optional window", + "block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK", + "block.create.creative_fluid_tank.tooltip.summary": "Этот _Жидкостный бак_ позволяет бесконечную репликацию любой жидкости. Скалируется в высоту и ширину.", + "block.create.creative_fluid_tank.tooltip.condition1": "Когда жидкость в баке", + "block.create.creative_fluid_tank.tooltip.behaviour1": "Всё что _извлекает_ из бака, будет снабжаться _бесконечным запасом_ жидкости. Жидкости _закачивающиеся_ в бак будут _удаляться_.", + "block.create.creative_fluid_tank.tooltip.condition2": "Правый клик с гаечным ключом", + "block.create.creative_fluid_tank.tooltip.behaviour2": "Переключает опциональное отображение окна.", - "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", - "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", - "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", - "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational force_ to re-open the valve.", + "block.create.fluid_valve.tooltip": "FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "Останавливает поток жидкости по трубе.", + "block.create.fluid_valve.tooltip.condition1": "Контролируемый поток", + "block.create.fluid_valve.tooltip.behaviour1": "Приложенная _Вращательная сила_ заставит _клапан_ закрыться, останавливая поток _жидкости_. Измените направление _вращательной силы_, чтобы снова открыть клапан.", - "block.create.mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", - "block.create.mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational force_ and uses it to move _fluid_ along a _pipe_. Has a maximum range of effect in both directions. (16 blocks by default)", - "block.create.mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", - "block.create.mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational force_ to switch the direction that the _fluid_ flows.", - "block.create.mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", - "block.create.mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + "block.create.mechanical_pump.tooltip": "MECHANICAL PUMP", + "block.create.mechanical_pump.tooltip.summary": "Принимает _Вращательную силу_ и использует ее для перемещения _жидкости_ вдоль _труб_. Имеет максимальный диапазон действия в обоих направлениях. (По умолчанию 16 блоков)", + "block.create.mechanical_pump.tooltip.condition1": "Поток жидкости", + "block.create.mechanical_pump.tooltip.behaviour1": "Приложенная _вращательная сила_ создает давление, которое заставляет _жидкость_ проходить через сеть _труб_. Измените направление _вращательной силы_, чтобы изменить направление потока _жидкости_.", + "block.create.mechanical_pump.tooltip.control1": "Правый клик с гаечным ключом", + "block.create.mechanical_pump.tooltip.action1": "Изменяет направление _помпы_, меняя направление потока жидкости", - "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", - "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid pipe_ with a filter. Can specify which _fluids_ pass through.", - "block.create.smart_fluid_pipe.tooltip.condition1": "UNLOCALIZED: When Fluids are pushed into it", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Smart pipes receiving fluid that does not match its filter will block the flow.", - "block.create.smart_fluid_pipe.tooltip.condition2": "UNLOCALIZED: When adjacent to fluid container", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "UNLOCALIZED: Smart pipes _starting_ a _flow_ from any container will only extract fluids that _match_ its _filter._", + "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "_Жидкостная труба_ с фильтром. Можно настроить какие _жидкости_ могу пройти.", + "block.create.smart_fluid_pipe.tooltip.condition1": "При закачивании жидкостей внутрь", + "block.create.smart_fluid_pipe.tooltip.behaviour1": "Умные трубы заблокируют поток жидкости, если она не соответствует фильтру.", + "block.create.smart_fluid_pipe.tooltip.condition2": "Когда подключена к жидкостному контейнеру", + "block.create.smart_fluid_pipe.tooltip.behaviour2": "Умные трубы _будут_ создавать _поток_ только той жидкости, что _соответствует_ _фильтру_.", - "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", - "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid items._", - "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", - "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid container item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", - "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", - "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid container item_ that passes beneath it.", + "block.create.spout.tooltip": "SPOUT", + "block.create.spout.tooltip.summary": "Форсунка для пополнения предметов, имеющих возможность хранить жидкость.", + "block.create.spout.tooltip.condition1": "Транспортировка жидкости", + "block.create.spout.tooltip.behaviour1": "Когда предмет, _с возможностью содержать жидкость_, такой как _ведро_ или _бутылочка_, размещён под сливом, слив будет пытаться заполнить предмет содержащейся в нём _жидкостью_.", + "block.create.spout.tooltip.condition2": "Автоматизация жидкости", + "block.create.spout.tooltip.behaviour2": "Слив расположеный над _ремнём_ или _депо_ будет автоматически взаимодействовать с _предметами, которые могут содержать жидкость_, которые проходят под ним.", - "block.create.item_drain.tooltip": "UNLOCALIZED: ITEM DRAIN", - "block.create.item_drain.tooltip.summary": "UNLOCALIZED: A grated depot for emptying your _fluid items._", - "block.create.item_drain.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", - "block.create.item_drain.tooltip.behaviour1": "UNLOCALIZED: When a _fluid container item_ such as a _bucket_ or _bottle_ is inserted from the side, the drain will attempt to empty it into its own _fluid container_. The item will then be ejected on the opposite side.", + "block.create.item_drain.tooltip": "ITEM DRAIN", + "block.create.item_drain.tooltip.summary": "Депо с решёткой, которое может выкачивать _жидкость_ из ваших _предметов_", + "block.create.item_drain.tooltip.condition1": "Транспортировка жидкости", + "block.create.item_drain.tooltip.behaviour1": "Когда _предмет с жидкостью_, такой как _ведро_ или _бутылочка_ вставлены с боку, предметный осушитель будет автоматически извлекать жидкость, в свой собственный _бак_. Предмет будет выброшен с противоположной стороны.", - "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", - "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", - "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", - "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical Crafters_.", - "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", - "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible item inventory_ to set it as a _source_ for the _Mechanical Arm_. Right-click twice to set it as the _destination_.", - "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", - "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical Arm_.", + "block.create.mechanical_arm.tooltip": "MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "Продвинутуе устройство для перемещения _предметов_.", + "block.create.mechanical_arm.tooltip.condition1": "Транспортировка предметов", + "block.create.mechanical_arm.tooltip.behaviour1": "Может брать или размещать предметы в любой открытый инвентарь, такой как _ремень_, _депо_, _воронка_ и _механический крафтер_.", + "block.create.mechanical_arm.tooltip.control1": "Когда в руке", + "block.create.mechanical_arm.tooltip.action1": "Правый клик на _открытом инвентаре_ установит _точку для сбора_, для _механической руки_. Кликните еще раз чтобы установить _точку для размещения_.", + "block.create.mechanical_arm.tooltip.control2": "Прокрутка с ключом", + "block.create.mechanical_arm.tooltip.action2": "Установит порядок размещения для _предметов_, премещаемых _механической рукой_.", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "Идеально отражает размещаемые блоки по настроенным плоскостям.", @@ -1405,15 +1410,15 @@ "block.create.clutch.tooltip.condition1": "Когда приведён в действие", "block.create.clutch.tooltip.behaviour1": "_Прекращает_ передачу вращения на другую сторону.", - "block.create.encased_chain_drive.tooltip": "UNLOCALIZED: ENCASED_CHAIN_DRIVE", - "block.create.encased_chain_drive.tooltip.summary": "UNLOCALIZED: _Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. Chain drives connect in a group when placed next to another on any face without a shaft. Their orientation does not have to match.", - "block.create.encased_chain_drive.tooltip.condition1": "UNLOCALIZED: When Connected", - "block.create.encased_chain_drive.tooltip.behaviour1": "UNLOCALIZED: Attached Blocks will relay _rotation speed_ and direction of this component.", + "block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE", + "block.create.encased_chain_drive.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в кожухе_. Цепные приводы соединяются, когда расположены рядом друг с другом, без необходимости использовать вал. Их направление не обязательно должно совпадать.", + "block.create.encased_chain_drive.tooltip.condition1": "Когда соединено", + "block.create.encased_chain_drive.tooltip.behaviour1": "Соединённые блоки будут получать _скорость вращения_ и его _направление_ от этого компонента.", - "block.create.adjustable_chain_gearshift.tooltip": "UNLOCALIZED: ADJUSTABLE CHAIN GEARSHIFT", - "block.create.adjustable_chain_gearshift.tooltip.summary": "UNLOCALIZED: _Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. _Analog redstone_ provided to this block will control which size of drive wheel is engaged with attached chain drives.", - "block.create.adjustable_chain_gearshift.tooltip.condition1": "UNLOCALIZED: Redstone Control", - "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Without_ a signal, adjacent chain drives will relay the _same speed._ With a _full strength_ signal, adjacent chain drives will relay exactly _twice its speed._ Anything inbetween will give results between 1-2x its speed.", + "block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT", + "block.create.adjustable_chain_gearshift.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в кожухе_. Полученный _сигнал редстоуна_ будет контролировать, какой размер шестерни взаимодействует с присоединенными цепными приводами.", + "block.create.adjustable_chain_gearshift.tooltip.condition1": "Кнонтроль редстоуном", + "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Без_ сигнала редстоуна присоединённые приводы будут иметь _такую же_ скорость. При получении _сигнала редстоуна_ максимального уровня, соединённые приводы будут вращаться с ровно в два раза меньшей скоростью. Всё, что между этими значениями, будет выдавать скорость от 1 до 2 кратной скорости цепного механизма.", "item.create.belt_connector.tooltip": "BELT CONNECTOR", "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._", @@ -1490,15 +1495,15 @@ "block.create.basin.tooltip": "BASIN", "block.create.basin.tooltip.summary": "Удобный _контейнер_ _для_ _предметов_, используемый при обработке _механическим_ _смешивателем_ и _механическим прессом_. Поддерживает компараторы.", - "block.create.basin.tooltip.condition1": "UNLOCALIZED: Auto-Output", - "block.create.basin.tooltip.behaviour1": "UNLOCALIZED: When _open inventories_ such as belts, other basins, depots, item drains and others are _below one side_ of a basin, they will automatically receive any _item/fluid outputs_ created in the basin. This is useful for automation.", + "block.create.basin.tooltip.condition1": "Авто-выход", + "block.create.basin.tooltip.behaviour1": "Когда _открытые инвентари_, такие как ремни, другие чаши, депо и т.д. находятся _под_ чашей, они будут автоматически принимать любые _жидкости_ и _предметы_, созданные в чаше. Это полезно для автоматизации.", - "block.create.blaze_burner.tooltip": "UNLOCALIZED: BLAZE BURNER", - "block.create.blaze_burner.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_burner.tooltip.condition1": "UNLOCALIZED: When placed below a basin", - "block.create.blaze_burner.tooltip.behaviour1": "UNLOCALIZED: Provides _heat_ to basin recipes.", - "block.create.blaze_burner.tooltip.condition2": "UNLOCALIZED: When fuel is used on the blaze heater", - "block.create.blaze_burner.tooltip.behaviour2": "UNLOCALIZED: Increases the remaining burn time by the furnace burn time of the used item. Consumes the item. Use _Blaze Cake_ for high temperatures.", + "block.create.blaze_burner.tooltip": "BLAZE BURNER", + "block.create.blaze_burner.tooltip.summary": "Блок для нагревания чаши, работающий когда в нём находится прирученый Всполох.", + "block.create.blaze_burner.tooltip.condition1": "Когда расположен под чашей", + "block.create.blaze_burner.tooltip.behaviour1": "Производит _тепло_ для рецептов чаши.", + "block.create.blaze_burner.tooltip.condition2": "Когда топливо используется на Горелке Всполоха", + "block.create.blaze_burner.tooltip.behaviour2": "Увеличивает оставшееся время горения, до времени сжигания этого топлива в печке. Поглощает предмет. Используйте _Торт Всполоха_ для больших температур.", "block.create.reinforced_rail.tooltip": "REINFORCED RAIL", "block.create.reinforced_rail.tooltip.summary": "Рельсы, которые не нуждаются в поддержке.", @@ -1530,18 +1535,18 @@ "block.create.flywheel.tooltip.behaviour1": "Обеспечивает вращательную силу для подключенного устройства в зависимости от силы и скорости генератора.", "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", - "block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов в и из _конструкции_, перемещаемой поршнем, шасси, вагонеткой или конвейром.", + "block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов внутрь или из _конструкции_, перемещаемой _поршнем_, _шасси_, _вагонеткой_ или _ремнём_.", "block.create.portable_storage_interface.tooltip.condition1": "Во время движения", "block.create.portable_storage_interface.tooltip.behaviour1": "Взаимодействует со стационарными переместителями так, что переместители, обращенные в сторону от интерфейса, вытягивают предметы, а транспортеры, нацеленные на интерфейс, вставляют предметы из прикреплённого инвентаря. Конструкция ненадолго остановится при обмене предметов.", - "block.create.portable_storage_interface.tooltip.condition2": "UNLOCALIZED: When Powered by Redstone", - "block.create.portable_storage_interface.tooltip.behaviour2": "UNLOCALIZED: _Disengages_ any active connection immediately.", + "block.create.portable_storage_interface.tooltip.condition2": "Когда запитан редстоуном", + "block.create.portable_storage_interface.tooltip.behaviour2": "Немедленно _разрывает_ все соединения.", - "block.create.portable_fluid_interface.tooltip": "UNLOCALIZED: PORTABLE FLUID INTERFACE", - "block.create.portable_fluid_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving fluids_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley. Two meeting interfaces have to _face each other_ and be spaced _1-2 blocks apart_.", - "block.create.portable_fluid_interface.tooltip.condition1": "UNLOCALIZED: While Moving", - "block.create.portable_fluid_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _portable storage interfaces_ to transfer fluids to or from the contraption. Pipes inserting into or extracting from the _Stationary Interface_ will interact with the tanks on the contraption _directly._ The structure will briefly stall as Fluids are exchanged.", - "block.create.portable_fluid_interface.tooltip.condition2": "UNLOCALIZED: When Powered by Redstone", - "block.create.portable_fluid_interface.tooltip.behaviour2": "UNLOCALIZED: _Disengages_ any active connection immediately.", + "block.create.portable_fluid_interface.tooltip": "PORTABLE FLUID INTERFACE", + "block.create.portable_fluid_interface.tooltip.summary": "Переносная точка обмена для _перемещения жидкостей_ из или в конструкцию, перемещаемую _поршнем_, _подшипником_, _вагонеткой_ или _лебёдкой_. Два смежных интерфейса должны располагаться _лицом друг_ _к другу_, на расстоянии _1-2 блока друг от друга_.", + "block.create.portable_fluid_interface.tooltip.condition1": "При движении", + "block.create.portable_fluid_interface.tooltip.behaviour1": "Взаимодействует со стационарными _переносными интерфейсами хранения_ для передачи жидкостей в устройство или из него. Трубы, вставленые в _Стационарный интерфейс_, будут напрямую взаимодействовать с резервуарами на устройстве. Конструкция на короткое время остановится для обмена жидкостями.", + "block.create.portable_fluid_interface.tooltip.condition2": "При получении сигнала редстоуна", + "block.create.portable_fluid_interface.tooltip.behaviour2": "Немедленно _разрывает_ текущие соединения.", "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", "block.create.rotation_speed_controller.tooltip.summary": "_Настраиваемое_ _реле_, способное _ускорять_ или _замедлять_ скорость до любой желаемой.", @@ -1563,18 +1568,18 @@ "block.create.mechanical_bearing.tooltip.condition1": "При вращении", "block.create.mechanical_bearing.tooltip.behaviour1": "Начинает вращение прикреплённых блоков. Используйте блоки шасси или слизи, чтобы перемещать более одного блока.", - "block.create.windmill_bearing.tooltip": "UNLOCALIZED: WINDMILL BEARING", - "block.create.windmill_bearing.tooltip.summary": "UNLOCALIZED: Used for harnessing _Rotational Force_ from wind. Attach your own design and watch it spin!", - "block.create.windmill_bearing.tooltip.condition1": "UNLOCALIZED: When Right-clicked", - "block.create.windmill_bearing.tooltip.behaviour1": "UNLOCALIZED: Starts providing _Rotational Force_ generated from the rotation of its attached structure. The Structure has to include suitable _Sail Blocks_ or _Wool_. Use _Chassis_, _Slime_ or _Super Glue_ to move more than a single block.", + "block.create.windmill_bearing.tooltip": "WINDMILL BEARING", + "block.create.windmill_bearing.tooltip.summary": "Нужен для использования _ротационной силы_ от ветра. Присоедините постройку собственного дизайна и смотрите как она крутится!", + "block.create.windmill_bearing.tooltip.condition1": "При клике правой кнопкой мыши", + "block.create.windmill_bearing.tooltip.behaviour1": "Обеспечивает _Ротационную силу_, сгенерированную от вращения присоеденённой структуры. Структура должна иметь _Парус_ или _Шерсть_. Используйте _Шасси_, _Слизь_ или _Супер-клей_ чтобы двигать больше одного блока.", - "block.create.sail_frame.tooltip": "UNLOCALIZED: SAIL FRAME", - "block.create.sail_frame.tooltip.summary": "UNLOCALIZED: A useful building block and source of kinetic energy when part of a structure mounted onto a _Windmill Bearing_.", + "block.create.sail_frame.tooltip": "SAIL FRAME", + "block.create.sail_frame.tooltip.summary": "Полезный строительный блок и источник кинетической энергии, когда используется как часть конструкции на _Подшипнике ветряной мельницы_.", - "block.create.white_sail.tooltip": "UNLOCALIZED: SAIL", - "block.create.white_sail.tooltip.summary": "UNLOCALIZED: A useful building block and source of kinetic energy when part of a structure mounted onto a _Windmill Bearing_. Comes in a variety of colours.", - "block.create.white_sail.tooltip.condition1": "UNLOCALIZED: When Right-clicked with Dye", - "block.create.white_sail.tooltip.behaviour1": "UNLOCALIZED: Changes color of the sail.", + "block.create.white_sail.tooltip": "SAIL", + "block.create.white_sail.tooltip.summary": "Полезный строительный блок и источник кинетической энергии, когда используется как часть конструкции на _Подшипнике ветряной мельницы_. Доступен в разных цветах.", + "block.create.white_sail.tooltip.condition1": "При клике правой кнопкой с красителем в руке", + "block.create.white_sail.tooltip.behaviour1": "Меняет цвет паруса.", "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", "block.create.clockwork_bearing.tooltip.summary": "Усовершенствованная версия _радиального_ _шасси_ для вращения _до_ _двух_ стрелок в соответствии с текущим _игровым_ _временем_.", @@ -1593,15 +1598,15 @@ "block.create.cart_assembler.tooltip.condition1": "При размещении над рельсами", "block.create.cart_assembler.tooltip.behaviour1": "По умолчанию _разбирает_ _вагонетки_, _при_ _подаче_ _сигнала_ красного камня _собирает-.", "block.create.cart_assembler.tooltip.condition2": "При размещении над энергорельсами", - "block.create.cart_assembler.tooltip.behaviour2": "_Собирает_ и _ускоряет_ вагонетки _при_ _сигнале_ красного камня, в противном случае _разбирает_ и _удерживает_ их.", - "block.create.cart_assembler.tooltip.control1": "UNLOCALIZED: When placed above Rail", - "block.create.cart_assembler.tooltip.action1": "UNLOCALIZED: _Assembles_ onto passing carts _when powered_, _disassembles_ them otherwise.", - "block.create.cart_assembler.tooltip.control2": "UNLOCALIZED: When placed above Powered Rail", - "block.create.cart_assembler.tooltip.action2": "UNLOCALIZED: Assembles and _accelerates_ carts _when powered_, disassembles and _holds_ them otherwise.", - "block.create.cart_assembler.tooltip.control3": "UNLOCALIZED: When placed above Detector Rail", - "block.create.cart_assembler.tooltip.action3": "UNLOCALIZED: _Assembles unassembled_ carts, _disassembles assembled_ carts.", - "block.create.cart_assembler.tooltip.control4": "UNLOCALIZED: When placed above Activator Rail", - "block.create.cart_assembler.tooltip.action4": "UNLOCALIZED: _Disassembles_ carts when powered.", + "block.create.cart_assembler.tooltip.behaviour2": "_Собирает_ и _ускоряет_ вагонетки при _активном сигнале_ красного камня, в противном случае _разбирает_ и _удерживает_ их.", + "block.create.cart_assembler.tooltip.control1": "Когда размещён на рельсах", + "block.create.cart_assembler.tooltip.action1": "_Собирает_ проходящие вагонетки, _если запитан_, и _разбирает_ их, если нет.", + "block.create.cart_assembler.tooltip.control2": "Когда размещён на активированых рельсах", + "block.create.cart_assembler.tooltip.action2": "Собирает и _ускоряет_ вагонетки _если запитан_, разбирает и _держит_ их на месте, если нет.", + "block.create.cart_assembler.tooltip.control3": "Когда размещён на рельсах с датчиком", + "block.create.cart_assembler.tooltip.action3": "_Собирает не собраные_ вагонетки, и _разбирает собраные_.", + "block.create.cart_assembler.tooltip.control4": "Когда размещён на активирущих рельсах", + "block.create.cart_assembler.tooltip.action4": "_Разбирает_ вагонетки если запитан.", "block.create.rope_pulley.tooltip": "ROPE PULLEY", "block.create.rope_pulley.tooltip.summary": "Перемещает прикреплённые _блоки_ и _конструкции_ по _вертикали_. Используйте блоки _шасси_ или _слизи_, чтобы перемещать более одного блока.", @@ -1617,8 +1622,8 @@ "block.create.linear_chassis.tooltip.control1": "ПКМ сгустком слизи", "block.create.linear_chassis.tooltip.action1": "Делает нужную сторону липкой. При перемещении шасси будет тянуть прикреплённые блоки независимо от направления движения.", - "block.create.secondary_linear_chassis.tooltip": "UNLOCALIZED: SECONDARY LINEAR CHASSIS", - "block.create.secondary_linear_chassis.tooltip.summary": "UNLOCALIZED: A second type of _Linear Chassis_ that does not connect to the other.", + "block.create.secondary_linear_chassis.tooltip": "SECONDARY LINEAR CHASSIS", + "block.create.secondary_linear_chassis.tooltip.summary": "Второй тип _Линейного шасси_, которое не соеденяется с другими.", "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", "block.create.radial_chassis.tooltip.summary": "Конфигурируемый базовый блок, соединяющий конструкции для движения.", @@ -1660,8 +1665,8 @@ "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего предела", "block.create.stockpile_switch.tooltip.behaviour1": "Не подаёт _сигнал_ _красного_ _камня_.", - "block.create.content_observer.tooltip": "UNLOCALIZED: CONTENT OBSERVER", - "block.create.content_observer.tooltip.summary": "UNLOCALIZED: _Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.", + "block.create.content_observer.tooltip": "CONTENT OBSERVER", + "block.create.content_observer.tooltip.summary": "_Обнаруживает элементы_ внутри _контейнеров_ и _конвейеров_, соответствующие настроенному _фильтру_. Если наблюдаемый инвентарь, ремень или шланг содержит совпадающий элемент, этот компонент излучает сигнал красного камня. Когда наблюдаемая _ воронка передает_ соответствующий предмет, этот компонент испускает _импульс_.", "block.create.redstone_link.tooltip": "REDSTONE LINK", "block.create.redstone_link.tooltip.summary": "_Беспроводной_ _передатчик_ сигнала красного камня. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", @@ -1676,8 +1681,8 @@ "block.create.nixie_tube.tooltip.summary": "Красивый дисплей с питанием от _сигнала_ _красного_ _камня_ в диапазоне от 0 до 15.", "block.create.nixie_tube.tooltip.condition1": "При подаче сигнала красного камня", "block.create.nixie_tube.tooltip.behaviour1": "Показывает _текущую_ _силу_ _сигнала_ красного камня в качестве отображаемого значения.", - "block.create.nixie_tube.tooltip.condition2": "UNLOCALIZED: With Name Tag", - "block.create.nixie_tube.tooltip.behaviour2": "UNLOCALIZED: Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.", + "block.create.nixie_tube.tooltip.condition2": "С биркой", + "block.create.nixie_tube.tooltip.behaviour2": "Отображает _содержимое_ вашей _бирки_, если несколько газоразрядных индикаторов _подключены_ в _одну линию_.", "block.create.redstone_contact.tooltip": "REDSTONE CONTACT", "block.create.redstone_contact.tooltip.summary": "Простое устройство для продвинутых механизмов. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", @@ -1687,7 +1692,7 @@ "block.create.redstone_contact.tooltip.behaviour2": "Активирует все стационарные контакты, которые проходит.", "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", - "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стеков любого предмета. Поддерживает компараторы.", + "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стэков любого предмета. Поддерживает компараторы.", "block.create.adjustable_crate.tooltip.control1": "При ПКМ", "block.create.adjustable_crate.tooltip.action1": "Открывается _интерфейс_.", @@ -1702,11 +1707,11 @@ "block.create.deployer.tooltip.behaviour1": "_Вытягивает_ _руку_ и _активирует_ на _2_ _м_ _впереди_ себя.", "block.create.deployer.tooltip.condition2": "ПКМ гаечным ключом", "block.create.deployer.tooltip.behaviour2": "Переключает режим удара. В режиме пробивки автономный активатор попытается использовать свой предмет, чтобы разбить блоки или нанести урон сущностям.", - "block.create.deployer.tooltip.condition3": "UNLOCALIZED: When Filter assigned", - "block.create.deployer.tooltip.behaviour3": "UNLOCALIZED: Deployer will not activate unless held item _matches_ the _filter._ Items not matching cannot be inserted; Held items matching the filter cannot be extracted.", + "block.create.deployer.tooltip.condition3": "Когда установлен фильтр", + "block.create.deployer.tooltip.behaviour3": "Автоматический активатор будет активирован, если только удерживаемый предмет _совпадает_ с предметом в _фильтре_. Не совпадающие предметы не могут быть помещены; Удерживаемые предметы, соответствующие фильтру, не могут быть извлечены.", "block.create.brass_casing.tooltip": "BRASS CASING", - "block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Сейф для украшения.", + "block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Безопасно для украшения.", "block.create.pulse_repeater.tooltip": "PULSE REPEATER", "block.create.pulse_repeater.tooltip.summary": "Простая схема обрезки длинны проходящего сигнала до _1_ _тика_.", @@ -1726,10 +1731,10 @@ "block.create.powered_latch.tooltip": "POWERED LATCH", "block.create.powered_latch.tooltip.summary": "Рычаг, которым можно управлять с помощью сигналов красного камня. Сигнал с задней стороны включает его, сигнал со стороны сбрасывает его.", - "block.create.controller_rail.tooltip": "UNLOCALIZED: CONTROLLER RAIL", - "block.create.controller_rail.tooltip.summary": "UNLOCALIZED: A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", - "block.create.controller_rail.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", - "block.create.controller_rail.tooltip.behaviour1": "UNLOCALIZED: _Accelerates_ or _Decelerates_ passing _minecarts_ corresponding to the _signal strength_. Propagates redstone power to adjacent controller rails. Powering two controller rails with different strengths will cause tracks between them to interpolate their signal.", + "block.create.controller_rail.tooltip": "CONTROLLER RAIL", + "block.create.controller_rail.tooltip.summary": "_Все-направленные запитанные рельсы_, позволяющие _точную настройку_ _скорости_ вагонеток.", + "block.create.controller_rail.tooltip.condition1": "Когда запитано редстоун-сигналом", + "block.create.controller_rail.tooltip.behaviour1": "_Ускоряет_ или _замедляет_ _прошедшие вагонетки_, на велечину зависящую от _силы сигнала_. Распространая сигнал красного камня на соседние контролирующие рельсы. Питание двух контроллирующих рельс с разной мощностью приведет к тому, что дорожки между ними будут интерполировать свой сигнал.", "block.create.speedometer.tooltip": "SPEEDOMETER", "block.create.speedometer.tooltip.summary": "Измеряет и отображает _скорость_ _вращения_ прикреплённых кинетических компонентов. Поддерживает _компараторы_.", @@ -1741,10 +1746,10 @@ "block.create.stressometer.tooltip.condition1": "При вращении", "block.create.stressometer.tooltip.behaviour1": "Указывает цвет, соответствующий уровню момента. Перенапряженные сети перестанут двигаться. Напряжение можно снять, добавив в сеть дополнительные источники вращения.", - "item.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER", - "item.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish materials_. Can be automatically applied using the Deployer.", - "item.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used", - "item.create.sand_paper.tooltip.behaviour1": "UNLOCALIZED: Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_", + "item.create.sand_paper.tooltip": "SAND PAPER", + "item.create.sand_paper.tooltip.summary": "Грубая бумага, которую можно использовать для _полировки материалов_. Может применяться автоматически с помощью автономного активатора.", + "item.create.sand_paper.tooltip.condition1": "Когда используется", + "item.create.sand_paper.tooltip.behaviour1": "Полирует предметы во _второй руке_, или лежащие _на полу_, если _смотреть на них_", "item.create.super_glue.tooltip": "SUPER GLUE", "item.create.super_glue.tooltip.summary": "Приклейте блок к другому, и они навсегда будут неразлучны.", @@ -1753,8 +1758,8 @@ "item.create.super_glue.tooltip.condition2": "Кода в другой руке", "item.create.super_glue.tooltip.behaviour2": "Автоматически _прикрепляет_ _блоки_, расположенные от основной руки, к той _стороне_, _против_ _которой_ они были.", - "item.create.builders_tea.tooltip": "UNLOCALIZED: BUILDERS TEA", - "item.create.builders_tea.tooltip.summary": "UNLOCALIZED: The perfect drink to get the day started- _Motivating_ and _Saturating._", + "item.create.builders_tea.tooltip": "BUILDERS TEA", + "item.create.builders_tea.tooltip.summary": "Идеальный напиток для начала дня. _Мотивирует и насыщает_.", "item.create.refined_radiance.tooltip": "REFINED RADIANCE", "item.create.refined_radiance.tooltip.summary": "Хроматический материал, _добытый_ _из_ _поглощенного_ _света_.", @@ -1762,10 +1767,10 @@ "item.create.shadow_steel.tooltip": "SHADOW STEEL", "item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.", - "item.create.minecart_coupling.tooltip": "UNLOCALIZED: MINECART COUPLING", - "item.create.minecart_coupling.tooltip.summary": "UNLOCALIZED: _Chains_ all your _Minecarts_ or _Carriage Contraptions_ together to form a majestic Train.", - "item.create.minecart_coupling.tooltip.condition1": "UNLOCALIZED: When Used on Minecart", - "item.create.minecart_coupling.tooltip.behaviour1": "UNLOCALIZED: _Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", + "item.create.minecart_coupling.tooltip": "MINECART COUPLING", + "item.create.minecart_coupling.tooltip.summary": "_Соединяет_ ваши _вагонетки_ или or _Перевозочные устройства_ вместе, чтобы создать великолепный поезд.", + "item.create.minecart_coupling.tooltip.condition1": "При использовании на вагонетке", + "item.create.minecart_coupling.tooltip.behaviour1": "_Соединяет_ две вагонетки вместе, пытаясь держать их на _определенной дистанции_ при движении.", "item.create.crafter_slot_cover.tooltip": "SLOT COVER", "item.create.crafter_slot_cover.tooltip.summary": "Используется для обозначения слота как пустой слот рецепта в _механическом_ _крафтере_. Крафтеры не обязательно должны образовывать полную квадратную сетку. Это полезно если есть рецепты, где ингредиенты располагаются _по_ _диагонали_ друг к другу.", @@ -1773,10 +1778,10 @@ "create.tooltip.wip": "WIP", "create.tooltip.workInProgress": "Работа продолжается!", "create.tooltip.randomWipDescription0": "Пожалуйста держите этот предмет подальше от детей!", - "create.tooltip.randomWipDescription1": "Маленькая панда умирает каждый раз, когда вы используете этот предмет. Каждый. Время.", + "create.tooltip.randomWipDescription1": "Маленькая панда умирает каждый раз, когда вы используете этот предмет. Каждый. Раз.", "create.tooltip.randomWipDescription2": "Используйте на свой страх и риск.", "create.tooltip.randomWipDescription3": "Это не тот предмет, который вы ищете, *шевелит пальцами* пожалуйста, ускорьтесь.", - "create.tooltip.randomWipDescription4": "Этот предмет самоуничтожится за 10 секунд. 10, 9, 8...", + "create.tooltip.randomWipDescription4": "Этот предмет самоуничтожится через 10 секунд. 10, 9, 8...", "create.tooltip.randomWipDescription5": "Поверьте мне, это бесполезно.", "create.tooltip.randomWipDescription6": "Используя этот пункт, вы тем самым соглашаетесь с нашим отказом от ответственности и соглашаетесь с его условиями.", "create.tooltip.randomWipDescription7": "Этот, возможно, но не для тебя. Как насчет этого?", 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 eaec6150e..641ba6d17 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: 1", + "_": "Missing Localizations: 8", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "辉长岩圆石楼梯", "block.create.gabbro_cobblestone_wall": "辉长岩圆石墙", "block.create.gabbro_pillar": "竖纹辉长岩", + "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "十字齿轮箱", "block.create.gearshift": "换挡齿轮箱", "block.create.glass_fluid_pipe": "玻璃流体管道", @@ -368,6 +370,7 @@ "block.create.sequenced_gearshift": "可编程齿轮箱", "block.create.shadow_steel_casing": "暗影机壳", "block.create.shaft": "传动杆", + "block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_fluid_pipe": "智能流体管道", "block.create.speedometer": "速度表", "block.create.spout": "注液器", @@ -404,12 +407,11 @@ "block.create.zinc_ore": "锌矿石", "entity.create.contraption": "结构", + "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", "entity.create.seat": "坐垫", "entity.create.stationary_contraption": "固定结构", "entity.create.super_glue": "强力胶", - "fluid.create.chocolate": "巧克力", - "fluid.create.honey": "蜂蜜", "fluid.create.milk": "牛奶", "fluid.create.potion": "药水", "fluid.create.tea": "茶", @@ -1084,7 +1086,10 @@ "create.tooltip.chute.fans_push_down": "鼓风机从上方进行推动", "create.tooltip.chute.fans_pull_up": "鼓风机从下方进行吸引", "create.tooltip.chute.fans_pull_down": "鼓风机从上方进行吸引", + "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", + "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "没有目标", "create.hint.mechanical_arm_no_targets": "看起来这个_动力臂_没有被分配任何_目标_。在手持机械臂的同时,右键选取传送带、置物台、漏斗或其他设备来设置目标。", "create.hint.horizontal_funnel.title": "水平漏斗", diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel.json b/src/generated/resources/assets/create/models/block/andesite_funnel.json deleted file mode 100644 index 1161539b1..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "create:block/funnel/block", - "textures": { - "0": "create:block/andesite_funnel_plating", - "1": "create:block/andesite_casing", - "2": "create:block/andesite_funnel", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull.json b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull.json new file mode 100644 index 000000000..bdbb2623f --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull_powered.json new file mode 100644 index 000000000..f66c6e8f3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel_powered", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push.json b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push.json new file mode 100644 index 000000000..8217c6b7a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push_powered.json new file mode 100644 index 000000000..ff4df0493 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel_powered", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull.json b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull.json new file mode 100644 index 000000000..6079531b3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull_powered.json new file mode 100644 index 000000000..5ac3f88c7 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel_powered", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push.json b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push.json new file mode 100644 index 000000000..21b19aa78 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push_powered.json new file mode 100644 index 000000000..8a8f6a8de --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel_powered", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_powered.json deleted file mode 100644 index a2a451715..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_powered.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "create:block/funnel/block", - "textures": { - "0": "create:block/andesite_funnel_plating", - "1": "create:block/andesite_casing", - "2": "create:block/andesite_funnel_powered", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull.json b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull.json new file mode 100644 index 000000000..e8343d682 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull_powered.json new file mode 100644 index 000000000..e71c4c17c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel_powered", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push.json b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push.json new file mode 100644 index 000000000..4b56f936a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push_powered.json new file mode 100644 index 000000000..b9f6af0dc --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "6": "create:block/andesite_funnel_powered", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel.json b/src/generated/resources/assets/create/models/block/brass_funnel.json deleted file mode 100644 index 82a6b28f3..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "create:block/funnel/block", - "textures": { - "0": "create:block/brass_funnel_plating", - "1": "create:block/brass_casing", - "2": "create:block/brass_funnel", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull.json b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull.json new file mode 100644 index 000000000..04fb853ba --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull_powered.json new file mode 100644 index 000000000..4a0c7c1d2 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel_powered", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push.json b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push.json new file mode 100644 index 000000000..c1595bbd8 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push_powered.json new file mode 100644 index 000000000..e4b8a8e16 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_ceiling", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel_powered", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull.json b/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull.json new file mode 100644 index 000000000..02c4f8743 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull_powered.json new file mode 100644 index 000000000..c16f1f997 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel_powered", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_push.json b/src/generated/resources/assets/create/models/block/brass_funnel_floor_push.json new file mode 100644 index 000000000..642f3480b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_floor_push.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_push_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_floor_push_powered.json new file mode 100644 index 000000000..1e1c45148 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_floor_push_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_floor", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel_powered", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_powered.json deleted file mode 100644 index 6085c2466..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_powered.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "create:block/funnel/block", - "textures": { - "0": "create:block/brass_funnel_plating", - "1": "create:block/brass_casing", - "2": "create:block/brass_funnel_powered", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull.json b/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull.json new file mode 100644 index 000000000..9b0bae0f1 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull_powered.json new file mode 100644 index 000000000..03dc68716 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel_powered", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_push.json b/src/generated/resources/assets/create/models/block/brass_funnel_wall_push.json new file mode 100644 index 000000000..f2f3bd158 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_wall_push.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_push_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_wall_push_powered.json new file mode 100644 index 000000000..1a27b7333 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_wall_push_powered.json @@ -0,0 +1,11 @@ +{ + "parent": "create:block/funnel/block_wall", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "6": "create:block/brass_funnel_powered", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_end_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_end_flipped.json new file mode 100644 index 000000000..647d961f4 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_end_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_end", + "textures": { + "2": "create:block/gantry_shaft_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_end_powered.json b/src/generated/resources/assets/create/models/block/gantry_shaft_end_powered.json new file mode 100644 index 000000000..3d3ab236c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_end_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_end", + "textures": { + "2": "create:block/gantry_shaft_powered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_end_powered_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_end_powered_flipped.json new file mode 100644 index 000000000..7c009239c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_end_powered_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_end", + "textures": { + "2": "create:block/gantry_shaft_powered_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_middle_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_middle_flipped.json new file mode 100644 index 000000000..15c145bd7 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_middle_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_middle", + "textures": { + "2": "create:block/gantry_shaft_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_middle_powered.json b/src/generated/resources/assets/create/models/block/gantry_shaft_middle_powered.json new file mode 100644 index 000000000..a62bb0956 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_middle_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_middle", + "textures": { + "2": "create:block/gantry_shaft_powered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_middle_powered_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_middle_powered_flipped.json new file mode 100644 index 000000000..599fb899d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_middle_powered_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_middle", + "textures": { + "2": "create:block/gantry_shaft_powered_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_single_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_single_flipped.json new file mode 100644 index 000000000..b042aca12 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_single_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_single", + "textures": { + "2": "create:block/gantry_shaft_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_single_powered.json b/src/generated/resources/assets/create/models/block/gantry_shaft_single_powered.json new file mode 100644 index 000000000..25312c6b7 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_single_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_single", + "textures": { + "2": "create:block/gantry_shaft_powered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_single_powered_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_single_powered_flipped.json new file mode 100644 index 000000000..aeb471f49 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_single_powered_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_single", + "textures": { + "2": "create:block/gantry_shaft_powered_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_start_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_start_flipped.json new file mode 100644 index 000000000..60db07967 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_start_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_start", + "textures": { + "2": "create:block/gantry_shaft_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_start_powered.json b/src/generated/resources/assets/create/models/block/gantry_shaft_start_powered.json new file mode 100644 index 000000000..87145ad41 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_start_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_start", + "textures": { + "2": "create:block/gantry_shaft_powered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gantry_shaft_start_powered_flipped.json b/src/generated/resources/assets/create/models/block/gantry_shaft_start_powered_flipped.json new file mode 100644 index 000000000..208acae8b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gantry_shaft_start_powered_flipped.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/gantry_shaft/block_start", + "textures": { + "2": "create:block/gantry_shaft_powered_flipped" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/andesite_funnel.json b/src/generated/resources/assets/create/models/item/andesite_funnel.json index f0e8e8481..6cb095db3 100644 --- a/src/generated/resources/assets/create/models/item/andesite_funnel.json +++ b/src/generated/resources/assets/create/models/item/andesite_funnel.json @@ -1,9 +1,11 @@ { "parent": "create:block/funnel/item", "textures": { - "0": "create:block/andesite_funnel_plating", - "1": "create:block/andesite_casing", - "2": "create:block/andesite_funnel", + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "2": "create:block/andesite_funnel_neutral", + "6": "create:block/andesite_funnel", + "5": "create:block/andesite_funnel_tall", "3": "create:block/andesite_funnel_back" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brass_funnel.json b/src/generated/resources/assets/create/models/item/brass_funnel.json index 82e8d4035..5a1542acb 100644 --- a/src/generated/resources/assets/create/models/item/brass_funnel.json +++ b/src/generated/resources/assets/create/models/item/brass_funnel.json @@ -1,9 +1,11 @@ { "parent": "create:block/funnel/item", "textures": { - "0": "create:block/brass_funnel_plating", - "1": "create:block/brass_casing", - "2": "create:block/brass_funnel", + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "2": "create:block/brass_funnel_neutral", + "6": "create:block/brass_funnel", + "5": "create:block/brass_funnel_tall", "3": "create:block/brass_funnel_back" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gantry_pinion.json b/src/generated/resources/assets/create/models/item/gantry_pinion.json new file mode 100644 index 000000000..55924eb15 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/gantry_pinion.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/gantry_pinion/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gantry_shaft.json b/src/generated/resources/assets/create/models/item/gantry_shaft.json new file mode 100644 index 000000000..926e58831 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/gantry_shaft.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/gantry_shaft/block_single" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/smart_chute.json b/src/generated/resources/assets/create/models/item/smart_chute.json new file mode 100644 index 000000000..c0a19c1e0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/smart_chute.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/smart_chute/block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json new file mode 100644 index 000000000..b0d383da3 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/gantry_pinion" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/gantry_pinion" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_shaft.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_shaft.json new file mode 100644 index 000000000..fda6afd2b --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_shaft.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/gantry_shaft" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/gantry_shaft" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/smart_chute.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/smart_chute.json new file mode 100644 index 000000000..1f1243833 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/smart_chute.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/smart_chute" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:chute" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/smart_chute" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gantry_pinion.json b/src/generated/resources/data/create/loot_tables/blocks/gantry_pinion.json new file mode 100644 index 000000000..9631215af --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gantry_pinion.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:gantry_pinion" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gantry_shaft.json b/src/generated/resources/data/create/loot_tables/blocks/gantry_shaft.json new file mode 100644 index 000000000..63718c8f4 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gantry_shaft.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:gantry_shaft" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/smart_chute.json b/src/generated/resources/data/create/loot_tables/blocks/smart_chute.json new file mode 100644 index 000000000..f3e3c62ea --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/smart_chute.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:smart_chute" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_pinion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_pinion.json new file mode 100644 index 000000000..9bb723b76 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_pinion.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "ICI", + " S " + ], + "key": { + "B": { + "tag": "minecraft:planks" + }, + "S": { + "item": "create:cogwheel" + }, + "C": { + "item": "create:andesite_casing" + }, + "I": { + "item": "create:shaft" + } + }, + "result": { + "item": "create:gantry_pinion" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_shaft.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_shaft.json new file mode 100644 index 000000000..0443296ab --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_shaft.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "R", + "A" + ], + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "R": { + "tag": "forge:dusts/redstone" + } + }, + "result": { + "item": "create:gantry_shaft", + "count": 8 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/smart_chute.json b/src/generated/resources/data/create/recipes/crafting/kinetics/smart_chute.json new file mode 100644 index 000000000..8ce8d1179 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/smart_chute.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "I", + "S", + "P" + ], + "key": { + "P": { + "item": "create:electron_tube" + }, + "S": { + "item": "create:chute" + }, + "I": { + "tag": "forge:plates/brass" + } + }, + "result": { + "item": "create:smart_chute" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/milling/sandstone.json b/src/generated/resources/data/create/recipes/milling/sandstone.json new file mode 100644 index 000000000..773617a41 --- /dev/null +++ b/src/generated/resources/data/create/recipes/milling/sandstone.json @@ -0,0 +1,14 @@ +{ + "type": "create:milling", + "ingredients": [ + { + "item": "minecraft:sandstone" + } + ], + "results": [ + { + "item": "minecraft:sand" + } + ], + "processingTime": 150 +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index ddb43ea20..f0b558da7 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -58,7 +58,8 @@ public class AllBlockPartials { HARVESTER_BLADE = get("mechanical_harvester/blade"), DEPLOYER_POLE = get("deployer/pole"), DEPLOYER_HAND_POINTING = get("deployer/hand_pointing"), DEPLOYER_HAND_PUNCHING = get("deployer/hand_punching"), DEPLOYER_HAND_HOLDING = get("deployer/hand_holding"), ANALOG_LEVER_HANDLE = get("analog_lever/handle"), - ANALOG_LEVER_INDICATOR = get("analog_lever/indicator"), BELT_FUNNEL_FLAP = get("belt_funnel/flap"), + ANALOG_LEVER_INDICATOR = get("analog_lever/indicator"), FUNNEL_FLAP = get("funnel/flap"), + BELT_FUNNEL_FLAP = get("belt_funnel/flap"), BELT_TUNNEL_FLAP = get("belt_tunnel/flap"), FLEXPEATER_INDICATOR = get("diodes/indicator"), FLYWHEEL = get("flywheel/wheel"), FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"), @@ -70,6 +71,8 @@ public class AllBlockPartials { CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"), CUCKOO_CREEPER = get("cuckoo_clock/creeper"), + GANTRY_COGS = get("gantry_pinion/wheels"), + ROPE_COIL = get("rope_pulley/rope_coil"), ROPE_HALF = get("rope_pulley/rope_half"), ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"), @@ -106,6 +109,8 @@ public class AllBlockPartials { SPOUT_TOP = get("spout/top"), SPOUT_MIDDLE = get("spout/middle"), SPOUT_BOTTOM = get("spout/bottom"), + SPEED_CONTROLLER_BRACKET = get("rotation_speed_controller/bracket"), + COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), COUPLING_RING = getEntity("minecart_coupling/ring"), COUPLING_CONNECTOR = getEntity("minecart_coupling/connector") diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 561fff183..3446861fb 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -54,6 +54,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlockItem; @@ -90,11 +91,11 @@ import com.simibubi.create.content.contraptions.processing.BasinMovementBehaviou import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.contraptions.processing.burner.LitBlazeBurnerBlock; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftGenerator; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltColor; import com.simibubi.create.content.contraptions.relays.belt.BeltGenerator; import com.simibubi.create.content.contraptions.relays.belt.BeltModel; import com.simibubi.create.content.contraptions.relays.elementary.BracketedKineticBlockModel; @@ -117,6 +118,7 @@ import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelCTBeh import com.simibubi.create.content.logistics.block.chute.ChuteBlock; import com.simibubi.create.content.logistics.block.chute.ChuteGenerator; import com.simibubi.create.content.logistics.block.chute.ChuteItem; +import com.simibubi.create.content.logistics.block.chute.SmartChuteBlock; import com.simibubi.create.content.logistics.block.depot.DepotBlock; import com.simibubi.create.content.logistics.block.diodes.AbstractDiodeGenerator; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterBlock; @@ -127,10 +129,9 @@ import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterBlock; import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterGenerator; import com.simibubi.create.content.logistics.block.diodes.ToggleLatchBlock; import com.simibubi.create.content.logistics.block.diodes.ToggleLatchGenerator; -import com.simibubi.create.content.logistics.block.funnel.AndesiteBeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.AndesiteFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelGenerator; -import com.simibubi.create.content.logistics.block.funnel.BrassBeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelMovementBehaviour; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; @@ -172,8 +173,10 @@ import net.minecraft.item.Item; import net.minecraft.state.properties.PistonType; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; +import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.common.Tags; import net.minecraftforge.common.ToolType; @@ -298,7 +301,8 @@ public class AllBlocks { .blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> { String powered = state.get(AdjustablePulleyBlock.POWERED) ? "_powered" : ""; return p.models() - .withExistingParent(c.getName() + "_" + suffix + powered, p.modLoc("block/encased_chain_drive/" + suffix)) + .withExistingParent(c.getName() + "_" + suffix + powered, + p.modLoc("block/encased_chain_drive/" + suffix)) .texture("side", p.modLoc("block/" + c.getName() + powered)); }).generate(c, p)) .item() @@ -313,7 +317,6 @@ public class AllBlocks { .properties(p -> p.hardnessAndResistance(0.8F)) .blockstate(new BeltGenerator()::generate) .transform(StressConfigDefaults.setImpact(1.0)) - .onRegister(CreateRegistrate.blockColors(() -> BeltColor::new)) .onRegister(CreateRegistrate.blockModel(() -> BeltModel::new)) .register(); @@ -479,6 +482,13 @@ public class AllBlocks { .transform(customItemModel("_", "block")) .register(); + public static final BlockEntry SMART_CHUTE = REGISTRATE.block("smart_chute", SmartChuteBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) + .item() + .transform(customItemModel("_", "block")) + .register(); + public static final BlockEntry SPEEDOMETER = REGISTRATE.block("speedometer", GaugeBlock::speed) .initialProperties(SharedProperties::wooden) .transform(StressConfigDefaults.setNoImpact()) @@ -680,6 +690,38 @@ public class AllBlocks { .getName() + "/head")))) .register(); + public static final BlockEntry GANTRY_PINION = + REGISTRATE.block("gantry_pinion", GantryPinionBlock::new) + .initialProperties(SharedProperties::stone) + .properties(Block.Properties::nonOpaque) + .blockstate(BlockStateGen.directionalAxisBlockProvider()) + .item() + .transform(customItemModel()) + .register(); + + public static final BlockEntry GANTRY_SHAFT = + REGISTRATE.block("gantry_shaft", GantryShaftBlock::new) + .initialProperties(SharedProperties::stone) + .blockstate((c, p) -> p.directionalBlock(c.get(), s -> { + boolean isPowered = s.get(GantryShaftBlock.POWERED); + boolean isFlipped = s.get(GantryShaftBlock.FACING) + .getAxisDirection() == AxisDirection.NEGATIVE; + String partName = s.get(GantryShaftBlock.PART) + .getName(); + String flipped = isFlipped ? "_flipped" : ""; + String powered = isPowered ? "_powered" : ""; + ModelFile existing = AssetLookup.partialBaseModel(c, p, partName); + if (!isPowered && !isFlipped) + return existing; + return p.models() + .withExistingParent("block/" + c.getName() + "_" + partName + powered + flipped, + existing.getLocation()) + .texture("2", p.modLoc("block/" + c.getName() + powered + flipped)); + })) + .item() + .transform(customItemModel("_", "block_single")) + .register(); + public static final BlockEntry WINDMILL_BEARING = REGISTRATE.block("windmill_bearing", WindmillBearingBlock::new) .transform(BuilderTransformers.bearing("windmill", "gearbox", true)) @@ -1042,8 +1084,8 @@ public class AllBlocks { .transform(BuilderTransformers.funnel("andesite", Create.asResource("block/andesite_casing"))) .register(); - public static final BlockEntry ANDESITE_BELT_FUNNEL = - REGISTRATE.block("andesite_belt_funnel", AndesiteBeltFunnelBlock::new) + public static final BlockEntry ANDESITE_BELT_FUNNEL = + REGISTRATE.block("andesite_belt_funnel", p -> new BeltFunnelBlock(AllBlocks.ANDESITE_FUNNEL, p)) .initialProperties(SharedProperties::stone) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new BeltFunnelGenerator("andesite", new ResourceLocation("block/polished_andesite"))::generate) @@ -1058,8 +1100,8 @@ public class AllBlocks { .transform(BuilderTransformers.funnel("brass", Create.asResource("block/brass_casing"))) .register(); - public static final BlockEntry BRASS_BELT_FUNNEL = - REGISTRATE.block("brass_belt_funnel", BrassBeltFunnelBlock::new) + public static final BlockEntry BRASS_BELT_FUNNEL = + REGISTRATE.block("brass_belt_funnel", p -> new BeltFunnelBlock(AllBlocks.BRASS_FUNNEL, p)) .initialProperties(SharedProperties::softMetal) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new BeltFunnelGenerator("brass", Create.asResource("block/brass_block"))::generate) diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 08a1a8d1a..061e0507d 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -6,6 +6,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntityRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer; import com.simibubi.create.foundation.utility.Lang; @@ -23,16 +25,27 @@ import net.minecraftforge.fml.client.registry.RenderingRegistry; public class AllEntityTypes { public static final RegistryEntry> ORIENTED_CONTRAPTION = - register("contraption", OrientedContraptionEntity::new, EntityClassification.MISC, 5, 3, true, - AbstractContraptionEntity::build); + contraption("contraption", OrientedContraptionEntity::new, 5, 3, true); public static final RegistryEntry> CONTROLLED_CONTRAPTION = - register("stationary_contraption", ControlledContraptionEntity::new, EntityClassification.MISC, 20, 40, false, - AbstractContraptionEntity::build); + contraption("stationary_contraption", ControlledContraptionEntity::new, 20, 40, false); + public static final RegistryEntry> GANTRY_CONTRAPTION = + contraption("gantry_contraption", GantryContraptionEntity::new, 10, 40, false); + public static final RegistryEntry> SUPER_GLUE = register("super_glue", SuperGlueEntity::new, EntityClassification.MISC, 10, Integer.MAX_VALUE, false, SuperGlueEntity::build); public static final RegistryEntry> SEAT = register("seat", SeatEntity::new, EntityClassification.MISC, 0, Integer.MAX_VALUE, false, SeatEntity::build); + // + + public static void register() {} + + private static RegistryEntry> contraption(String name, IFactory factory, + int range, int updateFrequency, boolean sendVelocity) { + return register(name, factory, EntityClassification.MISC, range, updateFrequency, sendVelocity, + AbstractContraptionEntity::build); + } + private static RegistryEntry> register(String name, IFactory factory, EntityClassification group, int range, int updateFrequency, boolean sendVelocity, NonNullConsumer> propertyBuilder) { @@ -46,14 +59,14 @@ public class AllEntityTypes { .register(); } - public static void register() {} - @OnlyIn(value = Dist.CLIENT) public static void registerRenderers() { RenderingRegistry.registerEntityRenderingHandler(CONTROLLED_CONTRAPTION.get(), ControlledContraptionEntityRenderer::new); RenderingRegistry.registerEntityRenderingHandler(ORIENTED_CONTRAPTION.get(), OrientedContraptionEntityRenderer::new); + RenderingRegistry.registerEntityRenderingHandler(GANTRY_CONTRAPTION.get(), + GantryContraptionEntityRenderer::new); RenderingRegistry.registerEntityRenderingHandler(SUPER_GLUE.get(), SuperGlueRenderer::new); RenderingRegistry.registerEntityRenderingHandler(SEAT.get(), SeatEntity.Render::new); } diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index be8672704..ad49e3edb 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -41,10 +41,6 @@ public class AllShapes { SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14) .forDirectional(), SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(), - SPEED_CONTROLLER = shape(0, 0, 0, 16, 2, 16).add(1, 1, 1, 15, 15, 15) - .erase(0, 8, 5, 16, 16, 11) - .add(2, 9, 2, 14, 14, 14) - .forHorizontalAxis(), HARVESTER_BASE = shape(0, 2, 0, 16, 14, 3).forDirectional(SOUTH), NOZZLE = shape(2, 0, 2, 14, 14, 14).add(1, 13, 1, 15, 15, 15) .erase(3, 13, 3, 13, 15, 13) @@ -68,34 +64,26 @@ public class AllShapes { NIXIE_TUBE_CEILING = shape(0, 12, 0, 16, 16, 16).add(9, 1, 5, 15, 16, 11) .add(1, 1, 5, 7, 16, 11) .forHorizontalAxis(), - FUNNEL = shape(2, -2, 2, 14, 2, 14).add(3, 2, 3, 13, 6, 13) - .add(2, 6, 2, 14, 10, 14) - .add(0, 10, 0, 16, 16, 16) - .forDirectional(UP), - FUNNEL_COLLISION = shape(2, -2, 2, 14, 2, 14).add(3, 2, 3, 13, 6, 13) - .add(2, 6, 2, 14, 10, 14) - .add(0, 10, 0, 16, 13, 16) - .forDirectional(UP), + FUNNEL_COLLISION = shape(0, 0, 0, 16, 4, 16).forDirectional(UP), BELT_FUNNEL_RETRACTED = shape(2, -2, 14, 14, 14, 18).add(0, -5, 8, 16, 16, 14) .forHorizontal(NORTH), BELT_FUNNEL_EXTENDED = shape(2, -2, 14, 14, 14, 18).add(3, -4, 10, 13, 13, 14) .add(2, -4, 6, 14, 14, 10) .add(0, -5, 0, 16, 16, 6) .forHorizontal(NORTH), - BELT_FUNNEL_PERPENDICULAR = - shape(2, -2, 14, 14, 14, 18) - .add(1, 8, 12, 15, 15, 14) + BELT_FUNNEL_PERPENDICULAR = shape(2, -2, 14, 14, 14, 18).add(1, 8, 12, 15, 15, 14) .add(0.1, 13, 7, 15.9, 15, 11) .add(0.1, 9, 8, 15.9, 13, 12) .add(0.1, 5, 9, 15.9, 9, 13) .add(0.1, 1, 10, 15.9, 5, 14) .add(0.1, -3, 11, 15.9, 1, 15) .forHorizontal(NORTH), - BELT_FUNNEL_CONNECTED = - shape(2, -2, 14, 14, 14, 18) - .add(0, -5, 5, 16, 16, 11) - .add(2, -4, 2, 14, 14, -2) - .add(3, -2, 0, 13, 13, 16) + FUNNEL = shape(2, 2, 14, 14, 14, 18).add(1, 8, 12, 15, 15, 14) + .add(0.1, 13, 7, 15.9, 15, 11) + .add(0.1, 9, 8, 15.9, 13, 12) + .add(0.1, 5, 9, 15.9, 9, 13) + .add(0.1, 1, 10, 15.9, 5, 14) + .add(0.1, -1, 11, 15.9, 1, 15) .forHorizontal(NORTH), FLUID_VALVE = shape(3, -1, 3, 13, 17, 13).add(2, 2, 2, 14, 14, 14) .forAxis(), @@ -152,6 +140,8 @@ public class AllShapes { BASIN_COLLISION_SHAPE = shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 16, 14) .add(2, 0, 2, 14, 2, 14) .build(), + SPEED_CONTROLLER = shape(0, 0, 0, 16, 4, 16).add(1, 1, 1, 15, 13, 15) + .add(0, 8, 0, 16, 14, 16).build(), HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16) .build(), HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(), @@ -183,6 +173,9 @@ public class AllShapes { .build(), CHUTE = shape(1, 8, 1, 15, 16, 15).add(2, 0, 2, 14, 8, 14) .build(), + SMART_CHUTE = shape(0, 0, 0, 16, 5, 16).add(0, 9, 0, 16, 15, 16) + .add(1, 0, 1, 15, 16, 15) + .build(), TANK = shape(1, 0, 1, 15, 16, 15).build(), TANK_TOP = shape(TANK_TOP_LID).add(TANK) .build(), TANK_BOTTOM = shape(TANK_BOTTOM_LID).add(TANK) @@ -190,6 +183,12 @@ public class AllShapes { TANK_TOP_BOTTOM = shape(TANK_BOTTOM_LID).add(TANK_TOP_LID) .add(TANK) .build(), + FUNNEL_FLOOR = shape(2, -2, 2, 14, 8, 14).add(1, 2, 1, 15, 8, 15) + .add(0, 4, 0, 16, 10, 16) + .build(), + FUNNEL_CEILING = shape(2, 8, 2, 14, 18, 14).add(1, 8, 1, 15, 14, 15) + .add(0, 6, 0, 16, 12, 16) + .build(), DEPOT = shape(CASING_11PX.get(Direction.UP)).add(1, 11, 1, 15, 13, 15) .build() diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 9d8fee9b0..e358b069c 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -18,44 +18,40 @@ import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.WoodType; +import net.minecraft.item.DyeColor; public class AllSpriteShifts { - static final Map - WOODEN_WINDOWS = new IdentityHashMap<>(); - static final Map> - PALETTE_VARIANT_PATTERNS = new IdentityHashMap<>(); + static final Map WOODEN_WINDOWS = new IdentityHashMap<>(); + static final Map> PALETTE_VARIANT_PATTERNS = + new IdentityHashMap<>(); - public static final CTSpriteShiftEntry - FRAMED_GLASS = getCT(OMNIDIRECTIONAL, "palettes/framed_glass", "palettes/framed_glass"), + public static final Map DYED_BELTS = new IdentityHashMap<>(), + DYED_OFFSET_BELTS = new IdentityHashMap<>(), DYED_DIAGONAL_BELTS = new IdentityHashMap<>(); + + public static final CTSpriteShiftEntry FRAMED_GLASS = + getCT(OMNIDIRECTIONAL, "palettes/framed_glass", "palettes/framed_glass"), HORIZONTAL_FRAMED_GLASS = getCT(HORIZONTAL, "palettes/framed_glass", "palettes/horizontal_framed_glass"), VERTICAL_FRAMED_GLASS = getCT(VERTICAL, "palettes/framed_glass", "palettes/vertical_framed_glass"), ORNATE_IRON_WINDOW = vertical("palettes/ornate_iron_window"); - public static final CTSpriteShiftEntry - CRAFTER_FRONT = getCT(CTType.OMNIDIRECTIONAL, "crafter_top", "brass_casing"), + public static final CTSpriteShiftEntry CRAFTER_FRONT = getCT(CTType.OMNIDIRECTIONAL, "crafter_top", "brass_casing"), CRAFTER_SIDE = getCT(CTType.VERTICAL, "crafter_side"), CRAFTER_OTHERSIDE = getCT(CTType.HORIZONTAL, "crafter_side"); - public static final CTSpriteShiftEntry - ANDESITE_CASING = omni("andesite_casing"), - BRASS_CASING = omni("brass_casing"), - COPPER_CASING = omni("copper_casing"), - SHADOW_STEEL_CASING = omni("shadow_steel_casing"), - REFINED_RADIANCE_CASING = omni("refined_radiance_casing"), + public static final CTSpriteShiftEntry ANDESITE_CASING = omni("andesite_casing"), + BRASS_CASING = omni("brass_casing"), COPPER_CASING = omni("copper_casing"), + SHADOW_STEEL_CASING = omni("shadow_steel_casing"), REFINED_RADIANCE_CASING = omni("refined_radiance_casing"), CREATIVE_CASING = getCT(CTType.CROSS, "creative_casing"); - - public static final CTSpriteShiftEntry - CHASSIS = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end"), + + public static final CTSpriteShiftEntry CHASSIS = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end"), CHASSIS_STICKY = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end_sticky"); - - public static final CTSpriteShiftEntry - BRASS_TUNNEL_TOP = vertical("brass_tunnel_top"), + + public static final CTSpriteShiftEntry BRASS_TUNNEL_TOP = vertical("brass_tunnel_top"), FLUID_TANK = getCT(CTType.CROSS, "fluid_tank"), CREATIVE_FLUID_TANK = getCT(CTType.CROSS, "creative_fluid_tank"); - public static final SpriteShiftEntry - BELT = SpriteShifter.get("block/belt", "block/belt_animated"), + public static final SpriteShiftEntry BELT = SpriteShifter.get("block/belt", "block/belt_animated"), BELT_OFFSET = SpriteShifter.get("block/belt_offset", "block/belt_animated"), BELT_DIAGONAL = SpriteShifter.get("block/belt_diagonal", "block/belt_diagonal_animated"), ANDESIDE_BELT_CASING = SpriteShifter.get("block/brass_casing_belt", "block/andesite_casing_belt"), @@ -93,6 +89,13 @@ public class AllSpriteShifts { map.put(texture, getCT(texture.type, target)); } } + + for (DyeColor color : DyeColor.values()) { + String id = color.getName(); + DYED_BELTS.put(color, SpriteShifter.get("block/belt", "block/belt/" + id)); + DYED_OFFSET_BELTS.put(color, SpriteShifter.get("block/belt_offset", "block/belt/" + id)); + DYED_DIAGONAL_BELTS.put(color, SpriteShifter.get("block/belt_diagonal", "block/belt/" + id + "_diagonal")); + } } // diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 55b71eaee..9cf3b8fb2 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -40,6 +40,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonTileEntity; @@ -68,6 +70,7 @@ import com.simibubi.create.content.contraptions.processing.BasinRenderer; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerRenderer; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTileEntity; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; @@ -90,6 +93,8 @@ import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEn import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; import com.simibubi.create.content.logistics.block.chute.ChuteRenderer; import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; +import com.simibubi.create.content.logistics.block.chute.SmartChuteRenderer; +import com.simibubi.create.content.logistics.block.chute.SmartChuteTileEntity; import com.simibubi.create.content.logistics.block.depot.DepotRenderer; import com.simibubi.create.content.logistics.block.depot.DepotTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity; @@ -201,6 +206,18 @@ public class AllTileEntities { .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) .renderer(() -> CuckooClockRenderer::new) .register(); + + public static final TileEntityEntry GANTRY_SHAFT = Create.registrate() + .tileEntity("gantry_shaft", GantryShaftTileEntity::new) + .validBlocks(AllBlocks.GANTRY_SHAFT) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); + + public static final TileEntityEntry GANTRY_PINION = Create.registrate() + .tileEntity("gantry_pinion", GantryPinionTileEntity::new) + .validBlocks(AllBlocks.GANTRY_PINION) + .renderer(() -> GantryPinionRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() .tileEntity("mechanical_pump", PumpTileEntity::new) @@ -278,6 +295,12 @@ public class AllTileEntities { .renderer(() -> ChuteRenderer::new) .register(); + public static final TileEntityEntry SMART_CHUTE = Create.registrate() + .tileEntity("smart_chute", SmartChuteTileEntity::new) + .validBlocks(AllBlocks.SMART_CHUTE) + .renderer(() -> SmartChuteRenderer::new) + .register(); + public static final TileEntityEntry ANDESITE_TUNNEL = Create.registrate() .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) .validBlocks(AllBlocks.ANDESITE_TUNNEL) diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index d1d6333b4..af28f62f3 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; import com.simibubi.create.content.palettes.AllPaletteBlocks; import com.simibubi.create.content.palettes.PalettesItemGroup; import com.simibubi.create.content.schematics.ServerSchematicLoader; +import com.simibubi.create.content.schematics.filtering.SchematicInstances; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.command.ChunkUtil; @@ -24,7 +25,6 @@ import com.simibubi.create.foundation.data.LangMerger; import com.simibubi.create.foundation.data.recipe.MechanicalCraftingRecipeGen; import com.simibubi.create.foundation.data.recipe.ProcessingRecipeGen; import com.simibubi.create.foundation.data.recipe.StandardRecipeGen; -import com.simibubi.create.foundation.entity.CreateDataSerializers; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.worldgen.AllWorldFeatures; import com.tterrag.registrate.util.NonNullLazyValue; @@ -51,7 +51,7 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.3"; + public static final String VERSION = "0.3.1"; public static Logger logger = LogManager.getLogger(); public static ItemGroup baseCreativeTab = new CreateItemGroup(); @@ -93,7 +93,6 @@ public class Create { modEventBus.addListener(EventPriority.LOWEST, this::gatherData); AllConfigs.register(); - CreateDataSerializers.register(); random = new Random(); DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.addClientListeners(modEventBus)); @@ -101,6 +100,7 @@ public class Create { public static void init(final FMLCommonSetupEvent event) { CapabilityMinecartController.register(); + SchematicInstances.register(); schematicReceiver = new ServerSchematicLoader(); redstoneLinkNetworkHandler = new RedstoneLinkNetworkHandler(); torquePropagator = new TorquePropagator(); diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 12c5f4e90..5cb215a61 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -114,8 +114,9 @@ public class CreateJEI implements IModPlugin { .build(), autoShapeless = register("automatic_shapeless", MixingCategory::autoShapeless) - .recipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS - && !MechanicalPressTileEntity.canCompress(r.getIngredients()), BasinRecipe::convertShapeless) + .recipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS && r.getIngredients() + .size() > 1 && !MechanicalPressTileEntity.canCompress(r.getIngredients()), + BasinRecipe::convertShapeless) .catalyst(AllBlocks.MECHANICAL_MIXER::get) .catalyst(AllBlocks.BASIN::get) .enableWhen(c -> c.allowShapelessInMixer) @@ -171,6 +172,8 @@ public class CreateJEI implements IModPlugin { .build(), autoShaped = register("automatic_shaped", MechanicalCraftingCategory::new) + .recipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS && r.getIngredients() + .size() == 1) .recipes( r -> (r.getType() == IRecipeType.CRAFTING && r.getType() != AllRecipeTypes.MECHANICAL_CRAFTING.type) && (r instanceof ShapedRecipe)) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java index 6326ed9ab..86806e554 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java @@ -46,20 +46,20 @@ public class BlockCuttingCategory extends CreateRecipeCategory results = recipe.getOutputs(); + List> results = recipe.getCondensedOutputs(); for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { int xOffset = (outputIndex % 5) * 19; int yOffset = (outputIndex / 5) * -19; itemStacks.init(outputIndex + 1, false, 77 + xOffset, 47 + yOffset); - itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack()); + itemStacks.set(outputIndex + 1, results.get(outputIndex)); } } @Override public void draw(CondensedBlockCuttingRecipe recipe, double mouseX, double mouseY) { AllGuiTextures.JEI_SLOT.draw(4, 4); - int size = recipe.getOutputs().size(); + int size = Math.min(recipe.getOutputs().size(), 15); for (int i = 0; i < size; i++) { int xOffset = (i % 5) * 19; int yOffset = (i / 5) * -19; @@ -84,6 +84,23 @@ public class BlockCuttingCategory extends CreateRecipeCategory getOutputs() { return outputs; } + + public List> getCondensedOutputs() { + List> result = new ArrayList<>(); + int index = 0; + boolean firstPass = true; + for (ItemStack itemStack : outputs) { + if (firstPass) + result.add(new ArrayList<>()); + result.get(index).add(itemStack); + index++; + if (index >= 15) { + index = 0; + firstPass = false; + } + } + return result; + } public static List condenseRecipes(List> stoneCuttingRecipes) { List condensed = new ArrayList<>(); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java index 7b731b1e4..ee3d7c168 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.compat.jei.category.animations.AnimatedCrafter; +import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.foundation.gui.AllGuiTextures; import mezz.jei.api.constants.VanillaTypes; @@ -23,13 +24,14 @@ import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Rarity; +import net.minecraft.item.crafting.ICraftingRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipe; import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; -public class MechanicalCraftingCategory extends CreateRecipeCategory { +public class MechanicalCraftingCategory extends CreateRecipeCategory { private final AnimatedCrafter crafter = new AnimatedCrafter(); @@ -38,13 +40,13 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory recipeIngredients = recipe.getIngredients(); @@ -61,8 +63,8 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory getRecipeClass() { - return ShapedRecipe.class; + public Class getRecipeClass() { + return ICraftingRecipe.class; } private static final class CrafterIngredientRenderer implements IIngredientRenderer { - private final ShapedRecipe recipe; + private final ICraftingRecipe recipe; - public CrafterIngredientRenderer(ShapedRecipe recipe) { + public CrafterIngredientRenderer(ICraftingRecipe recipe) { this.recipe = recipe; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java index 6ef43c17c..dd29f947e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java @@ -11,7 +11,6 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.encased.DirectionalShaftHalvesTileEntity; import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock; @@ -70,11 +69,9 @@ public class RotationPropagator { boolean connectedByGears = definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom) && definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo); - // Belt <-> Belt - if (from instanceof BeltTileEntity && to instanceof BeltTileEntity && !connectedByAxis) { - return ((BeltTileEntity) from).getController() - .equals(((BeltTileEntity) to).getController()) ? 1 : 0; - } + float custom = from.propagateRotationTo(to, stateFrom, stateTo, diff, connectedByAxis, connectedByGears); + if (custom != 0) + return custom; // Axis <-> Axis if (connectedByAxis) { @@ -230,6 +227,9 @@ public class RotationPropagator { float newSpeed = getConveyedSpeed(currentTE, neighbourTE); float oppositeSpeed = getConveyedSpeed(neighbourTE, currentTE); + if (newSpeed == 0 && oppositeSpeed == 0) + continue; + boolean incompatible = Math.signum(newSpeed) != Math.signum(speedOfNeighbour) && (newSpeed != 0 && speedOfNeighbour != 0); @@ -395,7 +395,7 @@ public class RotationPropagator { if (!(neighbourKTE.getBlockState() .getBlock() instanceof IRotate)) return null; - if (!isConnected(currentTE, neighbourKTE)) + if (!isConnected(currentTE, neighbourKTE) && !isConnected(neighbourKTE, currentTE)) return null; return neighbourKTE; } @@ -403,14 +403,9 @@ public class RotationPropagator { public static boolean isConnected(KineticTileEntity from, KineticTileEntity to) { final BlockState stateFrom = from.getBlockState(); final BlockState stateTo = to.getBlockState(); - - if (isLargeCogToSpeedController(stateFrom, stateTo, to.getPos() - .subtract(from.getPos()))) - return true; - if (isLargeCogToSpeedController(stateTo, stateFrom, from.getPos() - .subtract(to.getPos()))) - return true; - return getRotationSpeedModifier(from, to) != 0; + return isLargeCogToSpeedController(stateFrom, stateTo, to.getPos() + .subtract(from.getPos())) || getRotationSpeedModifier(from, to) != 0 + || from.isCustomConnection(to, stateFrom, stateTo); } private static List getConnectedNeighbours(KineticTileEntity te) { @@ -436,30 +431,11 @@ public class RotationPropagator { neighbours.add(te.getPos() .offset(facing)); - // Some Blocks can interface diagonally BlockState blockState = te.getBlockState(); - boolean isLargeWheel = isLargeCog(blockState); - if (!(blockState.getBlock() instanceof IRotate)) return neighbours; IRotate block = (IRotate) blockState.getBlock(); - - if (block.hasIntegratedCogwheel(te.getWorld(), te.getPos(), blockState) || isLargeWheel - || AllBlocks.BELT.has(blockState)) { - Axis axis = block.getRotationAxis(blockState); - - BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)) - .forEach(offset -> { - if (!isLargeWheel && axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0) - return; - if (offset.distanceSq(0, 0, 0, false) != BlockPos.ZERO.distanceSq(1, 1, 0, false)) - return; - neighbours.add(te.getPos() - .add(offset)); - }); - } - - return neighbours; + return te.addPropagationLocations(block, blockState, neighbours); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java index 24d713f28..ee0734ae3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java @@ -31,7 +31,8 @@ public abstract class KineticBlock extends Block implements IRotate { @Override public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) { - for (ToolType toolType : player.getHeldItemMainhand().getToolTypes()) { + for (ToolType toolType : player.getHeldItemMainhand() + .getToolTypes()) { if (isToolEffective(state, toolType)) return true; } @@ -46,6 +47,24 @@ public abstract class KineticBlock extends Block implements IRotate { @Override public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { // onBlockAdded is useless for init, as sometimes the TE gets re-instantiated + + // however, if a block change occurs that does not change kinetic connections, + // we can prevent a major re-propagation here + + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (tileEntity instanceof KineticTileEntity) { + KineticTileEntity kineticTileEntity = (KineticTileEntity) tileEntity; + kineticTileEntity.preventSpeedUpdate = false; + + if (oldState.getBlock() != state.getBlock()) + return; + if (state.hasTileEntity() != oldState.hasTileEntity()) + return; + if (!areStatesKineticallyEquivalent(oldState, state)) + return; + + kineticTileEntity.preventSpeedUpdate = true; + } } @Override @@ -63,6 +82,10 @@ public abstract class KineticBlock extends Block implements IRotate { return true; } + protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) { + return getRotationAxis(newState) == getRotationAxis(oldState); + } + @Override public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); @@ -76,9 +99,14 @@ public abstract class KineticBlock extends Block implements IRotate { TileEntity tileEntity = worldIn.getTileEntity(pos); if (!(tileEntity instanceof KineticTileEntity)) return; + KineticTileEntity kte = (KineticTileEntity) tileEntity; + + if (kte.preventSpeedUpdate) { + kte.preventSpeedUpdate = false; + return; + } // Remove previous information when block is added - KineticTileEntity kte = (KineticTileEntity) tileEntity; kte.warnOfMovement(); kte.clearKineticInformation(); kte.updateSpeed = true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 8df6884c4..a7d96c5be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -30,6 +30,7 @@ import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; @@ -42,6 +43,7 @@ public abstract class KineticTileEntity extends SmartTileEntity public @Nullable BlockPos source; public boolean networkDirty; public boolean updateSpeed; + public boolean preventSpeedUpdate; protected KineticEffectHandler effects; protected float speed; @@ -361,11 +363,15 @@ public abstract class KineticTileEntity extends SmartTileEntity } KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn; - if (tileEntity.hasNetwork()) - tileEntity.getOrCreateNetwork() - .remove(tileEntity); - tileEntity.detachKinetics(); - tileEntity.removeSource(); + if (state.getBlock() instanceof KineticBlock + && !((KineticBlock) state.getBlock()).areStatesKineticallyEquivalent(currentState, state)) { + if (tileEntity.hasNetwork()) + tileEntity.getOrCreateNetwork() + .remove(tileEntity); + tileEntity.detachKinetics(); + tileEntity.removeSource(); + } + world.setBlockState(pos, state, 3); } @@ -404,7 +410,7 @@ public abstract class KineticTileEntity extends SmartTileEntity return false; } - @Override + @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { boolean added = false; float stressAtBase = calculateStressApplied(); @@ -417,8 +423,8 @@ public abstract class KineticTileEntity extends SmartTileEntity String stressString = spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; - tooltip.add(" " + String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressTotal), - Lang.translate("gui.goggles.at_current_speed"))); + tooltip.add(" " + String.format(stressString, TextFormatting.AQUA, + IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed"))); added = true; } @@ -454,4 +460,72 @@ public abstract class KineticTileEntity extends SmartTileEntity return overStressed; } + // Custom Propagation + + /** + * Specify ratio of transferred rotation from this kinetic component to a + * specific other. + * + * @param target other Kinetic TE to transfer to + * @param stateFrom this TE's blockstate + * @param stateTo other TE's blockstate + * @param diff difference in position (to.pos - from.pos) + * @param connectedViaAxes whether these kinetic blocks are connected via mutual + * IRotate.hasShaftTowards() + * @param connectedViaCogs whether these kinetic blocks are connected via mutual + * IRotate.hasIntegratedCogwheel() + * @return factor of rotation speed from this TE to other. 0 if no rotation is + * transferred, or the standard rules apply (integrated shafts/cogs) + */ + public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff, + boolean connectedViaAxes, boolean connectedViaCogs) { + return 0; + } + + /** + * Specify additional locations the rotation propagator should look for + * potentially connected components. Neighbour list contains offset positions in + * all 6 directions by default. + * + * @param block + * @param state + * @param neighbours + * @return + */ + public List addPropagationLocations(IRotate block, BlockState state, List neighbours) { + if (!canPropagateDiagonally(block, state)) + return neighbours; + + Axis axis = block.getRotationAxis(state); + BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)) + .forEach(offset -> { + if (axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0) + return; + if (offset.distanceSq(0, 0, 0, false) != BlockPos.ZERO.distanceSq(1, 1, 0, false)) + return; + neighbours.add(pos.add(offset)); + }); + return neighbours; + } + + /** + * Specify whether this component can propagate speed to the other in any + * circumstance. Shaft and cogwheel connections are already handled by internal + * logic. Does not have to be specified on both ends, it is assumed that this + * relation is symmetrical. + * + * @param other + * @param state + * @param otherState + * @return true if this and the other component should check their propagation + * factor and are not already connected via integrated cogs or shafts + */ + public boolean isCustomConnection(KineticTileEntity other, BlockState state, BlockState otherState) { + return false; + } + + protected boolean canPropagateDiagonally(IRotate block, BlockState state) { + return block.hasIntegratedCogwheel(world, pos, state); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java index 3f912e71e..27e3107b7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.fan; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; +import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; @@ -57,9 +58,9 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE boolean matchStaticFilters(IRecipe r) { return ((r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS - && AllConfigs.SERVER.recipes.allowShapelessInMixer.get()) || r.getType() == AllRecipeTypes.MIXING.type); + && AllConfigs.SERVER.recipes.allowShapelessInMixer.get() && r.getIngredients() + .size() > 1) + || r.getType() == AllRecipeTypes.MIXING.type); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java index 79d4268b9..1f0168b87 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java @@ -27,8 +27,8 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity { super.addBehaviours(behaviours); Integer max = AllConfigs.SERVER.kinetics.maxMotorSpeed.get(); - CenteredSideValueBoxTransform slot = - new CenteredSideValueBoxTransform((motor, side) -> motor.get(CreativeMotorBlock.FACING) == side.getOpposite()); + CenteredSideValueBoxTransform slot = new CenteredSideValueBoxTransform( + (motor, side) -> motor.get(CreativeMotorBlock.FACING) == side.getOpposite()); generatedSpeed = new ScrollValueBehaviour(Lang.translate("generic.speed"), this, slot); generatedSpeed.between(-max, max); @@ -55,20 +55,21 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity { } public static int step(StepContext context) { - if (context.shift) - return 1; - int current = context.currentValue; - int magnitude = Math.abs(current) - (context.forward == current > 0 ? 0 : 1); int step = 1; - if (magnitude >= 4) - step *= 4; - if (magnitude >= 32) - step *= 4; - if (magnitude >= 128) - step *= 4; - return step; + if (!context.shift) { + int magnitude = Math.abs(current) - (context.forward == current > 0 ? 0 : 1); + + if (magnitude >= 4) + step *= 4; + if (magnitude >= 32) + step *= 4; + if (magnitude >= 128) + step *= 4; + } + + return (int) (current + (context.forward ? step : -step) == 0 ? step + 1 : step); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index a161df9d8..6ab63b12f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -93,8 +93,9 @@ public class SawRenderer extends SafeTileEntityRenderer { boolean moving = te.inventory.recipeDuration != 0; float offset = moving ? (float) (te.inventory.remainingTime) / te.inventory.recipeDuration : 0; + float processingSpeed = MathHelper.clamp(Math.abs(te.getSpeed()) / 32, 1, 128); if (moving) - offset = MathHelper.clamp(offset + (-partialTicks + .5f) / te.inventory.recipeDuration, 0, 1); + offset = MathHelper.clamp(offset + ((-partialTicks + .5f) * processingSpeed) / te.inventory.recipeDuration, 0, 1); if (te.getSpeed() == 0) offset = .5f; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index 84b7f8b64..c863f4372 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -73,6 +73,10 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return; contraption.onEntityCreated(this); } + + public boolean supportsTerrainCollision() { + return contraption instanceof TranslatingContraption; + } protected void contraptionInitialize() { contraption.onEntityInitialize(world, this); @@ -594,7 +598,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } public static class ContraptionRotationState { - static final ContraptionRotationState NONE = new ContraptionRotationState(); + public static final ContraptionRotationState NONE = new ContraptionRotationState(); float xRotation = 0; float yRotation = 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index 54438be96..f6b9ad44d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -46,7 +46,9 @@ public abstract class AbstractContraptionEntityRenderer factory; - String id; - - private AllContraptionTypes(Supplier factory) { - this.factory = factory; - id = Lang.asId(name()); - } - - public static Contraption fromType(String type) { - for (AllContraptionTypes allContraptionTypes : values()) - if (type.equals(allContraptionTypes.id)) - return allContraptionTypes.factory.get(); - return null; - } - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 2f6c162b0..67d6b929d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -30,6 +30,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; @@ -40,6 +41,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pul import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock.RopeBlock; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; @@ -136,7 +138,7 @@ public abstract class Contraption { protected abstract boolean canAxisBeStabilized(Axis axis); - protected abstract AllContraptionTypes getType(); + protected abstract ContraptionType getType(); protected boolean customBlockPlacement(IWorld world, BlockPos pos, BlockState state) { return false; @@ -153,7 +155,7 @@ public abstract class Contraption { public static Contraption fromNBT(World world, CompoundNBT nbt, boolean spawnData) { String type = nbt.getString("Type"); - Contraption contraption = AllContraptionTypes.fromType(type); + Contraption contraption = ContraptionType.fromType(type); contraption.readNBT(world, nbt, spawnData); return contraption; } @@ -264,6 +266,26 @@ public abstract class Contraption { if (AllBlocks.BELT.has(state)) moveBelt(pos, frontier, visited, state); + if (AllBlocks.GANTRY_PINION.has(state)) { + BlockPos offset = pos.offset(state.get(GantryPinionBlock.FACING)); + if (!visited.contains(offset)) + frontier.add(offset); + } + + if (AllBlocks.GANTRY_SHAFT.has(state)) + for (Direction d : Iterate.directions) { + BlockPos offset = pos.offset(d); + if (!visited.contains(offset)) { + BlockState offsetState = world.getBlockState(offset); + Direction facing = state.get(GantryShaftBlock.FACING); + if (d.getAxis() == facing.getAxis() && AllBlocks.GANTRY_SHAFT.has(offsetState) + && offsetState.get(GantryShaftBlock.FACING) == facing) + frontier.add(offset); + else if (AllBlocks.GANTRY_PINION.has(offsetState) && offsetState.get(GantryPinionBlock.FACING) == d) + frontier.add(offset); + } + } + // Bearings potentially create stabilized sub-contraptions if (AllBlocks.MECHANICAL_BEARING.has(state)) moveBearing(pos, frontier, visited, state); @@ -726,7 +748,8 @@ public abstract class Contraption { if (brittles != BlockMovementTraits.isBrittle(block.state)) continue; - BlockPos add = block.pos.add(anchor).add(offset); + BlockPos add = block.pos.add(anchor) + .add(offset); if (customBlockRemoval(world, add, block.state)) continue; BlockState oldState = world.getBlockState(add); @@ -735,7 +758,8 @@ public abstract class Contraption { iterator.remove(); world.getWorld() .removeTileEntity(add); - int flags = BlockFlags.IS_MOVING | BlockFlags.NO_NEIGHBOR_DROPS | BlockFlags.UPDATE_NEIGHBORS; + int flags = BlockFlags.IS_MOVING | BlockFlags.NO_NEIGHBOR_DROPS | BlockFlags.UPDATE_NEIGHBORS + | BlockFlags.BLOCK_UPDATE; if (blockIn instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) && oldState.get(BlockStateProperties.WATERLOGGED) .booleanValue()) { @@ -746,8 +770,12 @@ public abstract class Contraption { } } for (BlockInfo block : blocks.values()) { - BlockPos add = block.pos.add(anchor).add(offset); - world.markAndNotifyBlock(add, null, block.state, Blocks.AIR.getDefaultState(), BlockFlags.IS_MOVING | BlockFlags.DEFAULT); + BlockPos add = block.pos.add(anchor) + .add(offset); + if (!shouldUpdateAfterMovement(block)) + continue; + world.markAndNotifyBlock(add, null, block.state, Blocks.AIR.getDefaultState(), + BlockFlags.IS_MOVING | BlockFlags.DEFAULT); } } @@ -826,6 +854,13 @@ public abstract class Contraption { } } } + for (BlockInfo block : blocks.values()) { + BlockPos targetPos = transform.apply(block.pos); + if (!shouldUpdateAfterMovement(block)) + continue; + world.markAndNotifyBlock(targetPos, null, block.state, block.state, + BlockFlags.IS_MOVING | BlockFlags.DEFAULT); + } for (int i = 0; i < inventory.getSlots(); i++) inventory.setStackInSlot(i, ItemStack.EMPTY); @@ -884,6 +919,10 @@ public abstract class Contraption { callBack.accept(AllMovementBehaviours.of(pair.getLeft().state), pair.getRight()); } + protected boolean shouldUpdateAfterMovement(BlockInfo info) { + return true; + } + public void expandBoundsAroundAxis(Axis axis) { AxisAlignedBB bb = bounds; double maxXDiff = Math.max(bb.maxX - 1, -bb.minX); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java index d3ffcca36..4f8e5f812 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java @@ -348,7 +348,7 @@ public class ContraptionCollider { return potentialHits; } - public static boolean collideBlocks(ControlledContraptionEntity contraptionEntity) { + public static boolean collideBlocks(AbstractContraptionEntity contraptionEntity) { if (!contraptionEntity.supportsTerrainCollision()) return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionType.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionType.java new file mode 100644 index 000000000..5ddf9e9bf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionType.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.components.structureMovement; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Supplier; + +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MountedContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyContraption; + +public class ContraptionType { + + public static Map entries = new HashMap<>(); + public static ContraptionType + PISTON = register("piston", PistonContraption::new), + BEARING = register("bearing", BearingContraption::new), + PULLEY = register("pulley", PulleyContraption::new), + CLOCKWORK = register("clockwork", ClockworkContraption::new), + MOUNTED = register("mounted", MountedContraption::new), + STABILIZED = register("stabilized", StabilizedContraption::new), + GANTRY = register("gantry", GantryContraption::new); + + Supplier factory; + String id; + + public static ContraptionType register(String id, Supplier factory) { + ContraptionType value = new ContraptionType(id, factory); + entries.put(id, value); + return value; + } + + private ContraptionType(String id, Supplier factory) { + this.factory = factory; + this.id = id; + } + + public static Contraption fromType(String type) { + for (Entry allContraptionTypes : entries.entrySet()) + if (type.equals(allContraptionTypes.getKey())) + return allContraptionTypes.getValue().factory.get(); + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java index cc3496b24..5ef894acb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java @@ -46,10 +46,6 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { return entity; } - public boolean supportsTerrainCollision() { - return contraption instanceof TranslatingContraption; - } - @Override public Vec3d getContactPointMotion(Vec3d globalContactPoint) { if (contraption instanceof TranslatingContraption) @@ -151,8 +147,6 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { } Vec3d motion = getMotion(); - if (motion.length() < 1 / 4098f) - setMotion(Vec3d.ZERO); move(motion.x, motion.y, motion.z); if (ContraptionCollider.collideBlocks(this)) getController().collided(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java index 135996fb4..1709ae7d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java @@ -120,7 +120,7 @@ public class MountedFluidStorage { return; SmartFluidTank inv = (SmartFluidTank) teHandler; - inv.setFluid(tank.getFluid()); + inv.setFluid(tank.getFluid().copy()); } public IFluidHandler getFluidHandler() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java index 801cdee3b..cf77d0a14 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java @@ -13,7 +13,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.mou import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MountedContraption; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; -import com.simibubi.create.foundation.entity.CreateDataSerializers; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Couple; @@ -54,8 +53,8 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { private static final DataParameter> COUPLING = EntityDataManager.createKey(OrientedContraptionEntity.class, DataSerializers.OPTIONAL_UNIQUE_ID); - private static final DataParameter> INITIAL_ORIENTATION = - EntityDataManager.createKey(OrientedContraptionEntity.class, CreateDataSerializers.OPTIONAL_DIRECTION); + private static final DataParameter INITIAL_ORIENTATION = + EntityDataManager.createKey(OrientedContraptionEntity.class, DataSerializers.DIRECTION); protected Vec3d motionBeforeStall; protected boolean forceAngle; @@ -92,15 +91,15 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { } public void setInitialOrientation(Direction direction) { - dataManager.set(INITIAL_ORIENTATION, Optional.of(direction)); + dataManager.set(INITIAL_ORIENTATION, direction); } - public Optional getInitialOrientation() { + public Direction getInitialOrientation() { return dataManager.get(INITIAL_ORIENTATION); } public void deferOrientation(Direction newInitialAngle) { - dataManager.set(INITIAL_ORIENTATION, Optional.empty()); + dataManager.set(INITIAL_ORIENTATION, Direction.UP); yaw = initialYawOffset = newInitialAngle.getHorizontalAngle(); } @@ -110,8 +109,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { } public float getInitialYaw() { - return dataManager.get(INITIAL_ORIENTATION) - .orElse(Direction.SOUTH) + return (isInitialOrientationPresent() ? dataManager.get(INITIAL_ORIENTATION) : Direction.SOUTH) .getHorizontalAngle(); } @@ -119,7 +117,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { protected void registerData() { super.registerData(); dataManager.register(COUPLING, Optional.empty()); - dataManager.register(INITIAL_ORIENTATION, Optional.empty()); + dataManager.register(INITIAL_ORIENTATION, Direction.UP); } @Override @@ -177,9 +175,10 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { compound.put("CachedMotion", newDoubleNBTList(motionBeforeStall.x, motionBeforeStall.y, motionBeforeStall.z)); - Optional optional = dataManager.get(INITIAL_ORIENTATION); - if (optional.isPresent()) - NBTHelper.writeEnum(compound, "InitialOrientation", optional.get()); + Direction optional = dataManager.get(INITIAL_ORIENTATION); + if (optional.getAxis() + .isHorizontal()) + NBTHelper.writeEnum(compound, "InitialOrientation", optional); if (forceAngle) { compound.putFloat("ForceYaw", yaw); forceAngle = false; @@ -195,11 +194,16 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { @Override public void notifyDataManagerChange(DataParameter key) { super.notifyDataManagerChange(key); - if (key == INITIAL_ORIENTATION && dataManager.get(INITIAL_ORIENTATION) - .isPresent()) + if (key == INITIAL_ORIENTATION && isInitialOrientationPresent()) startAtInitialYaw(); } + public boolean isInitialOrientationPresent() { + return dataManager.get(INITIAL_ORIENTATION) + .getAxis() + .isHorizontal(); + } + public void startAtInitialYaw() { startAtYaw(getInitialYaw()); } @@ -343,6 +347,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { return false; } + prevYaw = yaw; if (wasStalled) return false; @@ -353,8 +358,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { movementVector = getPositionVec().subtract(prevPosX, prevPosY, prevPosZ); Vec3d motion = movementVector.normalize(); - if (!dataManager.get(INITIAL_ORIENTATION) - .isPresent() && !world.isRemote) { + if (!isInitialOrientationPresent() && !world.isRemote) { if (motion.length() > 0) { Direction facingFromVector = Direction.getFacingFromVector(motion.x, motion.y, motion.z); if (initialYawOffset != -1) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java index 78604cfb8..bbef43c57 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java @@ -22,7 +22,7 @@ public class OrientedContraptionEntityRenderer extends AbstractContraptionEntity if (!super.shouldRender(entity, p_225626_2_, p_225626_3_, p_225626_5_, p_225626_7_)) return false; if (entity.getContraption() - .getType() == AllContraptionTypes.MOUNTED && entity.getRidingEntity() == null) + .getType() == ContraptionType.MOUNTED && entity.getRidingEntity() == null) return false; return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java index 7e473df3b..82d1f89ce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java @@ -17,7 +17,7 @@ public abstract class TranslatingContraption extends Contraption { public Set getColliders(World world, Direction movementDirection) { if (getBlocks() == null) - return Collections.EMPTY_SET; + return Collections.emptySet(); if (cachedColliders == null || cachedColliderDirection != movementDirection) { cachedColliders = new HashSet<>(); cachedColliderDirection = movementDirection; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 76db5bd8b..fc99cd432 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllTags.AllBlockTags; -import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import net.minecraft.nbt.CompoundNBT; @@ -43,8 +43,8 @@ public class BearingContraption extends Contraption { } @Override - protected AllContraptionTypes getType() { - return AllContraptionTypes.BEARING; + protected ContraptionType getType() { + return ContraptionType.BEARING; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java index 31b7709f3..94f889bd3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java @@ -6,7 +6,7 @@ import java.util.Set; import org.apache.commons.lang3.tuple.Pair; -import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.utility.NBTHelper; @@ -24,8 +24,8 @@ public class ClockworkContraption extends Contraption { private Set ignoreBlocks = new HashSet<>(); @Override - protected AllContraptionTypes getType() { - return AllContraptionTypes.CLOCKWORK; + protected ContraptionType getType() { + return ContraptionType.CLOCKWORK; } private void ignoreBlocks(Set blocks, BlockPos anchor) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 598c84a12..35df5d517 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -1,7 +1,5 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import java.util.Optional; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; @@ -55,8 +53,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { if (axis.isVertical()) offset = -orientedCE.getYaw(renderPartialTicks); else { - Optional initialOrientation = orientedCE.getInitialOrientation(); - if (initialOrientation.isPresent() && initialOrientation.get() + if (orientedCE.isInitialOrientationPresent() && orientedCE.getInitialOrientation() .getAxis() == axis) offset = -orientedCE.getPitch(renderPartialTicks); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index f54d09beb..15f8b40d7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import net.minecraft.nbt.CompoundNBT; @@ -37,8 +37,8 @@ public class StabilizedContraption extends Contraption { } @Override - protected AllContraptionTypes getType() { - return AllContraptionTypes.STABILIZED; + protected ContraptionType getType() { + return ContraptionType.STABILIZED; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java index 2fef5b324..e79f652eb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java @@ -26,6 +26,13 @@ public class WindmillBearingTileEntity extends MechanicalBearingTileEntity { super.updateGeneratedRotation(); lastGeneratedSpeed = getGeneratedSpeed(); } + + @Override + public void onSpeedChanged(float prevSpeed) { + boolean cancelAssembly = assembleNextTick; + super.onSpeedChanged(prevSpeed); + assembleNextTick = cancelAssembly; + } @Override public float getGeneratedSpeed() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java new file mode 100644 index 000000000..58ddcadcb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java @@ -0,0 +1,63 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; +import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.template.Template.BlockInfo; + +public class GantryContraption extends TranslatingContraption { + + protected Direction facing; + + public GantryContraption() {} + + public GantryContraption(Direction facing) { + this.facing = facing; + } + + @Override + public boolean assemble(World world, BlockPos pos) { + if (!searchMovedStructure(world, pos, null)) + return false; + startMoving(world); + return true; + } + + @Override + public CompoundNBT writeNBT(boolean spawnPacket) { + CompoundNBT tag = super.writeNBT(spawnPacket); + tag.putInt("Facing", facing.getIndex()); + return tag; + } + + @Override + public void readNBT(World world, CompoundNBT tag, boolean spawnData) { + facing = Direction.byIndex(tag.getInt("Facing")); + super.readNBT(world, tag, spawnData); + } + + @Override + protected boolean isAnchoringBlockAt(BlockPos pos) { + return super.isAnchoringBlockAt(pos.offset(facing)); + } + + @Override + protected ContraptionType getType() { + return ContraptionType.GANTRY; + } + + public Direction getFacing() { + return facing; + } + + @Override + protected boolean shouldUpdateAfterMovement(BlockInfo info) { + return super.shouldUpdateAfterMovement(info) && !AllBlocks.GANTRY_PINION.has(info.state); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java new file mode 100644 index 000000000..ac2aacbc7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java @@ -0,0 +1,203 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider; +import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.ServerSpeedProvider; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.network.PacketDistributor; + +public class GantryContraptionEntity extends AbstractContraptionEntity { + + Direction movementAxis; + double clientOffsetDiff; + double axisMotion; + + public GantryContraptionEntity(EntityType entityTypeIn, World worldIn) { + super(entityTypeIn, worldIn); + } + + public static GantryContraptionEntity create(World world, Contraption contraption, Direction movementAxis) { + GantryContraptionEntity entity = new GantryContraptionEntity(AllEntityTypes.GANTRY_CONTRAPTION.get(), world); + entity.setContraption(contraption); + entity.movementAxis = movementAxis; + return entity; + } + + @Override + protected void tickContraption() { + if (!(contraption instanceof GantryContraption)) + return; + + double prevAxisMotion = axisMotion; + if (world.isRemote) { + clientOffsetDiff *= .75f; + updateClientMotion(); + } + + checkPinionShaft(); + tickActors(); + Vec3d movementVec = getMotion(); + + if (ContraptionCollider.collideBlocks(this)) { + if (!world.isRemote) + disassemble(); + return; + } + + if (!isStalled() && ticksExisted > 2) + move(movementVec.x, movementVec.y, movementVec.z); + + if (!world.isRemote && (prevAxisMotion != axisMotion || ticksExisted % 3 == 0)) + sendPacket(); + } + + protected void checkPinionShaft() { + Vec3d movementVec; + Direction facing = ((GantryContraption) contraption).getFacing(); + Vec3d currentPosition = getAnchorVec().add(.5, .5, .5); + BlockPos gantryShaftPos = new BlockPos(currentPosition).offset(facing.getOpposite()); + + TileEntity te = world.getTileEntity(gantryShaftPos); + if (!(te instanceof GantryShaftTileEntity) || !AllBlocks.GANTRY_SHAFT.has(te.getBlockState())) { + if (!world.isRemote) { + setContraptionMotion(Vec3d.ZERO); + disassemble(); + } + return; + } + + BlockState blockState = te.getBlockState(); + Direction direction = blockState.get(GantryShaftBlock.FACING); + GantryShaftTileEntity gantryShaftTileEntity = (GantryShaftTileEntity) te; + + float pinionMovementSpeed = gantryShaftTileEntity.getPinionMovementSpeed(); + movementVec = new Vec3d(direction.getDirectionVec()).scale(pinionMovementSpeed); + + if (blockState.get(GantryShaftBlock.POWERED) || pinionMovementSpeed == 0) { + setContraptionMotion(Vec3d.ZERO); + if (!world.isRemote) + disassemble(); + return; + } + + Vec3d nextPosition = currentPosition.add(movementVec); + double currentCoord = direction.getAxis() + .getCoordinate(currentPosition.x, currentPosition.y, currentPosition.z); + double nextCoord = direction.getAxis() + .getCoordinate(nextPosition.x, nextPosition.y, nextPosition.z); + + if ((MathHelper.floor(currentCoord) + .5f < nextCoord != (pinionMovementSpeed * direction.getAxisDirection() + .getOffset() < 0))) + if (!gantryShaftTileEntity.canAssembleOn()) { + setContraptionMotion(Vec3d.ZERO); + if (!world.isRemote) + disassemble(); + return; + } + + if (world.isRemote) + return; + + axisMotion = pinionMovementSpeed; + setContraptionMotion(movementVec); + } + + @Override + protected void writeAdditional(CompoundNBT compound, boolean spawnPacket) { + NBTHelper.writeEnum(compound, "GantryAxis", movementAxis); + super.writeAdditional(compound, spawnPacket); + } + + protected void readAdditional(CompoundNBT compound, boolean spawnData) { + movementAxis = NBTHelper.readEnum(compound, "GantryAxis", Direction.class); + super.readAdditional(compound, spawnData); + } + + @Override + public Vec3d applyRotation(Vec3d localPos, float partialTicks) { + return localPos; + } + + @Override + public Vec3d reverseRotation(Vec3d localPos, float partialTicks) { + return localPos; + } + + @Override + protected StructureTransform makeStructureTransform() { + return new StructureTransform(new BlockPos(getAnchorVec().add(.5, .5, .5)), 0, 0, 0); + } + + @Override + protected float getStalledAngle() { + return 0; + } + + @Override + public void setPositionAndUpdate(double p_70634_1_, double p_70634_3_, double p_70634_5_) {} + + @Override + @OnlyIn(Dist.CLIENT) + public void setPositionAndRotationDirect(double x, double y, double z, float yw, float pt, int inc, boolean t) {} + + @Override + protected void handleStallInformation(float x, float y, float z, float angle) { + setPos(x, y, z); + clientOffsetDiff = 0; + } + + @Override + public ContraptionRotationState getRotationState() { + return ContraptionRotationState.NONE; + } + + public void updateClientMotion() { + float modifier = movementAxis.getAxisDirection() + .getOffset(); + setContraptionMotion(new Vec3d(movementAxis.getDirectionVec()) + .scale((axisMotion + clientOffsetDiff * modifier / 2f) * ServerSpeedProvider.get())); + } + + public double getAxisCoord() { + Vec3d anchorVec = getAnchorVec(); + return movementAxis.getAxis() + .getCoordinate(anchorVec.x, anchorVec.y, anchorVec.z); + } + + public void sendPacket() { + AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), + new GantryContraptionUpdatePacket(getEntityId(), getAxisCoord(), axisMotion)); + } + + @OnlyIn(Dist.CLIENT) + public static void handlePacket(GantryContraptionUpdatePacket packet) { + Entity entity = Minecraft.getInstance().world.getEntityByID(packet.entityID); + if (!(entity instanceof GantryContraptionEntity)) + return; + GantryContraptionEntity ce = (GantryContraptionEntity) entity; + ce.axisMotion = packet.motion; + ce.clientOffsetDiff = packet.coord - ce.getAxisCoord(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntityRenderer.java new file mode 100644 index 000000000..b7eafa361 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntityRenderer.java @@ -0,0 +1,18 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; + +import net.minecraft.client.renderer.entity.EntityRendererManager; + +public class GantryContraptionEntityRenderer extends AbstractContraptionEntityRenderer { + + public GantryContraptionEntityRenderer(EntityRendererManager p_i46179_1_) { + super(p_i46179_1_); + } + + @Override + protected void transform(GantryContraptionEntity contraptionEntity, float partialTicks, + MatrixStack[] matrixStacks) {} + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionUpdatePacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionUpdatePacket.java new file mode 100644 index 000000000..1e0637497 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionUpdatePacket.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import java.util.function.Supplier; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class GantryContraptionUpdatePacket extends SimplePacketBase { + + int entityID; + double coord; + double motion; + + public GantryContraptionUpdatePacket(int entityID, double coord, double motion) { + this.entityID = entityID; + this.coord = coord; + this.motion = motion; + } + + public GantryContraptionUpdatePacket(PacketBuffer buffer) { + entityID = buffer.readInt(); + coord = buffer.readFloat(); + motion = buffer.readFloat(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeInt(entityID); + buffer.writeFloat((float) coord); + buffer.writeFloat((float) motion); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork( + () -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> GantryContraptionEntity.handlePacket(this))); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionBlock.java new file mode 100644 index 000000000..5f8874bcf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionBlock.java @@ -0,0 +1,121 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; +import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; + +public class GantryPinionBlock extends DirectionalAxisKineticBlock implements ITE { + + public GantryPinionBlock(Properties properties) { + super(properties); + } + + @Override + public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + Direction direction = state.get(FACING); + BlockState shaft = world.getBlockState(pos.offset(direction.getOpposite())); + return AllBlocks.GANTRY_SHAFT.has(shaft) && shaft.get(GantryShaftBlock.FACING) + .getAxis() != direction.getAxis(); + } + + @Override + public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { + super.onBlockAdded(state, worldIn, pos, oldState, isMoving); + withTileEntityDo(worldIn, pos, GantryPinionTileEntity::checkValidGantryShaft); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.GANTRY_PINION.create(); + } + + @Override + protected Direction getFacingForPlacement(BlockItemUseContext context) { + return context.getFace(); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + BlockState stateForPlacement = super.getStateForPlacement(context); + Direction opposite = stateForPlacement.get(FACING) + .getOpposite(); + return cycleAxisIfNecessary(stateForPlacement, opposite, context.getWorld() + .getBlockState(context.getPos() + .offset(opposite))); + } + + @Override + public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_, + boolean p_220069_6_) { + if (!isValidPosition(state, world, pos)) + world.destroyBlock(pos, true); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState otherState, IWorld world, + BlockPos pos, BlockPos p_196271_6_) { + if (state.get(FACING) != direction.getOpposite()) + return state; + return cycleAxisIfNecessary(state, direction, otherState); + } + + protected BlockState cycleAxisIfNecessary(BlockState state, Direction direction, BlockState otherState) { + if (!AllBlocks.GANTRY_SHAFT.has(otherState)) + return state; + if (otherState.get(GantryShaftBlock.FACING) + .getAxis() == direction.getAxis()) + return state; + if (isValidGantryShaftAxis(state, otherState)) + return state; + return state.cycle(AXIS_ALONG_FIRST_COORDINATE); + } + + public static boolean isValidGantryShaftAxis(BlockState pinionState, BlockState gantryState) { + return getValidGantryShaftAxis(pinionState) == gantryState.get(GantryShaftBlock.FACING) + .getAxis(); + } + + public static Axis getValidGantryShaftAxis(BlockState state) { + if (!(state.getBlock() instanceof GantryPinionBlock)) + return Axis.Y; + IRotate block = (IRotate) state.getBlock(); + Axis rotationAxis = block.getRotationAxis(state); + Axis facingAxis = state.get(FACING) + .getAxis(); + for (Axis axis : Iterate.axes) + if (axis != rotationAxis && axis != facingAxis) + return axis; + return Axis.Y; + } + + public static Axis getValidGantryPinionAxis(BlockState state, Axis shaftAxis) { + Axis facingAxis = state.get(FACING) + .getAxis(); + for (Axis axis : Iterate.axes) + if (axis != shaftAxis && axis != facingAxis) + return axis; + return Axis.Y; + } + + @Override + public Class getTileEntityClass() { + return GantryPinionTileEntity.class; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java new file mode 100644 index 000000000..86a498d12 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java @@ -0,0 +1,78 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.BlockPos; + +public class GantryPinionRenderer extends KineticTileEntityRenderer { + + public GantryPinionRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + BlockState state = te.getBlockState(); + Direction facing = state.get(GantryPinionBlock.FACING); + Boolean alongFirst = state.get(GantryPinionBlock.AXIS_ALONG_FIRST_COORDINATE); + Axis rotationAxis = getRotationAxisOf(te); + BlockPos visualPos = facing.getAxisDirection() == AxisDirection.POSITIVE ? te.getPos() + : te.getPos() + .offset(facing.getOpposite()); + float angleForTe = getAngleForTe(te, visualPos, rotationAxis); + + Axis gantryAxis = Axis.X; + for (Axis axis : Iterate.axes) + if (axis != rotationAxis && axis != facing.getAxis()) + gantryAxis = axis; + + if (gantryAxis == Axis.Z) + if (facing == Direction.DOWN) + angleForTe *= -1; + if (gantryAxis == Axis.Y) + if (facing == Direction.NORTH || facing == Direction.EAST) + angleForTe *= -1; + + ms.push(); + + MatrixStacker msr = MatrixStacker.of(ms); + + msr.centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0); + + ms.translate(0, -9 / 16f, 0); + ms.multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe / 2f)); + ms.translate(0, 9 / 16f, 0); + + msr.unCentre(); + AllBlockPartials.GANTRY_COGS.renderOn(state) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + + ms.pop(); + } + + @Override + protected BlockState getRenderedBlockState(KineticTileEntity te) { + return shaft(getRotationAxisOf(te)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java new file mode 100644 index 000000000..3c2b6f437 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java @@ -0,0 +1,138 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import static net.minecraft.state.properties.BlockStateProperties.FACING; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; +import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; + +public class GantryPinionTileEntity extends KineticTileEntity { + + boolean assembleNextTick; + + public GantryPinionTileEntity(TileEntityType typeIn) { + super(typeIn); + } + + @Override + public void onSpeedChanged(float previousSpeed) { + super.onSpeedChanged(previousSpeed); + } + + public void checkValidGantryShaft() { + if (shouldAssemble()) + queueAssembly(); + } + + public void queueAssembly() { + assembleNextTick = true; + } + + @Override + public void tick() { + super.tick(); + + if (world.isRemote) + return; + + if (assembleNextTick) { + tryAssemble(); + assembleNextTick = false; + } + } + + private void tryAssemble() { + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof GantryPinionBlock)) + return; + + Direction direction = blockState.get(FACING); + GantryContraption contraption = new GantryContraption(direction); + + TileEntity shaftTe = world.getTileEntity(pos.offset(direction.getOpposite())); + if (!(shaftTe instanceof GantryShaftTileEntity)) + return; + BlockState shaftState = shaftTe.getBlockState(); + if (!AllBlocks.GANTRY_SHAFT.has(shaftState)) + return; + + float pinionMovementSpeed = ((GantryShaftTileEntity) shaftTe).getPinionMovementSpeed(); + Direction shaftOrientation = shaftState.get(GantryShaftBlock.FACING); + Direction movementDirection = shaftOrientation; + if (pinionMovementSpeed < 0) + movementDirection = movementDirection.getOpposite(); + + if (!contraption.assemble(world, pos)) + return; + if (ContraptionCollider.isCollidingWithWorld(world, contraption, pos.offset(movementDirection), + movementDirection)) + return; + + contraption.removeBlocksFromWorld(world, BlockPos.ZERO); + GantryContraptionEntity movedContraption = + GantryContraptionEntity.create(world, contraption, shaftOrientation); + BlockPos anchor = pos; + movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + world.addEntity(movedContraption); + } + + @Override + public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff, + boolean connectedViaAxes, boolean connectedViaCogs) { + float defaultModifier = + super.propagateRotationTo(target, stateFrom, stateTo, diff, connectedViaAxes, connectedViaCogs); + + if (connectedViaAxes) + return defaultModifier; + if (!AllBlocks.GANTRY_SHAFT.has(stateTo)) + return defaultModifier; + if (!stateTo.get(GantryShaftBlock.POWERED)) + return defaultModifier; + + Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); + if (stateFrom.get(GantryPinionBlock.FACING) != direction.getOpposite()) + return defaultModifier; + return getGantryPinionModifier(stateTo.get(GantryShaftBlock.FACING), stateFrom.get(GantryPinionBlock.FACING)); + } + + public static float getGantryPinionModifier(Direction shaft, Direction pinionDirection) { + Axis shaftAxis = shaft.getAxis(); + float directionModifier = shaft.getAxisDirection() + .getOffset(); + if (shaftAxis == Axis.Y) + if (pinionDirection == Direction.NORTH || pinionDirection == Direction.EAST) + return -directionModifier; + if (shaftAxis == Axis.X) + if (pinionDirection == Direction.DOWN || pinionDirection == Direction.SOUTH) + return -directionModifier; + if (shaftAxis == Axis.Z) + if (pinionDirection == Direction.UP || pinionDirection == Direction.WEST) + return -directionModifier; + return directionModifier; + } + + private boolean shouldAssemble() { + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof GantryPinionBlock)) + return false; + Direction facing = blockState.get(GantryPinionBlock.FACING) + .getOpposite(); + BlockState shaftState = world.getBlockState(pos.offset(facing)); + if (!(shaftState.getBlock() instanceof GantryShaftBlock)) + return false; + if (shaftState.get(GantryShaftBlock.POWERED)) + return false; + TileEntity te = world.getTileEntity(pos.offset(facing)); + return te instanceof GantryShaftTileEntity && ((GantryShaftTileEntity) te).canAssembleOn(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 294a0582a..f677487af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.BlockFace; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -272,9 +273,9 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (ray.getType() == Type.MISS) return; BlockRayTraceResult blockRay = (BlockRayTraceResult) ray; - if (!blockRay.getPos() - .offset(blockRay.getFace()) - .equals(getHangingPosition())) + BlockFace rayFace = new BlockFace(blockRay.getPos(), blockRay.getFace()); + BlockFace hangingFace = new BlockFace(getHangingPosition(), getFacingDirection().getOpposite()); + if (!rayFace.isEquivalent(hangingFace)) return; for (Hand handIn : Hand.values()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java index 54f1df414..34190f8b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java @@ -63,6 +63,8 @@ public class SuperGlueHandler { ItemStack itemstack = placer.getHeldItemOffhand(); if (!AllItems.SUPER_GLUE.isIn(itemstack)) return; + if (AllItems.WRENCH.isIn(placer.getHeldItemMainhand())) + return; double distance = placer.getAttribute(PlayerEntity.REACH_DISTANCE) .getValue(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java index ca0487ad0..6c38f9c41 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java @@ -244,9 +244,8 @@ public class MinecartContraptionItem extends Item { tag.remove("Pos"); tag.remove("Motion"); - Optional initialOrientation = entity.getInitialOrientation(); - if (initialOrientation.isPresent()) - NBTHelper.writeEnum(tag, "InitialOrientation", initialOrientation.get()); + if (entity.isInitialOrientationPresent()) + NBTHelper.writeEnum(tag, "InitialOrientation", entity.getInitialOrientation()); stack.getOrCreateTag() .put("Contraption", tag); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index 3d6a28dd8..8386ae8f3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -7,7 +7,7 @@ import java.util.List; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; import com.simibubi.create.foundation.utility.Iterate; @@ -47,8 +47,8 @@ public class MountedContraption extends Contraption { } @Override - protected AllContraptionTypes getType() { - return AllContraptionTypes.MOUNTED; + protected ContraptionType getType() { + return ContraptionType.MOUNTED; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java index 603f5b5e6..c60e181a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java @@ -154,7 +154,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme compound.putBoolean("Waiting", waitingForSpeedChange); compound.putFloat("Offset", offset); super.write(compound, clientPacket); - + if (clientPacket && forceMove) { compound.putBoolean("ForceMovement", forceMove); forceMove = false; @@ -247,7 +247,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme } public float getMovementSpeed() { - float movementSpeed = getSpeed() / 512f + clientOffsetDiff / 2f; + float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f) + clientOffsetDiff / 2f; if (world.isRemote) movementSpeed *= ServerSpeedProvider.get(); return movementSpeed; @@ -283,7 +283,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme public boolean isAttachedTo(AbstractContraptionEntity contraption) { return movedContraption == contraption; } - + @Override public BlockPos getBlockPosition() { return pos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java index f84a04b97..a24d004fe 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java @@ -112,7 +112,7 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { @Override public float getMovementSpeed() { - float movementSpeed = getSpeed() / 512f; + float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f); if (world.isRemote) movementSpeed *= ServerSpeedProvider.get(); Direction pistonDirection = getBlockState().get(BlockStateProperties.FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java index 2895fb9bd..bcca6e574 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; -import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementTraits; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; @@ -38,8 +38,8 @@ public class PistonContraption extends TranslatingContraption { private boolean retract; @Override - protected AllContraptionTypes getType() { - return AllContraptionTypes.PISTON; + protected ContraptionType getType() { + return ContraptionType.PISTON; } public PistonContraption() {} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java index d4a48a889..d12cecad5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pulley; -import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; import net.minecraft.nbt.CompoundNBT; @@ -12,8 +12,8 @@ public class PulleyContraption extends TranslatingContraption { int initialOffset; @Override - protected AllContraptionTypes getType() { - return AllContraptionTypes.PULLEY; + protected ContraptionType getType() { + return ContraptionType.PULLEY; } public PulleyContraption() {} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java index 715b4c1e2..71a4b390f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java @@ -102,8 +102,11 @@ public class CapabilityMinecartController implements ICapabilitySerializable carts = loadedMinecartsByUUID.get(event.getWorld()); for (MinecartController minecartController : carts.values()) { + if (minecartController == null) + continue; if (!minecartController.isPresent()) continue; AbstractMinecartEntity cart = minecartController.cart(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index 74d8fa92d..3ee683b49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -174,6 +174,7 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { infinite = false; setValidationTimer(); frontier.add(new BlockPosEntry(root, 0)); + tileEntity.sendData(); } protected boolean checkValid(World world, BlockPos root) { @@ -322,6 +323,7 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { newValidationSet.clear(); validationFrontier.clear(); validationVisited.clear(); + tileEntity.sendData(); } public static BehaviourType TYPE = new BehaviourType<>(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java index efde52b6b..9447d5216 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java @@ -76,6 +76,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { if (!infinite) { reset(); infinite = true; + tileEntity.sendData(); } infinityCheckFrontier.clear(); setLongValidationTimer(); @@ -236,6 +237,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { queue.enqueue(new BlockPosEntry(root, 0)); infinite = false; setValidationTimer(); + tileEntity.sendData(); } enum SpaceType { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java index b53a36bff..436b111f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java @@ -4,6 +4,7 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.fluid.SmartFluidTank; +import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.ServerSpeedProvider; @@ -28,6 +29,8 @@ public class HosePulleyTileEntity extends KineticTileEntity { private LazyOptional capability; private FluidDrainingBehaviour drainer; private FluidFillingBehaviour filler; + private HosePulleyFluidHandler handler; + private boolean infinite; public HosePulleyTileEntity(TileEntityType typeIn) { super(typeIn); @@ -35,11 +38,25 @@ public class HosePulleyTileEntity extends KineticTileEntity { .startWithValue(0); isMoving = true; internalTank = new SmartFluidTank(1500, this::onTankContentsChanged); - IFluidHandler handler = new HosePulleyFluidHandler(internalTank, filler, drainer, + handler = new HosePulleyFluidHandler(internalTank, filler, drainer, () -> pos.down((int) Math.ceil(offset.getValue())), () -> !this.isMoving); capability = LazyOptional.of(() -> handler); } + @Override + public void sendData() { + infinite = filler.infinite || drainer.infinite; + super.sendData(); + } + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + boolean addToGoggleTooltip = super.addToGoggleTooltip(tooltip, isPlayerSneaking); + if (infinite) + TooltipHelper.addHint(tooltip, "hint.hose_pulley"); + return addToGoggleTooltip; + } + @Override public void addBehaviours(List behaviours) { drainer = new FluidDrainingBehaviour(this); @@ -59,10 +76,10 @@ public class HosePulleyTileEntity extends KineticTileEntity { offset.setValue(Math.round(offset.getValue())); isMoving = false; } - + if (isMoving) { float newOffset = offset.getValue() + getMovementSpeed(); - if (newOffset < 0) + if (newOffset < 0) isMoving = false; if (!world.getBlockState(pos.down((int) Math.ceil(newOffset))) .getMaterial() @@ -74,7 +91,7 @@ public class HosePulleyTileEntity extends KineticTileEntity { filler.reset(); } } - + super.onSpeedChanged(previousSpeed); } @@ -127,6 +144,8 @@ public class HosePulleyTileEntity extends KineticTileEntity { filler.reset(); return; } + + sendData(); } @Override @@ -134,6 +153,8 @@ public class HosePulleyTileEntity extends KineticTileEntity { compound.put("Offset", offset.writeNBT()); compound.put("Tank", internalTank.writeToNBT(new CompoundNBT())); super.write(compound, clientPacket); + if (clientPacket) + compound.putBoolean("Infinite", infinite); } @Override @@ -141,6 +162,8 @@ public class HosePulleyTileEntity extends KineticTileEntity { offset.readNBT(compound.getCompound("Offset"), clientPacket); internalTank.readFromNBT(compound.getCompound("Tank")); super.read(compound, clientPacket); + if (clientPacket) + infinite = compound.getBoolean("Infinite"); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index d6f0928d2..564ae6a33 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -118,7 +118,7 @@ public class SpoutTileEntity extends SmartTileEntity { .setFluid(fluid); sendSplash = true; notifyUpdate(); - return PASS; + return HOLD; } private FluidStack getCurrentFluidInTank() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java index 32ed3a75a..80e7a6349 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java @@ -99,6 +99,10 @@ public class BasinRecipe extends ProcessingRecipe { ItemStack extracted = availableItems.extractItem(slot, 1, true); if (!ingredient.test(extracted)) continue; + // Catalyst items are never consumed + if (extracted.hasContainerItem() && extracted.getContainerItem() + .isItemEqual(extracted)) + continue Ingredients; if (!simulate) availableItems.extractItem(slot, 1, false); else if (extracted.hasContainerItem()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 90ce7d1c0..c41a4f751 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -308,7 +308,7 @@ public class BasinTileEntity extends SmartTileEntity { : te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()) .orElse(null); boolean update = false; - + for (Iterator iterator = spoutputBuffer.iterator(); iterator.hasNext();) { ItemStack itemStack = iterator.next(); @@ -330,7 +330,7 @@ public class BasinTileEntity extends SmartTileEntity { iterator.remove(); visualizedOutputItems.add(IntAttached.withZero(itemStack)); } - + if (update) { notifyChangeOfContents(); sendData(); @@ -435,6 +435,11 @@ public class BasinTileEntity extends SmartTileEntity { if (targetInv == null && !outputItems.isEmpty()) return false; for (ItemStack itemStack : outputItems) { + // Catalyst items are never consumed + if (itemStack.hasContainerItem() && itemStack.getContainerItem() + .isItemEqual(itemStack)) + continue; + if (simulate || direction == Direction.DOWN) { if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), simulate) .isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java index 4f91a76bb..c19b07dd3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java @@ -216,6 +216,16 @@ public class BlazeBurnerBlock extends Block implements ITE PART = EnumProperty.create("part", Part.class); + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public enum Part implements IStringSerializable { + START, MIDDLE, END, SINGLE; + + @Override + public String getName() { + return Lang.asId(name()); + } + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(PART, POWERED)); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.EIGHT_VOXEL_POLE.get(state.get(FACING) + .getAxis()); + } + + @Override + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.ENTITYBLOCK_ANIMATED; + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, + BlockPos pos, BlockPos neighbourPos) { + Direction facing = state.get(FACING); + Axis axis = facing.getAxis(); + if (direction.getAxis() != axis) + return state; + boolean connect = AllBlocks.GANTRY_SHAFT.has(neighbour) && neighbour.get(FACING) == facing; + + Part part = state.get(PART); + if (direction.getAxisDirection() == facing.getAxisDirection()) { + if (connect) { + if (part == Part.END) + part = Part.MIDDLE; + if (part == Part.SINGLE) + part = Part.START; + } else { + if (part == Part.MIDDLE) + part = Part.END; + if (part == Part.START) + part = Part.SINGLE; + } + } else { + if (connect) { + if (part == Part.START) + part = Part.MIDDLE; + if (part == Part.SINGLE) + part = Part.END; + } else { + if (part == Part.MIDDLE) + part = Part.START; + if (part == Part.END) + part = Part.SINGLE; + } + } + + return state.with(PART, part); + } + + public GantryShaftBlock(Properties properties) { + super(properties); + setDefaultState(getDefaultState().with(POWERED, false) + .with(PART, Part.SINGLE)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + BlockState state = super.getStateForPlacement(context); + Direction face = context.getFace(); + BlockState blockState = context.getWorld() + .getBlockState(context.getPos() + .offset(face.getOpposite())); + if (AllBlocks.GANTRY_SHAFT.has(blockState) && blockState.get(FACING) + .getAxis() == face.getAxis()) { + Direction facing = blockState.get(FACING); + state = state.with(FACING, context.getPlayer() == null || !context.getPlayer() + .isSneaking() ? facing : facing.getOpposite()); + } + return state.with(POWERED, shouldBePowered(state, context.getWorld(), context.getPos())); + } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + ActionResultType onWrenched = super.onWrenched(state, context); + if (onWrenched.isAccepted()) { + BlockPos pos = context.getPos(); + World world = context.getWorld(); + neighborChanged(world.getBlockState(pos), world, pos, state.getBlock(), pos, false); + } + return onWrenched; + } + + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_, + boolean p_220069_6_) { + if (worldIn.isRemote) + return; + boolean previouslyPowered = state.get(POWERED); + boolean shouldPower = worldIn.isBlockPowered(pos); // shouldBePowered(state, worldIn, pos); + + if (!previouslyPowered && !shouldPower && shouldBePowered(state, worldIn, pos)) { + worldIn.setBlockState(pos, state.with(POWERED, true), 3); + return; + } + + if (previouslyPowered == shouldPower) + return; + + // Collect affected gantry shafts + List toUpdate = new ArrayList<>(); + Direction facing = state.get(FACING); + Axis axis = facing.getAxis(); + for (Direction d : Iterate.directionsInAxis(axis)) { + BlockPos currentPos = pos.offset(d); + while (true) { + if (!worldIn.isBlockPresent(currentPos)) + break; + BlockState currentState = worldIn.getBlockState(currentPos); + if (!(currentState.getBlock() instanceof GantryShaftBlock)) + break; + if (currentState.get(FACING) != facing) + break; + if (!shouldPower && currentState.get(POWERED) && worldIn.isBlockPowered(currentPos)) + return; + if (currentState.get(POWERED) == shouldPower) + break; + toUpdate.add(currentPos); + currentPos = currentPos.offset(d); + } + } + + toUpdate.add(pos); + for (BlockPos blockPos : toUpdate) { + BlockState blockState = worldIn.getBlockState(blockPos); + + if (!shouldPower) { + TileEntity te = worldIn.getTileEntity(blockPos); + if (te instanceof KineticTileEntity) + ((KineticTileEntity) te).detachKinetics(); + } + + if (blockState.getBlock() instanceof GantryShaftBlock) + worldIn.setBlockState(blockPos, blockState.with(POWERED, shouldPower), 2); + } + } + + protected boolean shouldBePowered(BlockState state, World worldIn, BlockPos pos) { + boolean shouldPower = worldIn.isBlockPowered(pos); + + Direction facing = state.get(FACING); + for (Direction d : Iterate.directionsInAxis(facing.getAxis())) { + BlockPos neighbourPos = pos.offset(d); + if (!worldIn.isBlockPresent(neighbourPos)) + continue; + BlockState neighbourState = worldIn.getBlockState(neighbourPos); + if (!(neighbourState.getBlock() instanceof GantryShaftBlock)) + continue; + if (neighbourState.get(FACING) != facing) + continue; + shouldPower |= neighbourState.get(POWERED); + } + + return shouldPower; + } + + @Override + public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { + return face.getAxis() == state.get(FACING) + .getAxis(); + } + + @Override + public Axis getRotationAxis(BlockState state) { + return state.get(FACING) + .getAxis(); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.GANTRY_SHAFT.create(); + } + + @Override + protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) { + return super.areStatesKineticallyEquivalent(oldState, newState) + && oldState.get(POWERED) == newState.get(POWERED); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java new file mode 100644 index 000000000..338123dc8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java @@ -0,0 +1,103 @@ +package com.simibubi.create.content.contraptions.relays.advanced; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; + +public class GantryShaftTileEntity extends KineticTileEntity { + + public GantryShaftTileEntity(TileEntityType typeIn) { + super(typeIn); + } + + @Override + public void onSpeedChanged(float previousSpeed) { + super.onSpeedChanged(previousSpeed); + + if (!canAssembleOn()) + return; + for (Direction d : Iterate.directions) { + if (d.getAxis() == getBlockState().get(GantryShaftBlock.FACING) + .getAxis()) + continue; + BlockPos offset = pos.offset(d); + BlockState pinionState = world.getBlockState(offset); + if (!AllBlocks.GANTRY_PINION.has(pinionState)) + continue; + if (pinionState.get(GantryPinionBlock.FACING) != d) + continue; + TileEntity tileEntity = world.getTileEntity(offset); + if (tileEntity instanceof GantryPinionTileEntity) + ((GantryPinionTileEntity) tileEntity).queueAssembly(); + } + + } + + @Override + public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff, + boolean connectedViaAxes, boolean connectedViaCogs) { + float defaultModifier = + super.propagateRotationTo(target, stateFrom, stateTo, diff, connectedViaAxes, connectedViaCogs); + + if (connectedViaAxes) + return defaultModifier; + if (!stateFrom.get(GantryShaftBlock.POWERED)) + return defaultModifier; + if (!AllBlocks.GANTRY_PINION.has(stateTo)) + return defaultModifier; + + Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); + if (stateTo.get(GantryPinionBlock.FACING) != direction) + return defaultModifier; + return GantryPinionTileEntity.getGantryPinionModifier(stateFrom.get(GantryShaftBlock.FACING), + stateTo.get(GantryPinionBlock.FACING)); + } + + @Override + public boolean isCustomConnection(KineticTileEntity other, BlockState state, BlockState otherState) { + if (!AllBlocks.GANTRY_PINION.has(otherState)) + return false; + final BlockPos diff = other.getPos() + .subtract(pos); + Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); + return otherState.get(GantryPinionBlock.FACING) == direction; + } + + public boolean canAssembleOn() { + BlockState blockState = getBlockState(); + if (!AllBlocks.GANTRY_SHAFT.has(blockState)) + return false; + if (blockState.get(GantryShaftBlock.POWERED)) + return false; + float speed = getPinionMovementSpeed(); + + switch (blockState.get(GantryShaftBlock.PART)) { + case END: + return speed < 0; + case MIDDLE: + return speed != 0; + case START: + return speed > 0; + case SINGLE: + default: + return false; + } + } + + public float getPinionMovementSpeed() { + BlockState blockState = getBlockState(); + if (!AllBlocks.GANTRY_SHAFT.has(blockState)) + return 0; + return MathHelper.clamp(-getSpeed() / 512f, -.49f, .49f); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java index 7604042ff..5d9071e98 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java @@ -1,16 +1,21 @@ package com.simibubi.create.content.contraptions.relays.advanced; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; + import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; @@ -27,9 +32,7 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import java.util.function.Predicate; - -public class SpeedControllerBlock extends HorizontalAxisKineticBlock { +public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements ITE { private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); @@ -41,17 +44,28 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock { public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.ROTATION_SPEED_CONTROLLER.create(); } - + @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState above = context.getWorld().getBlockState(context.getPos().up()); - if (CogWheelBlock.isLargeCog(above) && above.get(CogWheelBlock.AXIS).isHorizontal()) + BlockState above = context.getWorld() + .getBlockState(context.getPos() + .up()); + if (CogWheelBlock.isLargeCog(above) && above.get(CogWheelBlock.AXIS) + .isHorizontal()) return getDefaultState().with(HORIZONTAL_AXIS, above.get(CogWheelBlock.AXIS) == Axis.X ? Axis.Z : Axis.X); return super.getStateForPlacement(context); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { + public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos neighbourPos, + boolean p_220069_6_) { + if (neighbourPos.equals(pos.up())) + withTileEntityDo(world, pos, SpeedControllerTileEntity::updateBracket); + } + + @Override + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult ray) { IPlacementHelper helper = PlacementHelpers.get(placementHelperId); ItemStack heldItem = player.getHeldItem(hand); @@ -72,7 +86,7 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.SPEED_CONTROLLER.get(state.get(HORIZONTAL_AXIS)); + return AllShapes.SPEED_CONTROLLER; } @MethodsReturnNonnullByDefault @@ -90,12 +104,15 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock { @Override public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { BlockPos newPos = pos.up(); - if (!world.getBlockState(newPos).getMaterial().isReplaceable()) + if (!world.getBlockState(newPos) + .getMaterial() + .isReplaceable()) return PlacementOffset.fail(); Axis newAxis = state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X; - if (CogwheelBlockItem.DiagonalCogHelper.hasLargeCogwheelNeighbor(world, newPos, newAxis) || CogwheelBlockItem.DiagonalCogHelper.hasSmallCogwheelNeighbor(world, newPos, newAxis)) + if (CogwheelBlockItem.DiagonalCogHelper.hasLargeCogwheelNeighbor(world, newPos, newAxis) + || CogwheelBlockItem.DiagonalCogHelper.hasSmallCogwheelNeighbor(world, newPos, newAxis)) return PlacementOffset.fail(); return PlacementOffset.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis)); @@ -103,7 +120,14 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X)); + IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, + state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X)); } } + + @Override + public Class getTileEntityClass() { + return SpeedControllerTileEntity.class; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 0bd5d9096..bf43e7db4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -1,14 +1,22 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.SuperByteBuffer; +import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; public class SpeedControllerRenderer extends SmartTileEntityRenderer { @@ -18,16 +26,30 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer type) { super(type); + hasBracket = false; + } + + @Override + public void lazyTick() { + super.lazyTick(); + updateBracket(); } @Override @@ -56,7 +67,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity { } public static float getConveyedSpeed(KineticTileEntity cogWheel, KineticTileEntity speedControllerIn, - boolean targetingController) { + boolean targetingController) { if (!(speedControllerIn instanceof SpeedControllerTileEntity)) return 0; @@ -74,7 +85,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity { } public static float getDesiredOutputSpeed(KineticTileEntity cogWheel, KineticTileEntity speedControllerIn, - boolean targetingController) { + boolean targetingController) { SpeedControllerTileEntity speedController = (SpeedControllerTileEntity) speedControllerIn; float targetSpeed = speedController.targetSpeed.getValue(); float speed = speedControllerIn.getTheoreticalSpeed(); @@ -103,16 +114,25 @@ public class SpeedControllerTileEntity extends KineticTileEntity { return targetSpeed; } + public void updateBracket() { + if (world == null || !world.isRemote) + return; + BlockState stateAbove = world.getBlockState(pos.up()); + hasBracket = AllBlocks.LARGE_COGWHEEL.has(stateAbove) && stateAbove.get(CogWheelBlock.AXIS) + .isHorizontal(); + } + private class ControllerValueBoxTransform extends ValueBoxTransform.Sided { @Override protected Vec3d getSouthLocation() { - return VecHelper.voxelSpace(8, 11.5f, 14); + return VecHelper.voxelSpace(8, 11f, 16); } @Override protected boolean isSideActive(BlockState state, Direction direction) { - if (direction.getAxis().isVertical()) + if (direction.getAxis() + .isVertical()) return false; return state.get(SpeedControllerBlock.HORIZONTAL_AXIS) != direction.getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index 3341651f4..2974f2a3a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -68,6 +68,11 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onRedstoneUpdate); } + @Override + protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) { + return false; + } + @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { if (state.get(VERTICAL)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index c55bda6f5..4d09a55d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -9,6 +9,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity.CasingType; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; @@ -31,6 +32,8 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.MobEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.DyeColor; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; @@ -62,6 +65,7 @@ import net.minecraft.world.WorldType; import net.minecraft.world.storage.loot.LootParameters; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.Tags; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -83,6 +87,12 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE te.applyColor(DyeColor.getColor(heldItem))); + return ActionResultType.SUCCESS; + } + BeltTileEntity belt = BeltHelper.getSegmentTE(world, pos); if (belt == null) return ActionResultType.PASS; @@ -413,7 +434,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { public BeltRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } - + @Override public boolean isGlobalRenderer(BeltTileEntity te) { return BeltBlock.canTransportObjects(te.getBlockState()); @@ -97,14 +98,22 @@ public class BeltRenderer extends SafeTileEntityRenderer { SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState) .light(light); - SpriteShiftEntry spriteShift = - diagonal ? AllSpriteShifts.BELT_DIAGONAL : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; + + SpriteShiftEntry spriteShift = null; + if (te.color.isPresent()) { + DyeColor color = te.color.get(); + spriteShift = (diagonal ? AllSpriteShifts.DYED_DIAGONAL_BELTS + : bottom ? AllSpriteShifts.DYED_OFFSET_BELTS : AllSpriteShifts.DYED_BELTS).get(color); + } else + spriteShift = diagonal ? AllSpriteShifts.BELT_DIAGONAL + : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; + int cycleLength = diagonal ? 12 : 16; int cycleOffset = bottom ? 8 : 0; // UV shift float speed = te.getSpeed(); - if (speed != 0) { + if (speed != 0 || te.color.isPresent()) { float time = renderTick * axisDirection.getOffset(); if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX || sideways && axisDirection == AxisDirection.NEGATIVE) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index c84217cd8..e777e5a0e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -9,9 +9,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Function; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler; @@ -24,7 +26,6 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.block.Block; @@ -54,7 +55,7 @@ import net.minecraftforge.items.IItemHandler; public class BeltTileEntity extends KineticTileEntity { public Map passengers; - public int color; + public Optional color; public int beltLength; public int index; public Direction lastInsert; @@ -75,7 +76,7 @@ public class BeltTileEntity extends KineticTileEntity { controller = BlockPos.ZERO; itemHandler = LazyOptional.empty(); casing = CasingType.NONE; - color = -1; + color = Optional.empty(); } @Override @@ -182,11 +183,13 @@ public class BeltTileEntity extends KineticTileEntity { if (controller != null) compound.put("Controller", NBTUtil.writeBlockPos(controller)); compound.putBoolean("IsController", isController()); - compound.putInt("Color", color); compound.putInt("Length", beltLength); compound.putInt("Index", index); NBTHelper.writeEnum(compound, "Casing", casing); + if (color.isPresent()) + NBTHelper.writeEnum(compound, "Dye", color.get()); + if (isController()) compound.put("Inventory", getInventory().write()); super.write(compound, clientPacket); @@ -199,11 +202,13 @@ public class BeltTileEntity extends KineticTileEntity { if (compound.getBoolean("IsController")) controller = pos; + color = compound.contains("Dye") ? Optional.of(NBTHelper.readEnum(compound, "Dye", DyeColor.class)) + : Optional.empty(); + if (!wasMoved) { if (!isController()) controller = NBTUtil.readBlockPos(compound.getCompound("Controller")); trackerUpdateTag = compound; - color = compound.getInt("Color"); beltLength = compound.getInt("Length"); index = compound.getInt("Index"); } @@ -233,12 +238,17 @@ public class BeltTileEntity extends KineticTileEntity { } public void applyColor(DyeColor colorIn) { - int colorValue = colorIn.getMapColor().colorValue; + if (colorIn == null) { + if (!color.isPresent()) + return; + } else if (color.isPresent() && color.get() == colorIn) + return; + for (BlockPos blockPos : BeltBlock.getBeltChain(world, getController())) { BeltTileEntity belt = BeltHelper.getSegmentTE(world, blockPos); if (belt == null) continue; - belt.color = belt.color == -1 ? colorValue : ColorHelper.mixColors(belt.color, colorValue, .5f); + belt.color = Optional.ofNullable(colorIn); belt.markDirty(); belt.sendData(); } @@ -471,4 +481,18 @@ public class BeltTileEntity extends KineticTileEntity { .build(); } + @Override + protected boolean canPropagateDiagonally(IRotate block, BlockState state) { + return state.has(BeltBlock.SLOPE) + && (state.get(BeltBlock.SLOPE) == BeltSlope.UPWARD || state.get(BeltBlock.SLOPE) == BeltSlope.DOWNWARD); + } + + @Override + public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff, + boolean connectedViaAxes, boolean connectedViaCogs) { + if (target instanceof BeltTileEntity && !connectedViaAxes) + return getController().equals(((BeltTileEntity) target).getController()) ? 1 : 0; + return 0; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 654528425..1284afba9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -408,11 +408,11 @@ public class BeltInventory { public void applyToEachWithin(float position, float maxDistanceToPosition, Function processFunction) { boolean dirty = false; - for (TransportedItemStack transforted : items) { - ItemStack stackBefore = transforted.stack.copy(); - if (Math.abs(position - transforted.beltPosition) >= maxDistanceToPosition) + for (TransportedItemStack transported : items) { + ItemStack stackBefore = transported.stack.copy(); + if (Math.abs(position - transported.beltPosition) >= maxDistanceToPosition) continue; - TransportedResult result = processFunction.apply(transforted); + TransportedResult result = processFunction.apply(transported); if (result == null|| result.didntChangeFrom(stackBefore)) continue; @@ -423,7 +423,7 @@ public class BeltInventory { toInsert.add(held); } toInsert.addAll(result.getOutputs()); - toRemove.add(transforted); + toRemove.add(transported); } if (dirty) { belt.markDirty(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java index d7ff62dff..08f3dcb0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.relays.belt.transport; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; @@ -8,12 +9,18 @@ import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.utility.Iterate; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.items.ItemHandlerHelper; public class BeltTunnelInteractionHandler { @@ -26,38 +33,77 @@ public class BeltTunnelInteractionHandler { Direction movementFacing = beltInventory.belt.getMovementFacing(); if (!beltInventory.beltMovementPositive && nextOffset == 0) upcomingSegment = -1; - if (currentSegment != upcomingSegment) { - if (stuckAtTunnel(beltInventory, upcomingSegment, current.stack, movementFacing)) { - current.beltPosition = currentSegment + (beltInventory.beltMovementPositive ? .99f : .01f); - return true; + if (currentSegment == upcomingSegment) + return false; + + if (stuckAtTunnel(beltInventory, upcomingSegment, current.stack, movementFacing)) { + current.beltPosition = currentSegment + (beltInventory.beltMovementPositive ? .99f : .01f); + return true; + } + + World world = beltInventory.belt.getWorld(); + boolean onServer = !world.isRemote; + boolean removed = false; + BeltTunnelTileEntity nextTunnel = getTunnelOnSegement(beltInventory, upcomingSegment); + + if (nextTunnel instanceof BrassTunnelTileEntity) { + BrassTunnelTileEntity brassTunnel = (BrassTunnelTileEntity) nextTunnel; + if (brassTunnel.hasDistributionBehaviour()) { + if (!brassTunnel.canTakeItems()) + return true; + if (onServer) { + brassTunnel.setStackToDistribute(current.stack); + current.stack = ItemStack.EMPTY; + beltInventory.belt.sendData(); + beltInventory.belt.markDirty(); + } + removed = true; } - boolean onServer = !beltInventory.belt.getWorld().isRemote; - boolean removed = false; - BeltTunnelTileEntity nextTunnel = getTunnelOnSegement(beltInventory, upcomingSegment); - if (nextTunnel instanceof BrassTunnelTileEntity) { - BrassTunnelTileEntity brassTunnel = (BrassTunnelTileEntity) nextTunnel; - if (brassTunnel.hasDistributionBehaviour()) { - if (!brassTunnel.canTakeItems()) + } else if (nextTunnel != null) { + BlockState blockState = nextTunnel.getBlockState(); + if (current.stack.getCount() > 1 && AllBlocks.ANDESITE_TUNNEL.has(blockState) + && BeltTunnelBlock.isJunction(blockState) + && movementFacing.getAxis() == blockState.get(BeltTunnelBlock.HORIZONTAL_AXIS)) { + + for (Direction d : Iterate.horizontalDirections) { + if (d.getAxis() == blockState.get(BeltTunnelBlock.HORIZONTAL_AXIS)) + continue; + if (!nextTunnel.flaps.containsKey(d)) + continue; + BlockPos outpos = nextTunnel.getPos() + .down() + .offset(d); + if (!world.isBlockPresent(outpos)) return true; - if (onServer) { - brassTunnel.setStackToDistribute(current.stack); - current.stack = ItemStack.EMPTY; - beltInventory.belt.sendData(); - beltInventory.belt.markDirty(); - } - removed = true; + DirectBeltInputBehaviour behaviour = + TileEntityBehaviour.get(world, outpos, DirectBeltInputBehaviour.TYPE); + if (behaviour == null) + continue; + if (!behaviour.canInsertFromSide(d)) + continue; + + ItemStack toinsert = ItemHandlerHelper.copyStackWithSize(current.stack, 1); + if (!behaviour.handleInsertion(toinsert, d, false).isEmpty()) + return true; + if (onServer) + flapTunnel(beltInventory, upcomingSegment, d, false); + + current.stack.shrink(1); + beltInventory.belt.sendData(); + if (current.stack.getCount() <= 1) + break; } } - - if (onServer) { - flapTunnel(beltInventory, currentSegment, movementFacing, false); - flapTunnel(beltInventory, upcomingSegment, movementFacing.getOpposite(), true); - } - - if (removed) - return true; } + if (onServer) { + flapTunnel(beltInventory, currentSegment, movementFacing, false); + flapTunnel(beltInventory, upcomingSegment, movementFacing.getOpposite(), true); + } + + if (removed) + return true; + return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelPlacementHelper.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelPlacementHelper.java deleted file mode 100644 index 5f4e7a3e6..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelPlacementHelper.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.simibubi.create.content.contraptions.relays.elementary; - -public class CogWheelPlacementHelper { - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java index 94cc8e993..15ea07c4c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java @@ -1,5 +1,10 @@ package com.simibubi.create.content.contraptions.relays.elementary; +import static com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock.AXIS; + +import java.util.List; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; @@ -11,6 +16,7 @@ import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -25,11 +31,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.World; -import java.util.List; -import java.util.function.Predicate; - -import static com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock.AXIS; - public class CogwheelBlockItem extends BlockItem { boolean large; @@ -48,18 +49,24 @@ public class CogwheelBlockItem extends BlockItem { @Override public ActionResultType tryPlace(BlockItemUseContext context) { World world = context.getWorld(); - BlockPos pos = context.getPos().offset(context.getFace().getOpposite()); + BlockPos pos = context.getPos() + .offset(context.getFace() + .getOpposite()); BlockState state = world.getBlockState(pos); IPlacementHelper helper = PlacementHelpers.get(placementHelperId); + PlayerEntity player = context.getPlayer(); if (helper.matchesState(state)) { - PlacementOffset offset = helper.getOffset(world, state, pos, new BlockRayTraceResult(context.getHitVec(), context.getFace(), pos, true)); + PlacementOffset offset = helper.getOffset(world, state, pos, + new BlockRayTraceResult(context.getHitVec(), context.getFace(), pos, true)); if (!offset.isReplaceable(world)) return super.tryPlace(context); - offset.placeInWorld(world, this, context.getPlayer(), context.getItem()); + offset.placeInWorld(world, this, player, context.getItem()); + triggerShiftingGearsAdvancement(world, new BlockPos(offset.getPos()), offset.getTransform() + .apply(getBlock().getDefaultState()), player); return ActionResultType.SUCCESS; } @@ -68,92 +75,61 @@ public class CogwheelBlockItem extends BlockItem { helper = PlacementHelpers.get(integratedCogHelperId); if (helper.matchesState(state)) { - PlacementOffset offset = helper.getOffset(world, state, pos, new BlockRayTraceResult(context.getHitVec(), context.getFace(), pos, true)); + PlacementOffset offset = helper.getOffset(world, state, pos, + new BlockRayTraceResult(context.getHitVec(), context.getFace(), pos, true)); if (!offset.isReplaceable(world)) return super.tryPlace(context); - offset.placeInWorld(world, this, context.getPlayer(), context.getItem()); + offset.placeInWorld(world, this, player, context.getItem()); + triggerShiftingGearsAdvancement(world, new BlockPos(offset.getPos()), offset.getTransform() + .apply(getBlock().getDefaultState()), player); return ActionResultType.SUCCESS; } } return super.tryPlace(context); - - /*if (!(placedOnState.getBlock() instanceof CogWheelBlock)) - return super.tryPlace(context); - if (face.getAxis() == placedOnState.get(CogWheelBlock.AXIS)) - return super.tryPlace(context); - - boolean placedOnLarge = CogWheelBlock.isLargeCog(placedOnState); - if (placedOnLarge || large) { - - boolean largeOnLarge = placedOnLarge && large; - Axis offsetAxis = Axis.X; - for (Axis axis : Axis.values()) { - if (placedOnState.get(CogWheelBlock.AXIS) == axis) - continue; - if (axis == face.getAxis()) - continue; - offsetAxis = axis; - } - - if (largeOnLarge) - offsetAxis = placedOnState.get(CogWheelBlock.AXIS); - - Vec3d hitVec = context.getHitVec().subtract(VecHelper.getCenterOf(placedOnPos)); - hitVec = hitVec - .mul(new Vec3d(Direction.getFacingFromAxis(AxisDirection.POSITIVE, offsetAxis).getDirectionVec())); - - BlockPos correctPos = - context.getPos().add(Math.signum(hitVec.x), Math.signum(hitVec.y), Math.signum(hitVec.z)); - - if (context.getWorld().getBlockState(correctPos).getMaterial().isReplaceable()) - context = BlockItemUseContext.func_221536_a(context, correctPos, largeOnLarge ? face - : Direction.getFacingFromAxis(AxisDirection.POSITIVE, placedOnState.get(CogWheelBlock.AXIS))); - else - return ActionResultType.FAIL; - } - - return super.tryPlace(context);*/ } @Override // Trigger cogwheel criterion protected boolean placeBlock(BlockItemUseContext context, BlockState state) { - World world = context.getWorld(); - PlayerEntity player = context.getPlayer(); + triggerShiftingGearsAdvancement(context.getWorld(), context.getPos(), state, context.getPlayer()); + return super.placeBlock(context, state); + } - if (!world.isRemote && player != null) { - Axis axis = state.get(CogWheelBlock.AXIS); - for (Axis perpendicular1 : Iterate.axes) { - if (perpendicular1 == axis) + protected void triggerShiftingGearsAdvancement(World world, BlockPos pos, BlockState state, PlayerEntity player) { + if (world.isRemote || player == null) + return; + + Axis axis = state.get(CogWheelBlock.AXIS); + for (Axis perpendicular1 : Iterate.axes) { + if (perpendicular1 == axis) + continue; + Direction d1 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, perpendicular1); + for (Axis perpendicular2 : Iterate.axes) { + if (perpendicular1 == perpendicular2) continue; - Direction d1 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, perpendicular1); - for (Axis perpendicular2 : Iterate.axes) { - if (perpendicular1 == perpendicular2) - continue; - if (axis == perpendicular2) - continue; - Direction d2 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, perpendicular2); - for (int offset1 : Iterate.positiveAndNegative) { - for (int offset2 : Iterate.positiveAndNegative) { - BlockPos connectedPos = context.getPos().offset(d1, offset1).offset(d2, offset2); - BlockState blockState = world.getBlockState(connectedPos); - if (!(blockState.getBlock() instanceof CogWheelBlock)) - continue; - if (blockState.get(CogWheelBlock.AXIS) != axis) - continue; - if (AllBlocks.LARGE_COGWHEEL.has(blockState) == large) - continue; - AllTriggers.triggerFor(AllTriggers.SHIFTING_GEARS, player); - } + if (axis == perpendicular2) + continue; + Direction d2 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, perpendicular2); + for (int offset1 : Iterate.positiveAndNegative) { + for (int offset2 : Iterate.positiveAndNegative) { + BlockPos connectedPos = pos.offset(d1, offset1) + .offset(d2, offset2); + BlockState blockState = world.getBlockState(connectedPos); + if (!(blockState.getBlock() instanceof CogWheelBlock)) + continue; + if (blockState.get(CogWheelBlock.AXIS) != axis) + continue; + if (AllBlocks.LARGE_COGWHEEL.has(blockState) == large) + continue; + AllTriggers.triggerFor(AllTriggers.SHIFTING_GEARS, player); } } } } - return super.placeBlock(context, state); } @MethodsReturnNonnullByDefault @@ -170,7 +146,8 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); if (!((CogWheelBlock) state.getBlock()).isLarge) { - List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)); + List directions = + IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)); for (Direction dir : directions) { BlockPos newPos = pos.offset(dir); @@ -178,7 +155,9 @@ public class CogwheelBlockItem extends BlockItem { if (hasLargeCogwheelNeighbor(world, newPos, state.get(AXIS))) continue; - if (!world.getBlockState(newPos).getMaterial().isReplaceable()) + if (!world.getBlockState(newPos) + .getMaterial() + .isReplaceable()) continue; return PlacementOffset.success(newPos, s -> s.with(AXIS, state.get(AXIS))); @@ -193,7 +172,9 @@ public class CogwheelBlockItem extends BlockItem { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), ((CogWheelBlock) state.getBlock()).isLarge ? 1.5D : 0.75D); + IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), + ((CogWheelBlock) state.getBlock()).isLarge ? 1.5D : 0.75D); } } @@ -211,11 +192,16 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); if (((CogWheelBlock) state.getBlock()).isLarge) { - Direction side = IPlacementHelper.orderedByDistanceOnlyAxis(pos, ray.getHitVec(), state.get(AXIS)).get(0); - List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)); + Direction side = IPlacementHelper.orderedByDistanceOnlyAxis(pos, ray.getHitVec(), state.get(AXIS)) + .get(0); + List directions = + IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)); for (Direction dir : directions) { - BlockPos newPos = pos.offset(dir).offset(side); - if (!world.getBlockState(newPos).getMaterial().isReplaceable()) + BlockPos newPos = pos.offset(dir) + .offset(side); + if (!world.getBlockState(newPos) + .getMaterial() + .isReplaceable()) continue; return PlacementOffset.success(newPos, s -> s.with(AXIS, dir.getAxis())); @@ -238,13 +224,18 @@ public class CogwheelBlockItem extends BlockItem { @Override public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { - //diagonal gears of different size - Direction closest = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)).get(0); - List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS), d -> d.getAxis() != closest.getAxis()); + // diagonal gears of different size + Direction closest = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)) + .get(0); + List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), + state.get(AXIS), d -> d.getAxis() != closest.getAxis()); for (Direction dir : directions) { - BlockPos newPos = pos.offset(dir).offset(closest); - if (!world.getBlockState(newPos).getMaterial().isReplaceable()) + BlockPos newPos = pos.offset(dir) + .offset(closest); + if (!world.getBlockState(newPos) + .getMaterial() + .isReplaceable()) continue; if (AllBlocks.COGWHEEL.has(state) && hasSmallCogwheelNeighbor(world, newPos, state.get(AXIS))) @@ -258,11 +249,17 @@ public class CogwheelBlockItem extends BlockItem { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), 1D); + IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), 1D); } protected boolean hitOnShaft(BlockState state, BlockRayTraceResult ray) { - return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)).getBoundingBox().grow(0.001).contains(ray.getHitVec().subtract(ray.getHitVec().align(Iterate.axisSet))); + return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)) + .getBoundingBox() + .grow(0.001) + .contains(ray.getHitVec() + .subtract(ray.getHitVec() + .align(Iterate.axisSet))); } static public boolean hasLargeCogwheelNeighbor(World world, BlockPos pos, Direction.Axis axis) { @@ -300,7 +297,8 @@ public class CogwheelBlockItem extends BlockItem { @Override public Predicate getStatePredicate() { - return s -> !AllBlocks.COGWHEEL.has(s) && s.getBlock() instanceof IRotate && ((IRotate) s.getBlock()).hasIntegratedCogwheel(null, null, null); + return s -> !AllBlocks.COGWHEEL.has(s) && s.getBlock() instanceof IRotate + && ((IRotate) s.getBlock()).hasIntegratedCogwheel(null, null, null); } @Override @@ -309,24 +307,31 @@ public class CogwheelBlockItem extends BlockItem { Axis newAxis; if (state.has(HorizontalKineticBlock.HORIZONTAL_FACING)) - newAxis = state.get(HorizontalKineticBlock.HORIZONTAL_FACING).getAxis(); + newAxis = state.get(HorizontalKineticBlock.HORIZONTAL_FACING) + .getAxis(); else if (state.has(DirectionalKineticBlock.FACING)) - newAxis = state.get(DirectionalKineticBlock.FACING).getAxis(); + newAxis = state.get(DirectionalKineticBlock.FACING) + .getAxis(); else newAxis = Axis.Y; if (face.getAxis() == newAxis) return PlacementOffset.fail(); - List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), face.getAxis(), newAxis); + List directions = + IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), face.getAxis(), newAxis); for (Direction d : directions) { - BlockPos newPos = pos.offset(face).offset(d); + BlockPos newPos = pos.offset(face) + .offset(d); - if (!world.getBlockState(newPos).getMaterial().isReplaceable()) + if (!world.getBlockState(newPos) + .getMaterial() + .isReplaceable()) continue; - if (DiagonalCogHelper.hasLargeCogwheelNeighbor(world, newPos, newAxis) || DiagonalCogHelper.hasSmallCogwheelNeighbor(world, newPos, newAxis)) + if (DiagonalCogHelper.hasLargeCogwheelNeighbor(world, newPos, newAxis) + || DiagonalCogHelper.hasSmallCogwheelNeighbor(world, newPos, newAxis)) return PlacementOffset.fail(); return PlacementOffset.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis)); @@ -337,10 +342,10 @@ public class CogwheelBlockItem extends BlockItem { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow( - VecHelper.getCenterOf(pos), - VecHelper.getCenterOf(offset.getPos()), - Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, offset.getTransform().apply(AllBlocks.LARGE_COGWHEEL.getDefaultState()).get(AXIS))); + IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, offset.getTransform() + .apply(AllBlocks.LARGE_COGWHEEL.getDefaultState()) + .get(AXIS))); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java index 864b659f3..410d15108 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java @@ -2,12 +2,16 @@ package com.simibubi.create.content.contraptions.relays.elementary; import java.util.List; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; public class SimpleKineticTileEntity extends KineticTileEntity { @@ -28,4 +32,17 @@ public class SimpleKineticTileEntity extends KineticTileEntity { return new AxisAlignedBB(pos).grow(1); } + @Override + public List addPropagationLocations(IRotate block, BlockState state, List neighbours) { + if (!AllBlocks.LARGE_COGWHEEL.has(state)) + return super.addPropagationLocations(block, state, neighbours); + + BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)) + .forEach(offset -> { + if (offset.distanceSq(0, 0, 0, false) == BlockPos.ZERO.distanceSq(1, 1, 0, false)) + neighbours.add(pos.add(offset)); + }); + return neighbours; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java index 9627a008f..7cb0e02b7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java @@ -36,6 +36,7 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE, public static boolean isStraight(BlockState state) { return hasWindow(state) || state.get(SHAPE) == Shape.STRAIGHT; } + + public static boolean isJunction(BlockState state) { + Shape shape = state.get(SHAPE); + return shape == Shape.CROSS || shape == Shape.T_LEFT || shape == Shape.T_RIGHT; + } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index 3c7850948..5a288d073 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -36,12 +36,15 @@ import net.minecraftforge.items.IItemHandler; public class BeltTunnelTileEntity extends SmartTileEntity { public HashMap flaps; + public Set sides; + protected LazyOptional cap = LazyOptional.empty(); protected List> flapsToSend; public BeltTunnelTileEntity(TileEntityType type) { super(type); flaps = new HashMap<>(); + sides = new HashSet<>(); flapsToSend = new LinkedList<>(); } @@ -57,6 +60,12 @@ public class BeltTunnelTileEntity extends SmartTileEntity { for (Direction direction : flaps.keySet()) flapsNBT.add(IntNBT.of(direction.getIndex())); compound.put("Flaps", flapsNBT); + + ListNBT sidesNBT = new ListNBT(); + for (Direction direction : sides) + sidesNBT.add(IntNBT.of(direction.getIndex())); + compound.put("Sides", sidesNBT); + super.write(compound, clientPacket); if (!clientPacket) @@ -83,6 +92,12 @@ public class BeltTunnelTileEntity extends SmartTileEntity { for (INBT inbt : flapsNBT) if (inbt instanceof IntNBT) newFlaps.add(Direction.byIndex(((IntNBT) inbt).getInt())); + + sides.clear(); + ListNBT sidesNBT = compound.getList("Sides", NBT.TAG_INT); + for (INBT inbt : sidesNBT) + if (inbt instanceof IntNBT) + sides.add(Direction.byIndex(((IntNBT) inbt).getInt())); for (Direction d : Iterate.directions) if (!newFlaps.contains(d)) @@ -91,6 +106,10 @@ public class BeltTunnelTileEntity extends SmartTileEntity { flaps.put(d, new InterpolatedChasingValue().start(.25f) .target(0) .withSpeed(.05f)); + + // Backwards compat + if (!compound.contains("Sides") && compound.contains("Flaps")) + sides.addAll(flaps.keySet()); super.read(compound, clientPacket); @@ -108,11 +127,9 @@ public class BeltTunnelTileEntity extends SmartTileEntity { public void updateTunnelConnections() { flaps.clear(); + sides.clear(); BlockState tunnelState = getBlockState(); for (Direction direction : Iterate.horizontalDirections) { - BlockState blockState = world.getBlockState(pos.offset(direction)); - if (blockState.getBlock() instanceof BeltTunnelBlock) - continue; if (direction.getAxis() != tunnelState.get(BlockStateProperties.HORIZONTAL_AXIS)) { boolean positive = direction.getAxisDirection() == AxisDirection.POSITIVE ^ direction.getAxis() == Axis.Z; @@ -124,11 +141,16 @@ public class BeltTunnelTileEntity extends SmartTileEntity { if (!positive && shape == Shape.T_RIGHT) continue; } - - BlockState funnelState = world.getBlockState(getPos().offset(direction)); - if (funnelState.getBlock() instanceof BeltFunnelBlock) - if (funnelState.get(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED - && funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING) == direction.getOpposite()) + + sides.add(direction); + + // Flap might be occluded + BlockState nextState = world.getBlockState(pos.offset(direction)); + if (nextState.getBlock() instanceof BeltTunnelBlock) + continue; + if (nextState.getBlock() instanceof BeltFunnelBlock) + if (nextState.get(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED + && nextState.get(BeltFunnelBlock.HORIZONTAL_FACING) == direction.getOpposite()) continue; flaps.put(direction, new InterpolatedChasingValue().start(.25f) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlock.java index 034f2f73f..98675add7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlock.java @@ -4,6 +4,7 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; @@ -35,6 +36,10 @@ public class BrassTunnelBlock extends BeltTunnelBlock { if (p_196243_1_.hasTileEntity() && (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) { TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); + withTileEntityDo(p_196243_2_, p_196243_3_, te -> { + if (te instanceof BrassTunnelTileEntity) + Block.spawnAsEntity(p_196243_2_, p_196243_3_, ((BrassTunnelTileEntity) te).stackToDistribute); + }); p_196243_2_.removeTileEntity(p_196243_3_); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java index a1b96f488..cae6d2088 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java @@ -13,8 +13,6 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -416,7 +414,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { continue; if (direction == movementFacing.getOpposite()) continue; - if (tunnelTE.flaps.containsKey(direction) || tunnelTE.hasValidOutputFunnel(direction)) { + if (tunnelTE.sides.contains(direction)) { BlockPos offset = tunnelTE.pos.down() .offset(direction); DirectBeltInputBehaviour inputBehaviour = @@ -434,17 +432,6 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { } } - protected boolean hasValidOutputFunnel(Direction side) { - BlockState funnelState = world.getBlockState(getPos().offset(side)); - if (!(funnelState.getBlock() instanceof BeltFunnelBlock)) - return false; - if (funnelState.has(BeltFunnelBlock.POWERED) && funnelState.get(BeltFunnelBlock.POWERED)) - return false; - if (funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING) != side.getOpposite()) - return false; - return funnelState.get(BeltFunnelBlock.SHAPE) == Shape.EXTENDED; - } - @Override public void addBehavioursDeferred(List behaviours) { super.addBehavioursDeferred(behaviours); @@ -462,7 +449,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { } private boolean isValidFaceForFilter(Direction side) { - return flaps.containsKey(side); + return sides.contains(side); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java new file mode 100644 index 000000000..513a0c454 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java @@ -0,0 +1,214 @@ +package com.simibubi.create.content.logistics.block.chute; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.utility.BlockHelper; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public abstract class AbstractChuteBlock extends Block implements IWrenchable, ITE { + + public AbstractChuteBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + public static boolean isChute(BlockState state) { + return state.getBlock() instanceof AbstractChuteBlock; + } + + public static boolean isOpenChute(BlockState state) { + return isChute(state) && ((AbstractChuteBlock) state.getBlock()).isOpen(state); + } + + public static boolean isTransparentChute(BlockState state) { + return isChute(state) && ((AbstractChuteBlock) state.getBlock()).isTransparent(state); + } + + @Nullable + public static Direction getChuteFacing(BlockState state) { + return !isChute(state) ? null : ((AbstractChuteBlock) state.getBlock()).getFacing(state); + } + + public Direction getFacing(BlockState state) { + return Direction.DOWN; + } + + public boolean isOpen(BlockState state) { + return true; + } + + public boolean isTransparent(BlockState state) { + return false; + } + + @Override + public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); + + @Override + public void onLanded(IBlockReader worldIn, Entity entityIn) { + super.onLanded(worldIn, entityIn); + if (!(entityIn instanceof ItemEntity)) + return; + if (entityIn.world.isRemote) + return; + if (!entityIn.isAlive()) + return; + DirectBeltInputBehaviour input = TileEntityBehaviour.get(entityIn.world, new BlockPos(entityIn.getPositionVec() + .add(0, 0.5f, 0)).down(), DirectBeltInputBehaviour.TYPE); + if (input == null) + return; + if (!input.canInsertFromSide(Direction.UP)) + return; + + ItemEntity itemEntity = (ItemEntity) entityIn; + ItemStack toInsert = itemEntity.getItem(); + ItemStack remainder = input.handleInsertion(toInsert, Direction.UP, false); + + if (remainder.isEmpty()) + itemEntity.remove(); + if (remainder.getCount() < toInsert.getCount()) + itemEntity.setItem(remainder); + } + + @Override + public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { + withTileEntityDo(world, pos, ChuteTileEntity::onAdded); + if (p_220082_5_) + return; + updateDiagonalNeighbour(state, world, pos); + } + + protected void updateDiagonalNeighbour(BlockState state, World world, BlockPos pos) { + if (!isChute(state)) + return; + AbstractChuteBlock block = (AbstractChuteBlock) state.getBlock(); + Direction facing = block.getFacing(state); + BlockPos toUpdate = pos.down(); + if (facing.getAxis() + .isHorizontal()) + toUpdate = toUpdate.offset(facing.getOpposite()); + + BlockState stateToUpdate = world.getBlockState(toUpdate); + BlockState updated = updateChuteState(stateToUpdate, world.getBlockState(toUpdate.up()), world, toUpdate); + if (stateToUpdate != updated && !world.isRemote) + world.setBlockState(toUpdate, updated); + } + + @Override + public void onReplaced(BlockState state, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) { + boolean differentBlock = state.getBlock() != p_196243_4_.getBlock(); + if (state.hasTileEntity() && (differentBlock || !p_196243_4_.hasTileEntity())) { + withTileEntityDo(world, pos, c -> c.onRemoved(state)); + world.removeTileEntity(pos); + } + if (p_196243_5_ || !differentBlock) + return; + + updateDiagonalNeighbour(state, world, pos); + + for (Direction direction : Iterate.horizontalDirections) { + BlockPos toUpdate = pos.up() + .offset(direction); + BlockState stateToUpdate = world.getBlockState(toUpdate); + BlockState updated = updateChuteState(stateToUpdate, world.getBlockState(toUpdate.up()), world, toUpdate); + if (stateToUpdate != updated && !world.isRemote) + world.setBlockState(toUpdate, updated); + } + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState above, IWorld world, + BlockPos pos, BlockPos p_196271_6_) { + if (direction != Direction.UP) + return state; + return updateChuteState(state, above, world, pos); + } + + @Override + public void neighborChanged(BlockState p_220069_1_, World world, BlockPos pos, Block p_220069_4_, + BlockPos neighbourPos, boolean p_220069_6_) { + if (pos.down() + .equals(neighbourPos)) + withTileEntityDo(world, pos, ChuteTileEntity::blockBelowChanged); + } + + public abstract BlockState updateChuteState(BlockState state, BlockState above, IBlockReader world, BlockPos pos); + + @Override + @OnlyIn(Dist.CLIENT) + public boolean addDestroyEffects(BlockState state, World world, BlockPos pos, ParticleManager manager) { + BlockHelper.addReducedDestroyEffects(state, world, pos, manager); + return true; + } + + @Override + public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return ChuteShapes.getShape(p_220053_1_); + } + + @Override + public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, + ISelectionContext p_220071_4_) { + return ChuteShapes.getCollisionShape(p_220071_1_); + } + + @Override + public Class getTileEntityClass() { + return ChuteTileEntity.class; + } + + @Override + public ActionResultType onUse(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult p_225533_6_) { + if (!player.getHeldItem(hand) + .isEmpty()) + return ActionResultType.PASS; + if (world.isRemote) + return ActionResultType.SUCCESS; + try { + ChuteTileEntity te = getTileEntity(world, pos); + if (te == null) + return ActionResultType.PASS; + if (te.item.isEmpty()) + return ActionResultType.PASS; + player.inventory.placeItemBackInInventory(world, te.item); + te.setItem(ItemStack.EMPTY); + return ActionResultType.SUCCESS; + + } catch (TileEntityException e) { + e.printStackTrace(); + } + return ActionResultType.PASS; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java index c1de7792b..bb76d62d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java @@ -4,23 +4,13 @@ import java.util.HashMap; import java.util.Map; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; -import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.client.particle.ParticleManager; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.state.DirectionProperty; import net.minecraft.state.EnumProperty; @@ -30,20 +20,20 @@ import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; -import net.minecraft.util.Hand; import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; -import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -public class ChuteBlock extends Block implements IWrenchable, ITE { +public class ChuteBlock extends AbstractChuteBlock { + + public ChuteBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + setDefaultState(getDefaultState().with(SHAPE, Shape.NORMAL) + .with(FACING, Direction.DOWN)); + } + public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); public static final DirectionProperty FACING = BlockStateProperties.FACING_EXCEPT_UP; @@ -56,112 +46,36 @@ public class ChuteBlock extends Block implements IWrenchable, ITE c.onRemoved(state)); - world.removeTileEntity(pos); + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + Shape shape = state.get(SHAPE); + boolean down = state.get(FACING) == Direction.DOWN; + if (!context.getWorld().isRemote && down && shape != Shape.INTERSECTION) { + context.getWorld() + .setBlockState(context.getPos(), + state.with(SHAPE, shape == Shape.WINDOW ? Shape.NORMAL : Shape.WINDOW)); } - if (p_196243_5_ || !differentBlock) - return; - - updateDiagonalNeighbour(state, world, pos); - - for (Direction direction : Iterate.horizontalDirections) { - BlockPos toUpdate = pos.up() - .offset(direction); - BlockState stateToUpdate = world.getBlockState(toUpdate); - BlockState updated = - updateDiagonalState(stateToUpdate, world.getBlockState(toUpdate.up()), world, toUpdate); - if (stateToUpdate != updated && !world.isRemote) - world.setBlockState(toUpdate, updated); - } - } - - @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState above, IWorld world, - BlockPos pos, BlockPos p_196271_6_) { - if (direction != Direction.UP) - return state; - return updateDiagonalState(state, above, world, pos); - } - - @Override - public void neighborChanged(BlockState p_220069_1_, World world, BlockPos pos, Block p_220069_4_, - BlockPos neighbourPos, boolean p_220069_6_) { - if (pos.down() - .equals(neighbourPos)) - withTileEntityDo(world, pos, ChuteTileEntity::blockBelowChanged); - } - - @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { - BlockState above = world.getBlockState(pos.up()); - return !(above.getBlock() instanceof ChuteBlock) || above.get(FACING) == Direction.DOWN; + return ActionResultType.SUCCESS; } @Override @@ -172,12 +86,24 @@ public class ChuteBlock extends Block implements IWrenchable, ITE p_206840_1_) { + super.fillStateContainer(p_206840_1_.add(SHAPE, FACING)); + } + + @Override + public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + BlockState above = world.getBlockState(pos.up()); + return !isChute(above) || getChuteFacing(above) == Direction.DOWN; + } + + @Override + public BlockState updateChuteState(BlockState state, BlockState above, IBlockReader world, BlockPos pos) { if (!(state.getBlock() instanceof ChuteBlock)) return state; @@ -189,7 +115,7 @@ public class ChuteBlock extends Block implements IWrenchable, ITE p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(SHAPE, FACING)); - } - - @Override - public Class getTileEntityClass() { - return ChuteTileEntity.class; - } - - @Override - public ActionResultType onUse(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, Hand hand, - BlockRayTraceResult p_225533_6_) { - if (!player.getHeldItem(hand) - .isEmpty()) - return ActionResultType.PASS; - if (world.isRemote) - return ActionResultType.SUCCESS; - try { - ChuteTileEntity te = getTileEntity(world, pos); - if (te == null) - return ActionResultType.PASS; - if (te.item.isEmpty()) - return ActionResultType.PASS; - player.inventory.placeItemBackInInventory(world, te.item); - te.setItem(ItemStack.EMPTY); - return ActionResultType.SUCCESS; - - } catch (TileEntityException e) { - e.printStackTrace(); - } - return ActionResultType.PASS; - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java index 265929820..9cc13fc30 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java @@ -23,7 +23,7 @@ public class ChuteItem extends BlockItem { World world = context.getWorld(); BlockState placedOnState = world.getBlockState(placedOnPos); - if (!(placedOnState.getBlock() instanceof ChuteBlock) || context.shouldCancelInteraction()) + if (!AbstractChuteBlock.isChute(placedOnState) || context.shouldCancelInteraction()) return super.tryPlace(context); if (face.getAxis() .isVertical()) @@ -37,13 +37,13 @@ public class ChuteItem extends BlockItem { .isReplaceable()) context = BlockItemUseContext.func_221536_a(context, correctPos, face); else { - if (blockState.getBlock() instanceof ChuteBlock && blockState.get(ChuteBlock.FACING) == Direction.DOWN) { - if (!world.isRemote) { - world.setBlockState(correctPos, - ChuteBlock.updateDiagonalState(blockState.with(ChuteBlock.FACING, face), - world.getBlockState(correctPos.up()), world, correctPos)); - return ActionResultType.SUCCESS; - } + if (!(blockState.getBlock() instanceof ChuteBlock) || world.isRemote) + return ActionResultType.FAIL; + AbstractChuteBlock block = (AbstractChuteBlock) blockState.getBlock(); + if (block.getFacing(blockState) == Direction.DOWN) { + world.setBlockState(correctPos, block.updateChuteState(blockState.with(ChuteBlock.FACING, face), + world.getBlockState(correctPos.up()), world, correctPos)); + return ActionResultType.SUCCESS; } return ActionResultType.FAIL; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItemHandler.java index bb4b3dad8..4188d2816 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItemHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItemHandler.java @@ -23,7 +23,7 @@ public class ChuteItemHandler implements IItemHandler { @Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - if (!te.item.isEmpty()) + if (!te.canAcceptItem(stack)) return stack; if (!simulate) te.setItem(stack); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java index db4e6d833..4d1540b68 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java @@ -31,6 +31,11 @@ public class ChuteRenderer extends SafeTileEntityRenderer { && (te.bottomPullDistance == 0 || te.itemPosition.get(partialTicks) > .5f)) return; + renderItem(te, partialTicks, ms, buffer, light, overlay); + } + + public static void renderItem(ChuteTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); MatrixStacker msr = MatrixStacker.of(ms); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java index aa8710fbb..6e069aeae 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.chute; import java.util.HashMap; import java.util.Map; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; @@ -22,6 +23,9 @@ public class ChuteShapes { public static final VoxelShape COLLISION_MASK = Block.makeCuboidShape(0, 0, 0, 16, 24, 16); public static VoxelShape createShape(BlockState state) { + if (AllBlocks.SMART_CHUTE.has(state)) + return AllShapes.SMART_CHUTE; + Direction direction = state.get(ChuteBlock.FACING); Shape shape = state.get(ChuteBlock.SHAPE); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index fcbfef911..006097715 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -13,9 +13,6 @@ import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock; import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.particle.AirParticleData; -import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; -import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; @@ -48,6 +45,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; @@ -110,14 +108,13 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private boolean canDirectlyInsert() { BlockState blockState = getBlockState(); BlockState blockStateAbove = world.getBlockState(pos.up()); - if (!AllBlocks.CHUTE.has(blockState)) + if (!AbstractChuteBlock.isChute(blockState)) return false; - if (AllBlocks.CHUTE.has(blockStateAbove) && blockStateAbove.get(ChuteBlock.FACING) == Direction.DOWN) + if (AbstractChuteBlock.getChuteFacing(blockStateAbove) == Direction.DOWN) return false; if (getItemMotion() > 0 && getInputChutes().isEmpty()) return false; - return blockState.get(ChuteBlock.FACING) == Direction.DOWN - || blockState.get(ChuteBlock.SHAPE) == Shape.INTERSECTION; + return AbstractChuteBlock.isOpenChute(blockState); } @Override @@ -195,7 +192,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor else maxPullDistance = MathHelper.lerp(speed / 32, 0, 1); - if (AllBlocks.CHUTE.has(world.getBlockState(pos.down()))) + if (AbstractChuteBlock.isChute(world.getBlockState(pos.down()))) maxPullDistance = 0; float flowLimit = maxPullDistance; if (flowLimit > 0) @@ -220,14 +217,17 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor // airCurrent.findEntities(); if (bottomPullDistance <= 0 && !getItem().isEmpty() || itemSpeed <= 0 || world == null || world.isRemote) return; + if (!canCollectItemsFromBelow()) + return; Vec3d center = VecHelper.getCenterOf(pos); AxisAlignedBB searchArea = new AxisAlignedBB(center.add(0, -bottomPullDistance - 0.5, 0), center.add(0, -0.5, 0)).grow(.45f); for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, searchArea)) { - setItem(itemEntity.getItem() - .copy(), - (float) (itemEntity.getBoundingBox() - .getCenter().y - pos.getY())); + ItemStack entityItem = itemEntity.getItem(); + if (!canAcceptItem(entityItem)) + continue; + setItem(entityItem.copy(), (float) (itemEntity.getBoundingBox() + .getCenter().y - pos.getY())); itemEntity.remove(); AllTriggers.triggerForNearbyPlayers(AllTriggers.UPWARD_CHUTE, world, pos, 5); break; @@ -239,7 +239,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return; if (getItem().isEmpty() && beltBelow != null) { beltBelow.handleCenteredProcessingOnAllItems(.5f, ts -> { - if (getItem().isEmpty()) { + if (canAcceptItem(ts.stack)) { setItem(ts.stack.copy(), -beltBelowOffset); return TransportedResult.removeItem(); } @@ -279,27 +279,24 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor BlockState blockState = getBlockState(); boolean up = itemMotion > 0; float absMotion = up ? itemMotion : -itemMotion; - if (blockState == null || !(blockState.getBlock() instanceof ChuteBlock)) + if (blockState == null || !AbstractChuteBlock.isChute(blockState)) return; if (push == 0 && pull == 0) return; - if (up - && (blockState.get(ChuteBlock.FACING) == Direction.DOWN - || blockState.get(ChuteBlock.SHAPE) == Shape.INTERSECTION) - && BlockHelper.noCollisionInSpace(world, pos.up())) + if (up && AbstractChuteBlock.isOpenChute(blockState) && BlockHelper.noCollisionInSpace(world, pos.up())) spawnAirFlow(1, 2, absMotion, .5f); - if (blockState.get(ChuteBlock.FACING) != Direction.DOWN) + if (AbstractChuteBlock.getChuteFacing(blockState) != Direction.DOWN) return; - if (blockState.get(ChuteBlock.SHAPE) == Shape.WINDOW) + if (AbstractChuteBlock.isTransparentChute(blockState)) spawnAirFlow(up ? 0 : 1, up ? 1 : 0, absMotion, 1); if (!up && BlockHelper.noCollisionInSpace(world, pos.down())) spawnAirFlow(0, -1, absMotion, .5f); - if (up && bottomPullDistance > 0) { + if (up && canCollectItemsFromBelow() && bottomPullDistance > 0) { spawnAirFlow(-bottomPullDistance, 0, absMotion, 2); spawnAirFlow(-bottomPullDistance, 0, absMotion, 2); } @@ -322,24 +319,52 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private void handleInputFromAbove() { if (!capAbove.isPresent()) capAbove = grabCapability(Direction.UP); - if (capAbove.isPresent()) - item = ItemHelper.extract(capAbove.orElse(null), stack -> true, ExtractionCountMode.UPTO, 16, false); + if (capAbove.isPresent()) { + int count = getExtractionAmount(); + if (count == 0) + item = + ItemHelper.extract(capAbove.orElse(null), this::canAcceptItem, ExtractionCountMode.UPTO, 16, false); + else + item = ItemHelper.extract(capAbove.orElse(null), this::canAcceptItem, ExtractionCountMode.EXACTLY, + count, false); + } } private void handleInputFromBelow() { if (!capBelow.isPresent()) capBelow = grabCapability(Direction.DOWN); - if (capBelow.isPresent()) - item = ItemHelper.extract(capBelow.orElse(null), stack -> true, ExtractionCountMode.UPTO, 16, false); + if (capBelow.isPresent()) { + int count = getExtractionAmount(); + if (count == 0) + item = + ItemHelper.extract(capBelow.orElse(null), this::canAcceptItem, ExtractionCountMode.UPTO, 16, false); + else + item = ItemHelper.extract(capBelow.orElse(null), this::canAcceptItem, ExtractionCountMode.EXACTLY, + count, false); + } } private boolean handleDownwardOutput(boolean simulate) { BlockState blockState = getBlockState(); ChuteTileEntity targetChute = getTargetChute(blockState); - Direction direction = blockState.get(ChuteBlock.FACING); + Direction direction = AbstractChuteBlock.getChuteFacing(blockState); + + if (world == null) + return false; + if (!capBelow.isPresent()) + capBelow = grabCapability(Direction.DOWN); + if (capBelow.isPresent()) { + ItemStack remainder = ItemHandlerHelper.insertItemStacked(capBelow.orElse(null), item, simulate); + if (!simulate) + setItem(remainder); + if (remainder.isEmpty()) + return true; + if (direction == Direction.DOWN) + return false; + } if (targetChute != null) { - boolean canInsert = targetChute.item.isEmpty(); + boolean canInsert = targetChute.canAcceptItem(item); if (!simulate && canInsert) { targetChute.setItem(item, direction == Direction.DOWN ? 1 : .51f); setItem(ItemStack.EMPTY); @@ -347,42 +372,33 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return canInsert; } - // Diagonal chutes can only insert into other chutes - if (world == null || direction.getAxis() + // Diagonal chutes cannot drop items + if (direction.getAxis() .isHorizontal()) return false; - BlockState stateBelow = world.getBlockState(pos.down()); - if (stateBelow.getBlock() instanceof FunnelBlock) { - if (stateBelow.has(BrassFunnelBlock.POWERED) && stateBelow.get(BrassFunnelBlock.POWERED)) - return false; - if (stateBelow.get(BrassFunnelBlock.FACING) != Direction.UP) - return false; - ItemStack remainder = FunnelBlock.tryInsert(world, pos.down(), item, simulate); - if (!simulate) - setItem(remainder); - return remainder.isEmpty(); - } - - DirectBeltInputBehaviour directInput = - TileEntityBehaviour.get(world, pos.down(), DirectBeltInputBehaviour.TYPE); - if (directInput != null) { - if (!directInput.canInsertFromSide(Direction.UP)) - return false; - ItemStack remainder = directInput.handleInsertion(item, Direction.UP, simulate); - if (!simulate) - setItem(remainder); - return remainder.isEmpty(); - } - - if (!capBelow.isPresent()) - capBelow = grabCapability(Direction.DOWN); - if (capBelow.isPresent()) { - ItemStack remainder = ItemHandlerHelper.insertItemStacked(capBelow.orElse(null), item, simulate); - if (!simulate) - setItem(ItemStack.EMPTY); - return remainder.isEmpty(); - } +// BlockState stateBelow = world.getBlockState(pos.down()); +// if (stateBelow.getBlock() instanceof FunnelBlock) { +// if (stateBelow.has(BrassFunnelBlock.POWERED) && stateBelow.get(BrassFunnelBlock.POWERED)) +// return false; +// if (stateBelow.get(BrassFunnelBlock.FACING) != Direction.UP) +// return false; +// ItemStack remainder = FunnelBlock.tryInsert(world, pos.down(), item, simulate); +// if (!simulate) +// setItem(remainder); +// return remainder.isEmpty(); +// } +// +// DirectBeltInputBehaviour directInput = +// TileEntityBehaviour.get(world, pos.down(), DirectBeltInputBehaviour.TYPE); +// if (directInput != null) { +// if (!directInput.canInsertFromSide(Direction.UP)) +// return false; +// ItemStack remainder = directInput.handleInsertion(item, Direction.UP, simulate); +// if (!simulate) +// setItem(remainder); +// return remainder.isEmpty(); +// } if (Block.hasSolidSideOnTop(world, pos.down())) return false; @@ -402,22 +418,36 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private boolean handleUpwardOutput(boolean simulate) { BlockState stateAbove = world.getBlockState(pos.up()); - if (stateAbove.getBlock() instanceof FunnelBlock) { - boolean powered = stateAbove.has(BrassFunnelBlock.POWERED) && stateAbove.get(BrassFunnelBlock.POWERED); - if (!powered && stateAbove.get(BrassFunnelBlock.FACING) == Direction.DOWN) { - ItemStack remainder = FunnelBlock.tryInsert(world, pos.up(), item, simulate); - if (remainder.isEmpty()) { - if (!simulate) - setItem(remainder); - return true; - } +// if (stateAbove.getBlock() instanceof FunnelBlock) { +// boolean powered = stateAbove.has(BrassFunnelBlock.POWERED) && stateAbove.get(BrassFunnelBlock.POWERED); +// if (!powered && stateAbove.get(BrassFunnelBlock.FACING) == Direction.DOWN) { +// ItemStack remainder = FunnelBlock.tryInsert(world, pos.up(), item, simulate); +// if (remainder.isEmpty()) { +// if (!simulate) +// setItem(remainder); +// return true; +// } +// } +// } + + if (world == null) + return false; + + if (AbstractChuteBlock.isOpenChute(getBlockState())) { + if (!capAbove.isPresent()) + capAbove = grabCapability(Direction.UP); + if (capAbove.isPresent()) { + ItemStack remainder = ItemHandlerHelper.insertItemStacked(capAbove.orElse(null), item, simulate); + if (!simulate) + setItem(ItemStack.EMPTY); + return remainder.isEmpty(); } } ChuteTileEntity bestOutput = null; List inputChutes = getInputChutes(); for (ChuteTileEntity targetChute : inputChutes) { - if (!targetChute.item.isEmpty()) + if (!targetChute.canAcceptItem(item)) continue; float itemMotion = targetChute.getItemMotion(); if (itemMotion < 0) @@ -435,15 +465,6 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return true; } - if (!capAbove.isPresent()) - capAbove = grabCapability(Direction.UP); - if (capAbove.isPresent()) { - ItemStack remainder = ItemHandlerHelper.insertItemStacked(capAbove.orElse(null), item, simulate); - if (!simulate) - setItem(ItemStack.EMPTY); - return remainder.isEmpty(); - } - if (Block.hasSolidSide(stateAbove, world, pos.up(), Direction.DOWN)) return false; if (!inputChutes.isEmpty()) @@ -461,12 +482,25 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return true; } + protected boolean canAcceptItem(ItemStack stack) { + return item.isEmpty(); + } + + protected int getExtractionAmount() { + return 0; + } + + protected boolean canCollectItemsFromBelow() { + return true; + } + private LazyOptional grabCapability(Direction side) { BlockPos pos = this.pos.offset(side); if (world == null) return LazyOptional.empty(); TileEntity te = world.getTileEntity(pos); - if (te == null || te instanceof ChuteTileEntity) + if (te == null + || (te instanceof ChuteTileEntity) && (side != Direction.DOWN || !(te instanceof SmartChuteTileEntity))) return LazyOptional.empty(); return te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()); } @@ -626,13 +660,15 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private ChuteTileEntity getTargetChute(BlockState state) { if (world == null) return null; - Direction targetDirection = state.get(ChuteBlock.FACING); + Direction targetDirection = AbstractChuteBlock.getChuteFacing(state); + if (targetDirection == null) + return null; BlockPos chutePos = pos.down(); if (targetDirection.getAxis() .isHorizontal()) chutePos = chutePos.offset(targetDirection.getOpposite()); BlockState chuteState = world.getBlockState(chutePos); - if (!AllBlocks.CHUTE.has(chuteState)) + if (!AbstractChuteBlock.isChute(chuteState)) return null; TileEntity te = world.getTileEntity(chutePos); if (te instanceof ChuteTileEntity) @@ -661,7 +697,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor .isHorizontal()) chutePos = chutePos.offset(direction); BlockState chuteState = world.getBlockState(chutePos); - if (!AllBlocks.CHUTE.has(chuteState) || chuteState.get(ChuteBlock.FACING) != direction) + Direction chuteFacing = AbstractChuteBlock.getChuteFacing(chuteState); + if (chuteFacing != direction) return null; TileEntity te = world.getTileEntity(chutePos); if (te instanceof ChuteTileEntity && !te.isRemoved()) @@ -683,6 +720,13 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor + Lang.translate("tooltip.chute.fans_" + (push > 0 ? "push_up" : "pull_down"))); tooltip.add(spacing + TextFormatting.YELLOW + "-> " + Lang.translate("tooltip.chute.items_move_" + (downward ? "down" : "up"))); + if (!item.isEmpty()) { + tooltip.add(spacing + TextFormatting.GREEN + + Lang.translate("tooltip.chute.contains", + TextFormatting.RESET + new TranslationTextComponent(item.getItem() + .getTranslationKey(item)).getString(), + item.getCount())); + } return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java new file mode 100644 index 000000000..eadcd71fa --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java @@ -0,0 +1,63 @@ +package com.simibubi.create.content.logistics.block.chute; + +import com.simibubi.create.AllTileEntities; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; + +public class SmartChuteBlock extends AbstractChuteBlock { + + public SmartChuteBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + setDefaultState(getDefaultState().with(POWERED, true)); + } + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); + if (worldIn.isRemote) + return; + boolean previouslyPowered = state.get(POWERED); + if (previouslyPowered != worldIn.isBlockPowered(pos)) + worldIn.setBlockState(pos, state.cycle(POWERED), 2); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) { + return super.getStateForPlacement(p_196258_1_).with(POWERED, p_196258_1_.getWorld() + .isBlockPowered(p_196258_1_.getPos())); + } + + @Override + public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.SMART_CHUTE.create(); + } + + @Override + protected void fillStateContainer(Builder p_206840_1_) { + super.fillStateContainer(p_206840_1_.add(POWERED)); + } + + @Override + public BlockState updateChuteState(BlockState state, BlockState above, IBlockReader world, BlockPos pos) { + return state; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java new file mode 100644 index 000000000..7be5fd067 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.block.chute; + +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.Vec3d; + +public class SmartChuteFilterSlotPositioning extends ValueBoxTransform.Sided { + + @Override + protected Vec3d getLocalOffset(BlockState state) { + Direction side = getSide(); + float horizontalAngle = AngleHelper.horizontalAngle(side); + Vec3d southLocation = VecHelper.voxelSpace(8, 12, 15.5f); + return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); + } + + @Override + protected boolean isSideActive(BlockState state, Direction direction) { + return direction.getAxis() + .isHorizontal(); + } + + @Override + protected Vec3d getSouthLocation() { + return Vec3d.ZERO; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteRenderer.java new file mode 100644 index 000000000..2098babf7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteRenderer.java @@ -0,0 +1,26 @@ +package com.simibubi.create.content.logistics.block.chute; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; + +public class SmartChuteRenderer extends SmartTileEntityRenderer { + + public SmartChuteRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(SmartChuteTileEntity tileEntityIn, float partialTicks, MatrixStack ms, + IRenderTypeBuffer buffer, int light, int overlay) { + super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, overlay); + if (tileEntityIn.item.isEmpty()) + return; + if (tileEntityIn.itemPosition.get(partialTicks) > 0) + return; + ChuteRenderer.renderItem(tileEntityIn, partialTicks, ms, buffer, light, overlay); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteTileEntity.java new file mode 100644 index 000000000..d2ba5c271 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteTileEntity.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.logistics.block.chute; + +import java.util.List; + +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; + +public class SmartChuteTileEntity extends ChuteTileEntity { + + FilteringBehaviour filtering; + + public SmartChuteTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + + @Override + protected boolean canAcceptItem(ItemStack stack) { + return super.canAcceptItem(stack) && canCollectItemsFromBelow(); + } + + @Override + protected int getExtractionAmount() { + return filtering.isCountVisible() ? filtering.getAmount() : 0; + } + + @Override + protected boolean canCollectItemsFromBelow() { + BlockState blockState = getBlockState(); + return blockState.has(SmartChuteBlock.POWERED) && !blockState.get(SmartChuteBlock.POWERED); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(filtering = + new FilteringBehaviour(this, new SmartChuteFilterSlotPositioning()).showCountWhen(this::isExtracting)); + super.addBehaviours(behaviours); + } + + private boolean isExtracting() { + boolean up = getItemMotion() < 0; + BlockPos chutePos = pos.offset(up ? Direction.UP : Direction.DOWN); + BlockState blockState = world.getBlockState(chutePos); + return !AbstractChuteBlock.isChute(blockState) && !blockState.getMaterial() + .isReplaceable(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java new file mode 100644 index 000000000..758ee2417 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java @@ -0,0 +1,142 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; +import com.simibubi.create.foundation.utility.BlockHelper; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public abstract class AbstractFunnelBlock extends HorizontalBlock implements ITE, IWrenchable { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + protected AbstractFunnelBlock(Properties p_i48377_1_) { + super(p_i48377_1_); + setDefaultState(getDefaultState().with(POWERED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + Direction facing = context.getPlacementHorizontalFacing() + .getOpposite(); + return getDefaultState().with(HORIZONTAL_FACING, facing) + .with(POWERED, context.getWorld() + .isBlockPowered(context.getPos())); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(POWERED, HORIZONTAL_FACING)); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean addDestroyEffects(BlockState state, World world, BlockPos pos, ParticleManager manager) { + BlockHelper.addReducedDestroyEffects(state, world, pos, manager); + return true; + } + + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + if (worldIn.isRemote) + return; + boolean previouslyPowered = state.get(POWERED); + if (previouslyPowered != worldIn.isBlockPowered(pos)) + worldIn.setBlockState(pos, state.cycle(POWERED), 2); + } + + public static ItemStack tryInsert(World worldIn, BlockPos pos, ItemStack toInsert, boolean simulate) { + FilteringBehaviour filter = TileEntityBehaviour.get(worldIn, pos, FilteringBehaviour.TYPE); + InvManipulationBehaviour inserter = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE); + if (inserter == null) + return toInsert; + if (filter != null && !filter.test(toInsert)) + return toInsert; + if (simulate) + inserter.simulate(); + ItemStack insert = inserter.insert(toInsert); + + if (!simulate && insert.getCount() != toInsert.getCount()) { + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (tileEntity instanceof FunnelTileEntity) { + FunnelTileEntity funnelTileEntity = (FunnelTileEntity) tileEntity; + funnelTileEntity.onTransfer(toInsert); + if (funnelTileEntity.hasFlap()) + funnelTileEntity.flap(true); + } + } + return insert; + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.FUNNEL.create(); + } + + @Override + public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + Block block = world.getBlockState(pos.offset(getFunnelFacing(state).getOpposite())) + .getBlock(); + return !(block instanceof AbstractFunnelBlock); + } + + @Nullable + public static boolean isFunnel(BlockState state) { + return state.getBlock() instanceof AbstractFunnelBlock; + } + + @Nullable + public static Direction getFunnelFacing(BlockState state) { + if (!(state.getBlock() instanceof AbstractFunnelBlock)) + return null; + return ((AbstractFunnelBlock) state.getBlock()).getFacing(state); + } + + protected Direction getFacing(BlockState state) { + return state.get(BlockStateProperties.HORIZONTAL_FACING); + } + + @Override + public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, + boolean p_196243_5_) { + if (p_196243_1_.hasTileEntity() && (p_196243_1_.getBlock() != p_196243_4_.getBlock() && !isFunnel(p_196243_4_) + || !p_196243_4_.hasTileEntity())) { + TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); + p_196243_2_.removeTileEntity(p_196243_3_); + } + } + + @Override + public Class getTileEntityClass() { + return FunnelTileEntity.class; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteBeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteBeltFunnelBlock.java deleted file mode 100644 index 9bf729408..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteBeltFunnelBlock.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.simibubi.create.content.logistics.block.funnel; - -import com.simibubi.create.AllBlocks; - -public class AndesiteBeltFunnelBlock extends BeltFunnelBlock { - - public AndesiteBeltFunnelBlock(Properties p_i48377_1_) { - super(AllBlocks.ANDESITE_FUNNEL, p_i48377_1_); - } - - @Override - public boolean hasPoweredProperty() { - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java index b4389e5ab..6db0b2b2f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java @@ -15,7 +15,7 @@ public class AndesiteFunnelBlock extends FunnelBlock { @Override public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { - Direction facing = state.get(FACING); + Direction facing = state.get(HORIZONTAL_FACING); return AllBlocks.ANDESITE_BELT_FUNNEL.getDefaultState() .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) .with(POWERED, state.get(POWERED)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index 6f4061b7c..40c6de55a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -2,35 +2,27 @@ package com.simibubi.create.content.logistics.block.funnel; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; -import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VoxelShaper; import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalBlock; -import net.minecraft.client.particle.ParticleManager; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; -import net.minecraft.state.BooleanProperty; import net.minecraft.state.EnumProperty; import net.minecraft.state.IProperty; import net.minecraft.state.StateContainer.Builder; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.IStringSerializable; @@ -42,14 +34,10 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrenchable, ISpecialBlockItemRequirement { +public class BeltFunnelBlock extends AbstractFunnelBlock implements ISpecialBlockItemRequirement { private BlockEntry parent; - - public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); public enum Shape implements IStringSerializable { @@ -57,7 +45,6 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED), PUSHING(AllShapes.BELT_FUNNEL_PERPENDICULAR), PULLING(AllShapes.BELT_FUNNEL_PERPENDICULAR); -// CONNECTED(AllShapes.BELT_FUNNEL_CONNECTED); VoxelShaper shaper; @@ -74,29 +61,12 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench public BeltFunnelBlock(BlockEntry parent, Properties p_i48377_1_) { super(p_i48377_1_); this.parent = parent; - BlockState defaultState = getDefaultState().with(SHAPE, Shape.RETRACTED); - if (hasPoweredProperty()) - defaultState = defaultState.with(POWERED, false); - setDefaultState(defaultState); - } - - public abstract boolean hasPoweredProperty(); - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.FUNNEL.create(); + setDefaultState(getDefaultState().with(SHAPE, Shape.RETRACTED)); } @Override protected void fillStateContainer(Builder p_206840_1_) { - if (hasPoweredProperty()) - p_206840_1_.add(POWERED); - super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, SHAPE)); + super.fillStateContainer(p_206840_1_.add(SHAPE)); } @Override @@ -105,46 +75,38 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench return state.get(SHAPE).shaper.get(state.get(HORIZONTAL_FACING)); } + @Override + public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, + ISelectionContext p_220071_4_) { + if (p_220071_4_.getEntity() instanceof ItemEntity + && (p_220071_1_.get(SHAPE) == Shape.PULLING || p_220071_1_.get(SHAPE) == Shape.PUSHING)) + return AllShapes.FUNNEL_COLLISION.get(getFacing(p_220071_1_)); + return getShape(p_220071_1_, p_220071_2_, p_220071_3_, p_220071_4_); + } + @Override public BlockState getStateForPlacement(BlockItemUseContext ctx) { BlockState stateForPlacement = super.getStateForPlacement(ctx); BlockPos pos = ctx.getPos(); World world = ctx.getWorld(); - Direction facing = ctx.getPlayer() == null || ctx.getPlayer() - .isSneaking() ? ctx.getFace() - : ctx.getNearestLookingDirection() - .getOpposite(); - - if (hasPoweredProperty()) - stateForPlacement = stateForPlacement.with(POWERED, world.isBlockPowered(pos)); + Direction facing = ctx.getFace() + .getAxis() + .isHorizontal() ? ctx.getFace() : ctx.getPlacementHorizontalFacing(); BlockState state = stateForPlacement.with(HORIZONTAL_FACING, facing); - return state.with(SHAPE, getShapeForPosition(world, pos, facing)); + boolean sneaking = ctx.getPlayer() != null && ctx.getPlayer() + .isSneaking(); + return state.with(SHAPE, getShapeForPosition(world, pos, facing, !sneaking)); } - public static Shape getShapeForPosition(IBlockReader world, BlockPos pos, Direction facing) { + public static Shape getShapeForPosition(IBlockReader world, BlockPos pos, Direction facing, boolean extracting) { BlockPos posBelow = pos.down(); BlockState stateBelow = world.getBlockState(posBelow); + Shape perpendicularState = extracting ? Shape.PUSHING : Shape.PULLING; if (!AllBlocks.BELT.has(stateBelow)) - return Shape.PUSHING; + return perpendicularState; Direction movementFacing = stateBelow.get(BeltBlock.HORIZONTAL_FACING); - return movementFacing.getAxis() != facing.getAxis() ? Shape.PUSHING : Shape.RETRACTED; - } - - @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { - if (state.hasTileEntity() && (state.getBlock() != newState.getBlock() && !FunnelBlock.isFunnel(newState) - || !newState.hasTileEntity())) { - TileEntityBehaviour.destroy(world, pos, FilteringBehaviour.TYPE); - world.removeTileEntity(pos); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean addDestroyEffects(BlockState state, World world, BlockPos pos, ParticleManager manager) { - BlockHelper.addReducedDestroyEffects(state, world, pos, manager); - return true; + return movementFacing.getAxis() != facing.getAxis() ? perpendicularState : Shape.RETRACTED; } @Override @@ -160,9 +122,12 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench BlockState parentState = parent.getDefaultState(); if (state.has(POWERED) && state.get(POWERED)) parentState = parentState.with(POWERED, true); - return parentState.with(FunnelBlock.FACING, state.get(HORIZONTAL_FACING)); + if (state.get(SHAPE) == Shape.PUSHING) + parentState = parentState.with(FunnelBlock.EXTRACTING, true); + return parentState.with(FunnelBlock.HORIZONTAL_FACING, state.get(HORIZONTAL_FACING)); } - Shape updatedShape = getShapeForPosition(world, pos, state.get(HORIZONTAL_FACING)); + Shape updatedShape = + getShapeForPosition(world, pos, state.get(HORIZONTAL_FACING), state.get(SHAPE) == Shape.PUSHING); Shape currentShape = state.get(SHAPE); if (updatedShape == currentShape) return state; @@ -185,19 +150,6 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench if (directBeltInputBehaviour == null) return false; return directBeltInputBehaviour.canSupportBeltFunnels(); - - } - - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - if (!hasPoweredProperty()) - return; - if (worldIn.isRemote) - return; - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) - worldIn.setBlockState(pos, state.cycle(POWERED), 2); } @Override @@ -238,7 +190,7 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench } return ActionResultType.SUCCESS; } - + @Override public ItemRequirement getRequiredItems(BlockState state) { return ItemRequirement.of(parent.getDefaultState()); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassBeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassBeltFunnelBlock.java deleted file mode 100644 index 17dae6807..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassBeltFunnelBlock.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.simibubi.create.content.logistics.block.funnel; - -import com.simibubi.create.AllBlocks; - -public class BrassBeltFunnelBlock extends BeltFunnelBlock { - - public BrassBeltFunnelBlock(Properties p_i48377_1_) { - super(AllBlocks.BRASS_FUNNEL, p_i48377_1_); - } - - @Override - public boolean hasPoweredProperty() { - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java index 6ad5e81f0..290c44154 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java @@ -15,7 +15,7 @@ public class BrassFunnelBlock extends FunnelBlock { @Override public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { - Direction facing = state.get(FACING); + Direction facing = state.get(HORIZONTAL_FACING); return AllBlocks.BRASS_BELT_FUNNEL.getDefaultState() .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) .with(POWERED, state.get(POWERED)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java index c1cef9f52..6f7da7985 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java @@ -1,15 +1,8 @@ package com.simibubi.create.content.logistics.block.funnel; -import javax.annotation.Nullable; - import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; -import com.simibubi.create.AllTileEntities; -import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.block.ProperDirectionalBlock; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.Block; @@ -19,10 +12,12 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; import net.minecraft.state.BooleanProperty; +import net.minecraft.state.EnumProperty; import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.AttachFace; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; @@ -34,42 +29,47 @@ import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; -import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE { +public abstract class FunnelBlock extends AbstractFunnelBlock { - public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public static final EnumProperty FACE = BlockStateProperties.FACE; + public static final BooleanProperty EXTRACTING = BooleanProperty.create("extracting"); public FunnelBlock(Properties p_i48415_1_) { super(p_i48415_1_); - setDefaultState(getDefaultState().with(POWERED, false)); + setDefaultState(getDefaultState().with(FACE, AttachFace.WALL) + .with(EXTRACTING, false)); } + public abstract BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state); + @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - Direction facing = context.getPlayer() == null || context.getPlayer() - .isSneaking() ? context.getFace() - : context.getNearestLookingDirection() - .getOpposite(); - return getDefaultState().with(FACING, facing) - .with(POWERED, context.getWorld() - .isBlockPowered(context.getPos())); + BlockState state = super.getStateForPlacement(context); + + boolean sneak = context.getPlayer() != null && context.getPlayer() + .isSneaking(); + state = state.with(EXTRACTING, !sneak); + + for (Direction direction : context.getNearestLookingDirections()) { + BlockState blockstate; + if (direction.getAxis() == Direction.Axis.Y) + blockstate = state.with(FACE, direction == Direction.UP ? AttachFace.CEILING : AttachFace.FLOOR) + .with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing()); + else + blockstate = state.with(FACE, AttachFace.WALL) + .with(HORIZONTAL_FACING, direction.getOpposite()); + if (blockstate.isValidPosition(context.getWorld(), context.getPos())) + return blockstate.with(POWERED, state.get(POWERED)); + } + + return state; } @Override protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(POWERED)); - } - - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - if (worldIn.isRemote) - return; - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) - worldIn.setBlockState(pos, state.cycle(POWERED), 2); + super.fillStateContainer(builder.add(FACE, EXTRACTING)); } @Override @@ -79,6 +79,9 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< ItemStack heldItem = player.getHeldItem(handIn); boolean shouldntInsertItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem) || !canInsertIntoFunnel(state); + if (AllItems.WRENCH.isIn(heldItem)) + return ActionResultType.PASS; + if (hit.getFace() == getFunnelFacing(state) && !shouldntInsertItem) { if (!worldIn.isRemote) withTileEntityDo(worldIn, pos, te -> { @@ -93,6 +96,14 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< return ActionResultType.PASS; } + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + World world = context.getWorld(); + if (!world.isRemote) + world.setBlockState(context.getPos(), state.cycle(EXTRACTING)); + return ActionResultType.SUCCESS; + } + @Override public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { if (worldIn.isRemote) @@ -105,7 +116,7 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< return; ItemEntity itemEntity = (ItemEntity) entityIn; - Direction direction = state.get(FACING); + Direction direction = getFunnelFacing(state); Vec3d diff = entityIn.getPositionVec() .subtract(VecHelper.getCenterOf(pos)); double projectedDiff = direction.getAxis() @@ -122,105 +133,44 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< itemEntity.setItem(remainder); } - public static ItemStack tryInsert(World worldIn, BlockPos pos, ItemStack toInsert, boolean simulate) { - FilteringBehaviour filter = TileEntityBehaviour.get(worldIn, pos, FilteringBehaviour.TYPE); - InvManipulationBehaviour inserter = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE); - if (inserter == null) - return toInsert; - if (filter != null && !filter.test(toInsert)) - return toInsert; - if (simulate) - inserter.simulate(); - ItemStack insert = inserter.insert(toInsert); - - if (!simulate && insert.getCount() != toInsert.getCount()) { - TileEntity tileEntity = worldIn.getTileEntity(pos); - if (tileEntity instanceof FunnelTileEntity) - ((FunnelTileEntity) tileEntity).onTransfer(toInsert); - } - - return insert; + protected boolean canInsertIntoFunnel(BlockState state) { + return !state.get(POWERED) && !state.get(EXTRACTING); } @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.FUNNEL.create(); + protected Direction getFacing(BlockState state) { + if (state.get(FACE) == AttachFace.CEILING) + return Direction.DOWN; + if (state.get(FACE) == AttachFace.FLOOR) + return Direction.UP; + return super.getFacing(state); } @Override public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { - return AllShapes.FUNNEL.get(state.get(FACING)); + AttachFace attachFace = state.get(FACE); + return attachFace == AttachFace.CEILING ? AllShapes.FUNNEL_CEILING + : attachFace == AttachFace.FLOOR ? AllShapes.FUNNEL_FLOOR + : AllShapes.FUNNEL.get(state.get(HORIZONTAL_FACING)); } @Override public VoxelShape getCollisionShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { - if (context.getEntity() instanceof ItemEntity) - return AllShapes.FUNNEL_COLLISION.get(state.get(FACING)); + if (context.getEntity() instanceof ItemEntity && state.get(FACE) == AttachFace.WALL) + return AllShapes.FUNNEL_COLLISION.get(getFacing(state)); return getShape(state, world, pos, context); } @Override public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world, BlockPos pos, BlockPos p_196271_6_) { - Direction facing = state.get(FACING); - if (facing.getAxis() - .isHorizontal()) { - if (direction == Direction.DOWN) { - BlockState equivalentFunnel = getEquivalentBeltFunnel(null, null, state); - if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos)) - return equivalentFunnel.with(BeltFunnelBlock.SHAPE, - BeltFunnelBlock.getShapeForPosition(world, pos, facing)); - } - } + if (state.get(FACE) != AttachFace.WALL || direction != Direction.DOWN) + return state; + BlockState equivalentFunnel = getEquivalentBeltFunnel(null, null, state); + if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos)) + return equivalentFunnel.with(BeltFunnelBlock.SHAPE, + BeltFunnelBlock.getShapeForPosition(world, pos, getFacing(state), state.get(EXTRACTING))); return state; } - public abstract BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state); - - @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { - Block block = world.getBlockState(pos.offset(state.get(FACING) - .getOpposite())) - .getBlock(); - return !(block instanceof FunnelBlock) && !(block instanceof BeltFunnelBlock); - } - - @Nullable - public static Direction getFunnelFacing(BlockState state) { - if (state.has(FACING)) - return state.get(FACING); - if (state.has(BlockStateProperties.HORIZONTAL_FACING)) - return state.get(BlockStateProperties.HORIZONTAL_FACING); - return null; - } - - @Override - public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, - boolean p_196243_5_) { - if (p_196243_1_.hasTileEntity() && (p_196243_1_.getBlock() != p_196243_4_.getBlock() && !isFunnel(p_196243_4_) - || !p_196243_4_.hasTileEntity())) { - TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); - p_196243_2_.removeTileEntity(p_196243_3_); - } - } - - protected boolean canInsertIntoFunnel(BlockState state) { - return !state.get(POWERED); - } - - @Nullable - public static boolean isFunnel(BlockState state) { - return state.getBlock() instanceof FunnelBlock || state.getBlock() instanceof BeltFunnelBlock; - } - - @Override - public Class getTileEntityClass() { - return FunnelTileEntity.class; - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index f76caa4f0..450de2cc3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -4,14 +4,13 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.DirectionHelper; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.state.properties.AttachFace; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.Vec3d; public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { @@ -26,8 +25,6 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { if (state.getBlock() instanceof BeltFunnelBlock) { switch (state.get(BeltFunnelBlock.SHAPE)) { -// case CONNECTED: -// return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 15.5f, 8), stateAngle, Axis.Y); case EXTENDED: return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 15.5f, 13), stateAngle, Axis.Y); case PULLING: @@ -39,66 +36,75 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { } } - if (!funnelFacing.getAxis() - .isHorizontal()) { - Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 3 : 13, 15.5f); - return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); + if (state.getBlock() instanceof FunnelBlock) { + if (state.get(FunnelBlock.FACE) == AttachFace.WALL) + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12.1, 8.7f), horizontalAngle, Axis.Y); + Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 6.5f : 9.5f, 13f); + return VecHelper.rotateCentered(southLocation, + AngleHelper.horizontalAngle(state.get(AbstractFunnelBlock.HORIZONTAL_FACING)), Axis.Y); } - Direction verticalDirection = DirectionHelper.rotateAround(getSide(), funnelFacing.rotateY() - .getAxis()); - if (funnelFacing.getAxis() == Axis.Z) - verticalDirection = verticalDirection.getOpposite(); - float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180; - float xRot = -90; - boolean alongX = funnelFacing.getAxis() == Axis.X; - float zRotLast = alongX ^ funnelFacing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; + return Vec3d.ZERO; - Vec3d vec = VecHelper.voxelSpace(8, 13, .5f); - vec = vec.subtract(.5, .5, .5); - vec = VecHelper.rotate(vec, zRotLast, Axis.Z); - vec = VecHelper.rotate(vec, yRot, Axis.Y); - vec = VecHelper.rotate(vec, alongX ? 0 : xRot, Axis.X); - vec = VecHelper.rotate(vec, alongX ? xRot : 0, Axis.Z); - vec = vec.add(.5, .5, .5); - return vec; +// if (!funnelFacing.getAxis() +// .isHorizontal()) { +// Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 3 : 13, 15.5f); +// return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); +// } +// +// Direction verticalDirection = DirectionHelper.rotateAround(getSide(), funnelFacing.rotateY() +// .getAxis()); +// if (funnelFacing.getAxis() == Axis.Z) +// verticalDirection = verticalDirection.getOpposite(); +// float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180; +// float xRot = -90; +// boolean alongX = funnelFacing.getAxis() == Axis.X; +// float zRotLast = alongX ^ funnelFacing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; +// +// Vec3d vec = VecHelper.voxelSpace(8, 13, .5f); +// vec = vec.subtract(.5, .5, .5); +// vec = VecHelper.rotate(vec, zRotLast, Axis.Z); +// vec = VecHelper.rotate(vec, yRot, Axis.Y); +// vec = VecHelper.rotate(vec, alongX ? 0 : xRot, Axis.X); +// vec = VecHelper.rotate(vec, alongX ? xRot : 0, Axis.Z); +// vec = vec.add(.5, .5, .5); +// return vec; } @Override protected void rotate(BlockState state, MatrixStack ms) { Direction facing = FunnelBlock.getFunnelFacing(state); - if (facing.getAxis() - .isVertical()) { - super.rotate(state, ms); - return; - } +// if (facing.getAxis() +// .isVertical()) { +// super.rotate(state, ms); +// return; +// } boolean isBeltFunnel = state.getBlock() instanceof BeltFunnelBlock; if (isBeltFunnel && state.get(BeltFunnelBlock.SHAPE) != Shape.EXTENDED) { Shape shape = state.get(BeltFunnelBlock.SHAPE); super.rotate(state, ms); if (shape == Shape.PULLING || shape == Shape.PUSHING) - MatrixStacker.of(ms).rotateX(-22.5f); + MatrixStacker.of(ms) + .rotateX(-22.5f); return; } - Direction verticalDirection = DirectionHelper.rotateAround(getSide(), facing.rotateY() - .getAxis()); - if (facing.getAxis() == Axis.Z) - verticalDirection = verticalDirection.getOpposite(); - - float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180; - float xRot = -90; - boolean alongX = facing.getAxis() == Axis.X; - float zRotLast = alongX ^ facing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; - + if (state.getBlock() instanceof FunnelBlock) { + if (state.get(FunnelBlock.FACE) == AttachFace.WALL) { + super.rotate(state, ms); + MatrixStacker.of(ms) + .rotateX(-22.5f); + return; + } + } + float yRot = AngleHelper.horizontalAngle(state.get(AbstractFunnelBlock.HORIZONTAL_FACING)) + + (facing == Direction.DOWN ? 180 : 0); MatrixStacker.of(ms) - .rotateZ(alongX ? xRot : 0) - .rotateX(alongX ? 0 : xRot) .rotateY(yRot) - .rotateZ(zRotLast); + .rotateX(facing == Direction.DOWN ? -90 : 90); } @Override @@ -107,11 +113,9 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { if (facing == null) return false; - - if (state.getBlock() instanceof BeltFunnelBlock) - return state.get(BeltFunnelBlock.SHAPE) != Shape.EXTENDED ? direction == facing : direction == Direction.UP; - - return direction.getAxis() != facing.getAxis(); + if (state.getBlock() instanceof BeltFunnelBlock && state.get(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) + return direction == Direction.UP; + return direction == facing; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java index cd372d720..c7a0a6357 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java @@ -1,13 +1,12 @@ package com.simibubi.create.content.logistics.block.funnel; -import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.state.properties.AttachFace; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -39,15 +38,10 @@ public class FunnelItem extends BlockItem { return state; if (!(state.getBlock() instanceof FunnelBlock)) return state; - Direction direction = state.get(FunnelBlock.FACING); - if (!direction.getAxis() - .isHorizontal()) { - TileEntity tileEntity = world.getTileEntity(pos.offset(direction.getOpposite())); - if (tileEntity instanceof ChuteTileEntity && ((ChuteTileEntity) tileEntity).getItemMotion() > 0) - state = state.with(FunnelBlock.FACING, direction.getOpposite()); + if (state.get(FunnelBlock.FACE) != AttachFace.WALL) return state; - } + Direction direction = state.get(FunnelBlock.HORIZONTAL_FACING); FunnelBlock block = (FunnelBlock) getBlock(); Block beltFunnelBlock = block.getEquivalentBeltFunnel(world, pos, state) .getBlock(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index ed0f46a09..df8029515 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -9,6 +9,7 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -29,12 +30,14 @@ public class FunnelRenderer extends SmartTileEntityRenderer { if (!te.hasFlap()) return; + BlockState blockState = te.getBlockState(); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - SuperByteBuffer flapBuffer = AllBlockPartials.BELT_FUNNEL_FLAP.renderOn(te.getBlockState()); + SuperByteBuffer flapBuffer = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP + : AllBlockPartials.BELT_FUNNEL_FLAP).renderOn(blockState); Vec3d pivot = VecHelper.voxelSpace(0, 10, 9.5f); MatrixStacker msr = MatrixStacker.of(ms); - float horizontalAngle = AngleHelper.horizontalAngle(FunnelBlock.getFunnelFacing(te.getBlockState()) + float horizontalAngle = AngleHelper.horizontalAngle(FunnelBlock.getFunnelFacing(blockState) .getOpposite()); float f = te.flap.get(partialTicks); @@ -43,7 +46,7 @@ public class FunnelRenderer extends SmartTileEntityRenderer { .rotateY(horizontalAngle) .unCentre(); ms.translate(0, 0, -te.getFlapOffset()); - + for (int segment = 0; segment <= 3; segment++) { ms.push(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index 0404626ca..0a820f5eb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.logistics.block.funnel; +import java.lang.ref.WeakReference; import java.util.List; -import java.util.function.Function; -import java.util.function.Predicate; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; @@ -20,33 +19,38 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour.InterfaceProvider; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.state.properties.AttachFace; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringInformation { private FilteringBehaviour filtering; private InvManipulationBehaviour invManipulation; - private InvManipulationBehaviour autoExtractor; private int extractionCooldown; + private WeakReference lastObserved; // In-world Extractors only + int sendFlap; InterpolatedChasingValue flap; static enum Mode { - INVALID, PAUSED, COLLECT, PUSHING_TO_BELT, TAKING_FROM_BELT, HOPPER + INVALID, PAUSED, COLLECT, PUSHING_TO_BELT, TAKING_FROM_BELT, EXTRACT } public FunnelTileEntity(TileEntityType tileEntityTypeIn) { @@ -63,8 +67,6 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn return Mode.INVALID; if (state.has(BlockStateProperties.POWERED) && state.get(BlockStateProperties.POWERED)) return Mode.PAUSED; - if (FunnelBlock.getFunnelFacing(state) == Direction.UP && autoExtractor.hasInventory()) - return Mode.HOPPER; if (state.getBlock() instanceof BeltFunnelBlock) { Shape shape = state.get(BeltFunnelBlock.SHAPE); if (shape == Shape.PULLING) @@ -76,8 +78,12 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn if (belt != null) return belt.getMovementFacing() == state.get(BeltFunnelBlock.HORIZONTAL_FACING) ? Mode.PUSHING_TO_BELT : Mode.TAKING_FROM_BELT; + return Mode.INVALID; } - return Mode.COLLECT; + if (state.getBlock() instanceof FunnelBlock) + return state.get(FunnelBlock.EXTRACTING) ? Mode.EXTRACT : Mode.COLLECT; + + return Mode.INVALID; } @Override @@ -101,40 +107,87 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn if (mode == Mode.PUSHING_TO_BELT) activateExtractingBeltFunnel(); - if (mode == Mode.HOPPER) - activateHopper(); + if (mode == Mode.EXTRACT) + activateExtractor(); } - private void activateHopper() { - if (!invManipulation.hasInventory()) - return; - int amountToExtract = autoExtractor.getAmountFromFilter(); - if (!filtering.isActive()) - amountToExtract = 1; + private void activateExtractor() { + BlockState blockState = getBlockState(); + Direction facing = AbstractFunnelBlock.getFunnelFacing(blockState); - Predicate filter = s -> !filtering.isActive() || filtering.test(s); - Function amountThreshold = s -> { - int maxStackSize = s.getMaxStackSize(); - return maxStackSize - invManipulation.simulate() - .insert(ItemHandlerHelper.copyStackWithSize(s, maxStackSize)) - .getCount(); - }; - - if (amountToExtract != -1 && !invManipulation.simulate() - .insert(autoExtractor.simulate() - .extract(amountToExtract, filter)) - .isEmpty()) + if (facing == null) return; - ItemStack stack = autoExtractor.extract(amountToExtract, filter, amountThreshold); + boolean trackingEntityPresent = true; + AxisAlignedBB area = getEntityOverflowScanningArea(); + + // Check if last item is still blocking the extractor + if (lastObserved == null) { + trackingEntityPresent = false; + } else { + ItemEntity lastEntity = lastObserved.get(); + if (lastEntity == null || !lastEntity.isAlive() || !lastEntity.getBoundingBox() + .intersects(area)) { + trackingEntityPresent = false; + lastObserved = null; + } + } + + if (trackingEntityPresent) + return; + + // Find other entities blocking the extract (only if necessary) + int amountToExtract = getAmountToExtract(); + ItemStack stack = invManipulation.simulate() + .extract(amountToExtract); + if (stack.isEmpty()) + return; + for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, area)) { + lastObserved = new WeakReference<>(itemEntity); + return; + } + + // Extract + stack = invManipulation.extract(amountToExtract); if (stack.isEmpty()) return; + flap(false); onTransfer(stack); - invManipulation.insert(stack); + + Vec3d outputPos = VecHelper.getCenterOf(pos); + boolean vertical = facing.getAxis() + .isVertical(); + boolean up = facing == Direction.UP; + + outputPos = outputPos.add(new Vec3d(facing.getDirectionVec()).scale(vertical ? up ? .15f : .5f : .25f)); + if (!vertical) + outputPos = outputPos.subtract(0, .45f, 0); + + Vec3d motion = Vec3d.ZERO; + if (up) + motion = new Vec3d(0, 4 / 16f, 0); + + ItemEntity item = new ItemEntity(world, outputPos.x, outputPos.y, outputPos.z, stack.copy()); + item.setDefaultPickupDelay(); + item.setMotion(motion); + world.addEntity(item); + lastObserved = new WeakReference<>(item); + startCooldown(); } + static final AxisAlignedBB coreBB = + new AxisAlignedBB(VecHelper.CENTER_OF_ORIGIN, VecHelper.CENTER_OF_ORIGIN).grow(.75f); + + private AxisAlignedBB getEntityOverflowScanningArea() { + Direction facing = AbstractFunnelBlock.getFunnelFacing(getBlockState()); + AxisAlignedBB bb = coreBB.offset(pos); + if (facing == null || facing == Direction.UP) + return bb; + return bb.expand(0, -1, 0); + } + private void activateExtractingBeltFunnel() { BlockState blockState = getBlockState(); Direction facing = blockState.get(BeltFunnelBlock.HORIZONTAL_FACING); @@ -172,10 +225,10 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn @Override public void addBehaviours(List behaviours) { - invManipulation = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing()); + invManipulation = + new InvManipulationBehaviour(this, (w, p, s) -> new BlockFace(p, AbstractFunnelBlock.getFunnelFacing(s) + .getOpposite())); behaviours.add(invManipulation); - autoExtractor = InvManipulationBehaviour.forExtraction(this, InterfaceProvider.towardBlockFacing()); - behaviours.add(autoExtractor); filtering = new FilteringBehaviour(this, new FunnelFilterSlotPositioning()); filtering.showCountWhen(this::supportsAmountOnFilter); @@ -196,10 +249,8 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn else beltFunnelsupportsAmount = BeltHelper.getSegmentTE(world, pos.down()) != null; } - boolean hopper = FunnelBlock.getFunnelFacing(blockState) == Direction.UP && !world.getBlockState(pos.up()) - .getMaterial() - .isReplaceable(); - return beltFunnelsupportsAmount || hopper; + boolean extractor = blockState.getBlock() instanceof FunnelBlock && blockState.get(FunnelBlock.EXTRACTING); + return beltFunnelsupportsAmount || extractor; } private boolean supportsDirectBeltInput(Direction side) { @@ -208,8 +259,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn return false; if (!(blockState.getBlock() instanceof FunnelBlock)) return false; - Direction direction = blockState.get(FunnelBlock.FACING); - return direction == Direction.UP || direction == side.getOpposite(); + return blockState.get(FunnelBlock.FACE) == AttachFace.FLOOR; } private boolean supportsFiltering() { @@ -237,7 +287,9 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn public boolean hasFlap() { BlockState blockState = getBlockState(); - if (!(blockState.getBlock() instanceof BeltFunnelBlock)) + if (!AbstractFunnelBlock.getFunnelFacing(blockState) + .getAxis() + .isHorizontal()) return false; return true; } @@ -245,7 +297,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn public float getFlapOffset() { BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof BeltFunnelBlock)) - return 0; + return -1 / 16f; switch (blockState.get(BeltFunnelBlock.SHAPE)) { default: case RETRACTED: diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index de5677b64..7b4643ef0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -15,6 +15,7 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerBloc import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; +import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; @@ -280,11 +281,15 @@ public abstract class ArmInteractionPoint { @Override ItemStack insert(World world, ItemStack stack, boolean simulate) { ItemStack input = stack.copy(); - if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true).getResult().isEmpty()) { + if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true) + .getResult() + .isEmpty()) { return stack; } ActionResult res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, simulate); - return res.getType() == ActionResultType.SUCCESS ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1) : stack; + return res.getType() == ActionResultType.SUCCESS + ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1) + : stack; } @Override @@ -405,7 +410,7 @@ public abstract class ArmInteractionPoint { @Override boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { - return AllBlocks.CHUTE.has(state); + return AbstractChuteBlock.isChute(state); } } @@ -415,7 +420,7 @@ public abstract class ArmInteractionPoint { Vec3d getInteractionPositionVector() { return VecHelper.getCenterOf(pos) .add(new Vec3d(FunnelBlock.getFunnelFacing(state) - .getDirectionVec()).scale(.5f)); + .getDirectionVec()).scale(-.15f)); } @Override @@ -450,15 +455,19 @@ public abstract class ArmInteractionPoint { ItemStack insert = inserter.insert(stack); if (!simulate && insert.getCount() != stack.getCount()) { TileEntity tileEntity = world.getTileEntity(pos); - if (tileEntity instanceof FunnelTileEntity) - ((FunnelTileEntity) tileEntity).onTransfer(stack); + if (tileEntity instanceof FunnelTileEntity) { + FunnelTileEntity funnelTileEntity = (FunnelTileEntity) tileEntity; + funnelTileEntity.onTransfer(stack); + if (funnelTileEntity.hasFlap()) + funnelTileEntity.flap(true); + } } return insert; } @Override boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { - return state.getBlock() instanceof FunnelBlock; + return state.getBlock() instanceof FunnelBlock && !state.get(FunnelBlock.EXTRACTING); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index 7d72c4ff1..6a65e0e26 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -102,16 +102,22 @@ public class ArmTileEntity extends KineticTileEntity { public void tick() { super.tick(); initInteractionPoints(); - tickMovementProgress(); + boolean targetReached = tickMovementProgress(); if (world.isRemote) return; if (chasedPointProgress < 1) return; + if (phase == Phase.MOVE_TO_INPUT) collectItem(); - if (phase == Phase.MOVE_TO_OUTPUT) + else if (phase == Phase.MOVE_TO_OUTPUT) depositItem(); + else if (phase == Phase.SEARCH_INPUTS || phase == Phase.DANCING) + searchForItem(); + + if (targetReached) + lazyTick(); } @Override @@ -122,10 +128,8 @@ public class ArmTileEntity extends KineticTileEntity { return; if (chasedPointProgress < .5f) return; - if (phase == Phase.SEARCH_INPUTS || phase == Phase.DANCING) { + if (phase == Phase.SEARCH_INPUTS || phase == Phase.DANCING) checkForMusic(); - searchForItem(); - } if (phase == Phase.SEARCH_OUTPUTS) searchForDestination(); } @@ -156,12 +160,13 @@ public class ArmTileEntity extends KineticTileEntity { return false; } - private void tickMovementProgress() { + private boolean tickMovementProgress() { + boolean targetReachedPreviously = chasedPointProgress >= 1; chasedPointProgress += Math.min(256, Math.abs(getSpeed())) / 1024f; if (chasedPointProgress > 1) chasedPointProgress = 1; if (!world.isRemote) - return; + return !targetReachedPreviously && chasedPointProgress >= 1; ArmInteractionPoint targetedInteractionPoint = getTargetedInteractionPoint(); ArmAngleTarget previousTarget = this.previousTarget; @@ -182,6 +187,7 @@ public class ArmTileEntity extends KineticTileEntity { upperArmAngle.set(MathHelper.lerp(progress, previousTarget.upperArmAngle, target.upperArmAngle)); headAngle.set(AngleHelper.angleLerp(progress, previousTarget.headAngle % 360, target.headAngle % 360)); + return false; } protected boolean isOnCeiling() { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java index 8d645f75b..de0eb97b4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java @@ -168,9 +168,7 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE r.setActive(false)); active = false; markDirty(); diff --git a/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java new file mode 100644 index 000000000..f8b612b61 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java @@ -0,0 +1,90 @@ +package com.simibubi.create.content.schematics.filtering; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nullable; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.simibubi.create.content.schematics.SchematicWorld; +import com.simibubi.create.content.schematics.item.SchematicItem; +import com.simibubi.create.foundation.utility.Debug; +import com.simibubi.create.foundation.utility.WorldAttached; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.Template; + +public class SchematicInstances { + + public static WorldAttached> loadedSchematics; + + static { + loadedSchematics = new WorldAttached<>(() -> CacheBuilder.newBuilder() + .expireAfterAccess(5, TimeUnit.MINUTES) + .build()); + } + + public static void register() {} + + @Nullable + public static SchematicWorld get(World world, ItemStack schematic) { + Cache map = loadedSchematics.get(world); + int hash = getHash(schematic); + try { + return map.get(hash, () -> loadWorld(world, schematic)); + } catch (ExecutionException e) { + e.printStackTrace(); + } + return null; + } + + private static SchematicWorld loadWorld(World wrapped, ItemStack schematic) { + if (schematic == null || !schematic.hasTag()) + return null; + if (!schematic.getTag() + .getBoolean("Deployed")) + return null; + + Template activeTemplate = SchematicItem.loadSchematic(schematic); + + if (activeTemplate.getSize() + .equals(BlockPos.ZERO)) + return null; + + BlockPos anchor = NBTUtil.readBlockPos(schematic.getTag() + .getCompound("Anchor")); + SchematicWorld world = new SchematicWorld(anchor, wrapped); + PlacementSettings settings = SchematicItem.getSettings(schematic); + activeTemplate.addBlocksToWorld(world, anchor, settings); + + Debug.debugChat("Loading Schematic Instance of " + schematic.getTag() + .getString("File") + ". Total active instances: " + (loadedSchematics.get(wrapped).size() + 1)); + + + return world; + } + + public static void clearHash(ItemStack schematic) { + if (schematic == null || !schematic.hasTag()) + return; + schematic.getTag() + .remove("SchematicHash"); + } + + public static int getHash(ItemStack schematic) { + if (schematic == null || !schematic.hasTag()) + return -1; + CompoundNBT tag = schematic.getTag(); + if (!tag.contains("SchematicHash")) + tag.putInt("SchematicHash", tag.toString() + .hashCode()); + return tag.getInt("SchematicHash"); + } + +} diff --git a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java index 2ddf14b10..71bad1d97 100644 --- a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java @@ -13,6 +13,7 @@ import org.apache.commons.io.IOUtils; import com.simibubi.create.AllItems; import com.simibubi.create.content.schematics.client.SchematicEditScreen; +import com.simibubi.create.content.schematics.filtering.SchematicInstances; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.utility.Lang; @@ -87,6 +88,7 @@ public class SchematicItem extends Item { Template t = loadSchematic(blueprint); tag.put("Bounds", NBTUtil.writeBlockPos(t.getSize())); blueprint.setTag(tag); + SchematicInstances.clearHash(blueprint); } public static PlacementSettings getSettings(ItemStack blueprint) { diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java index 1e7c6f861..030f66a93 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.schematics.packet; import java.util.function.Supplier; import com.simibubi.create.AllItems; +import com.simibubi.create.content.schematics.filtering.SchematicInstances; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.entity.player.ServerPlayerEntity; @@ -70,6 +71,7 @@ public class SchematicSyncPacket extends SimplePacketBase { tag.put("Anchor", NBTUtil.writeBlockPos(anchor)); tag.putString("Rotation", rotation.name()); tag.putString("Mirror", mirror.name()); + SchematicInstances.clearHash(stack); }); context.get().setPacketHandled(true); } diff --git a/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java b/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java index 391801a9b..9caf7d96a 100644 --- a/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java @@ -12,6 +12,7 @@ import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ILightReader; @@ -40,18 +41,27 @@ public class ColoredVertexModel extends BakedModelWrapper { List quads = new ArrayList<>(super.getQuads(state, side, rand, extraData)); if (!extraData.hasProperty(POSITION_PROPERTY)) return quads; - + if (quads.isEmpty()) + return quads; + + // Optifine might've rejigged vertex data + VertexFormat format = DefaultVertexFormats.BLOCK; + int colorIndex = 0; + for (int j = 0; j < format.getElements().size(); j++) { + VertexFormatElement e = format.getElements().get(j); + if (e.getUsage() == VertexFormatElement.Usage.COLOR) + colorIndex = j; + } + int colorOffset = format.getOffset(colorIndex) / 4; + BlockPos data = extraData.getData(POSITION_PROPERTY); + for (int i = 0; i < quads.size(); i++) { BakedQuad quad = quads.get(i); BakedQuad newQuad = new BakedQuad(Arrays.copyOf(quad.getVertexData(), quad.getVertexData().length), quad.getTintIndex(), quad.getFace(), quad.getSprite(), quad.shouldApplyDiffuseLighting()); - - VertexFormat format = DefaultVertexFormats.BLOCK; int[] vertexData = newQuad.getVertexData(); - BlockPos data = extraData.getData(POSITION_PROPERTY); for (int vertex = 0; vertex < vertexData.length; vertex += format.getIntegerSize()) { - int colorOffset = 12 / 4; float x = Float.intBitsToFloat(vertexData[vertex]); float y = Float.intBitsToFloat(vertexData[vertex + 1]); float z = Float.intBitsToFloat(vertexData[vertex + 2]); diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index d28ec3bd8..fe1ec78cf 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -13,6 +13,7 @@ public class AllCommands { .then(ToggleDebugCommand.register()) .then(OverlayConfigCommand.register()) .then(FixLightingCommand.register()) + .then(ReplaceInCommandBlocksCommand.register()) //dev-util //Comment out for release diff --git a/src/main/java/com/simibubi/create/foundation/command/ReplaceInCommandBlocksCommand.java b/src/main/java/com/simibubi/create/foundation/command/ReplaceInCommandBlocksCommand.java new file mode 100644 index 000000000..30d3a5101 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/ReplaceInCommandBlocksCommand.java @@ -0,0 +1,70 @@ +package com.simibubi.create.foundation.command; + +import org.apache.commons.lang3.mutable.MutableInt; + +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; + +import net.minecraft.block.BlockState; +import net.minecraft.block.CommandBlockBlock; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.arguments.BlockPosArgument; +import net.minecraft.tileentity.CommandBlockLogic; +import net.minecraft.tileentity.CommandBlockTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.server.ServerWorld; + +public class ReplaceInCommandBlocksCommand { + + public static ArgumentBuilder register() { + return Commands.literal("replaceInCommandBlocks") + .requires(cs -> cs.hasPermissionLevel(0)) + .then(Commands.argument("begin", BlockPosArgument.blockPos()) + .then(Commands.argument("end", BlockPosArgument.blockPos()) + .then(Commands.argument("toReplace", StringArgumentType.string()) + .then(Commands.argument("replaceWith", StringArgumentType.string()) + .executes(ctx -> { + doReplace(ctx.getSource(), BlockPosArgument.getLoadedBlockPos(ctx, "begin"), + BlockPosArgument.getLoadedBlockPos(ctx, "end"), + StringArgumentType.getString(ctx, "toReplace"), + StringArgumentType.getString(ctx, "replaceWith")); + return 1; + }))))); + + } + + private static void doReplace(CommandSource source, BlockPos from, BlockPos to, String toReplace, + String replaceWith) { + ServerWorld world = source.getWorld(); + MutableInt blocks = new MutableInt(0); + BlockPos.getAllInBox(from, to) + .forEach(pos -> { + BlockState blockState = world.getBlockState(pos); + if (!(blockState.getBlock() instanceof CommandBlockBlock)) + return; + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof CommandBlockTileEntity)) + return; + CommandBlockTileEntity cb = (CommandBlockTileEntity) tileEntity; + CommandBlockLogic commandBlockLogic = cb.getCommandBlockLogic(); + String command = commandBlockLogic.getCommand(); + if (command.indexOf(toReplace) != -1) + blocks.increment(); + commandBlockLogic.setCommand(command.replaceAll(toReplace, replaceWith)); + cb.markDirty(); + world.notifyBlockUpdate(pos, blockState, blockState, 2); + }); + int intValue = blocks.intValue(); + if (intValue == 0) { + source.sendFeedback(new StringTextComponent("Couldn't find \"" + toReplace + "\" anywhere."), true); + return; + } + source.sendFeedback( + new StringTextComponent("Replaced occurrences in " + intValue + " blocks."), + true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java index abc1d0cd2..f463590d3 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java @@ -139,6 +139,16 @@ public class BlockStateGen { }, BlockStateProperties.WATERLOGGED); } + public static void simpleBlock(DataGenContext ctx, RegistrateBlockstateProvider prov, + Function modelFunc) { + prov.getVariantBuilder(ctx.getEntry()) + .forAllStatesExcept(state -> { + return ConfiguredModel.builder() + .modelFile(modelFunc.apply(state)) + .build(); + }, BlockStateProperties.WATERLOGGED); + } + public static void horizontalAxisBlock(DataGenContext ctx, RegistrateBlockstateProvider prov, Function modelFunc) { prov.getVariantBuilder(ctx.getEntry()) diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index d8417ee9c..1947517c1 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -36,7 +36,6 @@ import net.minecraft.block.BlockState; import net.minecraft.client.renderer.RenderType; import net.minecraft.item.DyeColor; import net.minecraft.item.Item; -import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.PistonType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -105,23 +104,30 @@ public class BuilderTransformers { return b -> { return b.blockstate((c, p) -> { Function model = s -> { - String powered = - s.has(BlockStateProperties.POWERED) && s.get(BlockStateProperties.POWERED) ? "_powered" : ""; + String powered = s.get(FunnelBlock.POWERED) ? "_powered" : ""; + String extracting = s.get(FunnelBlock.EXTRACTING) ? "_push" : "_pull"; + String face = s.get(FunnelBlock.FACE) + .getName(); return p.models() - .withExistingParent("block/" + type + "_funnel" + powered, p.modLoc("block/funnel/block")) - .texture("0", p.modLoc("block/" + type + "_funnel_plating")) - .texture("1", particleTexture) - .texture("2", p.modLoc("block/" + type + "_funnel" + powered)) + .withExistingParent("block/" + type + "_funnel_" + face + extracting + powered, + p.modLoc("block/funnel/block_" + face)) + .texture("particle", particleTexture) + .texture("7", p.modLoc("block/" + type + "_funnel_plating")) + .texture("6", p.modLoc("block/" + type + "_funnel" + powered)) + .texture("5", p.modLoc("block/" + type + "_funnel_tall" + powered)) + .texture("2_2", p.modLoc("block/" + type + "_funnel" + extracting)) .texture("3", p.modLoc("block/" + type + "_funnel_back")); }; - p.directionalBlock(c.get(), model); + p.horizontalFaceBlock(c.get(), model); }) .item(FunnelItem::new) .model((c, p) -> { p.withExistingParent("item/" + type + "_funnel", p.modLoc("block/funnel/item")) - .texture("0", p.modLoc("block/" + type + "_funnel_plating")) - .texture("1", particleTexture) - .texture("2", p.modLoc("block/" + type + "_funnel")) + .texture("particle", particleTexture) + .texture("7", p.modLoc("block/" + type + "_funnel_plating")) + .texture("2", p.modLoc("block/" + type + "_funnel_neutral")) + .texture("6", p.modLoc("block/" + type + "_funnel")) + .texture("5", p.modLoc("block/" + type + "_funnel_tall")) .texture("3", p.modLoc("block/" + type + "_funnel_back")); }) .build(); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java index 1753f2874..92480a848 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java @@ -39,6 +39,8 @@ public class MillingRecipeGen extends ProcessingRecipeGen { .output(Items.FLINT)), SAND = create(() -> Blocks.SAND, b -> b.duration(150) .output(AllPaletteBlocks.LIMESAND.get())), + SANDSTONE = create(() -> Blocks.SANDSTONE, b -> b.duration(150) + .output(Blocks.SAND)), DIORITE = create(() -> Blocks.DIORITE, b -> b.duration(200) .output(AllPaletteBlocks.LIMESAND.get())), 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 96ac8ca88..0463ca346 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 @@ -1,11 +1,11 @@ package com.simibubi.create.foundation.data.recipe; import static com.simibubi.create.foundation.data.recipe.Mods.IE; +import static com.simibubi.create.foundation.data.recipe.Mods.INF; import static com.simibubi.create.foundation.data.recipe.Mods.MEK; import static com.simibubi.create.foundation.data.recipe.Mods.MW; import static com.simibubi.create.foundation.data.recipe.Mods.SM; import static com.simibubi.create.foundation.data.recipe.Mods.TH; -import static com.simibubi.create.foundation.data.recipe.Mods.INF; import java.util.ArrayList; import java.util.List; @@ -22,7 +22,6 @@ import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.Create; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.palettes.AllPaletteBlocks; -import com.simibubi.create.foundation.data.recipe.CreateRecipeProvider.I; import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.entry.ItemEntry; @@ -318,6 +317,23 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("P") .patternLine("A") .patternLine("P")), + + GANTRY_PINION = create(AllBlocks.GANTRY_PINION).unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.key('B', ItemTags.PLANKS) + .key('S', I.cog()) + .key('C', I.andesiteCasing()) + .key('I', I.shaft()) + .patternLine(" B ") + .patternLine("ICI") + .patternLine(" S ")), + + GANTRY_SHAFT = create(AllBlocks.GANTRY_SHAFT).returns(8) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.andesite()) + .key('R', I.redstone()) + .patternLine("A") + .patternLine("R") + .patternLine("A")), ANALOG_LEVER = create(AllBlocks.ANALOG_LEVER).unlockedBy(I::andesite) .viaShaped(b -> b.key('S', I.andesiteCasing()) @@ -568,6 +584,14 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("II") .patternLine("AA")), + SMART_CHUTE = create(AllBlocks.SMART_CHUTE).unlockedBy(AllBlocks.CHUTE::get) + .viaShaped(b -> b.key('P', I.electronTube()) + .key('S', AllBlocks.CHUTE.get()) + .key('I', I.brassSheet()) + .patternLine("I") + .patternLine("S") + .patternLine("P")), + DEPOT = create(AllBlocks.DEPOT).unlockedBy(I::andesiteCasing) .viaShaped(b -> b.key('A', I.andesite()) .key('I', I.andesiteCasing()) diff --git a/src/main/java/com/simibubi/create/foundation/entity/CreateDataSerializers.java b/src/main/java/com/simibubi/create/foundation/entity/CreateDataSerializers.java deleted file mode 100644 index 390696e89..000000000 --- a/src/main/java/com/simibubi/create/foundation/entity/CreateDataSerializers.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.simibubi.create.foundation.entity; - -import java.util.Optional; - -import com.simibubi.create.foundation.utility.Iterate; - -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.IDataSerializer; -import net.minecraft.util.Direction; - -public class CreateDataSerializers { - - public static final IDataSerializer> OPTIONAL_DIRECTION = - new IDataSerializer>() { - - public void write(PacketBuffer buffer, Optional opt) { - buffer.writeVarInt(opt.map(Direction::ordinal) - .orElse(-1) + 1); - } - - public Optional read(PacketBuffer buffer) { - int i = buffer.readVarInt(); - return i == 0 ? Optional.empty() : Optional.of(Iterate.directions[i - 1]); - } - - public Optional copyValue(Optional opt) { - return Optional.ofNullable(opt.orElse(null)); - } - }; - - static { - DataSerializers.registerSerializer(OPTIONAL_DIRECTION); - } - - public static void register() {} - -} diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 94222fb36..0b5790915 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -7,6 +7,7 @@ import java.util.function.Supplier; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionDisassemblyPacket; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionStallPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionUpdatePacket; import com.simibubi.create.content.contraptions.components.structureMovement.glue.GlueEffectPacket; import com.simibubi.create.content.contraptions.components.structureMovement.sync.ClientMotionPacket; import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionFluidPacket; @@ -79,6 +80,7 @@ public enum AllPackets { MINECART_CONTROLLER(MinecartControllerUpdatePacket.class, MinecartControllerUpdatePacket::new), FLUID_SPLASH(FluidSplashPacket.class, FluidSplashPacket::new), CONTRAPTION_FLUID(ContraptionFluidPacket.class, ContraptionFluidPacket::new), + GANTRY_UPDATE(GantryContraptionUpdatePacket.class, GantryContraptionUpdatePacket::new), ; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java index 77b6de8b0..dd605d425 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.tileEntity.behaviour.filtering; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -66,6 +68,11 @@ public class FilteringHandler { ItemStack toApply = player.getHeldItem(hand) .copy(); + if (AllItems.WRENCH.isIn(toApply)) + return; + if (AllBlocks.MECHANICAL_ARM.isIn(toApply)) + return; + if (event.getSide() != LogicalSide.CLIENT) { if (!player.isCreative()) { if (behaviour.getFilter() diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java index 025ad5a42..3be5ab785 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java @@ -75,7 +75,7 @@ public class FilteringRenderer { box.offsetLabel(behaviour.textShift) .withColors(fluids ? 0x407088 : 0x7A6A2C, fluids ? 0x70adb5 : 0xB79D64) - .scrollTooltip(showCount ? "[" + Lang.translate("action.scroll") + "]" : "") + .scrollTooltip(showCount && !isFilterSlotted ? "[" + Lang.translate("action.scroll") + "]" : "") .passive(!hit); CreateClient.outliner.showValueBox(Pair.of("filter", pos), box.transform(behaviour.slotPositioning)) diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java index 059150f22..8da2b5ce2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java @@ -59,7 +59,7 @@ public class PlacementOffset { public void placeInWorld(World world, BlockItem blockItem, PlayerEntity player, ItemStack item) { placeInWorld(world, blockItem.getBlock().getDefaultState(), player, item); } - + public void placeInWorld(World world, BlockState defaultState, PlayerEntity player, ItemStack item) { if (world.isRemote) return; diff --git a/src/main/resources/assets/create/lang/Localization Readme.txt b/src/main/resources/assets/create/lang/Localization Readme.txt index eeb95b6a7..c9ef6fa7d 100644 --- a/src/main/resources/assets/create/lang/Localization Readme.txt +++ b/src/main/resources/assets/create/lang/Localization Readme.txt @@ -1,10 +1,37 @@ Hi there! -Looking to contribute with a localization? Wonderful. +Looking to contribute with a localization? Here's how: -You will find the full english lang file here: -https://github.com/Creators-of-Create/Create/blob/mc1.15/dev/src/generated/resources/assets/create/lang/en_us.json -If you want to complete an outdated lang file, check out +1. Check if your language is already present in an outdated state: + https://github.com/Creators-of-Create/Create/blob/mc1.15/dev/src/generated/resources/assets/create/lang/unfinished -Missing entries have been added to these templates, marked with "UNLOCALIZED". -These files are only there to help you, finished langs still belong in the folder this readme is in. Best of luck! \ No newline at end of file +Shows generated lang files that are composed of any old translation file in the official lang folder as well as placeholder entries of new content added since. +NOTICE: this is not the true lang folder, changes to the files in that directory will be lost as they are auto-generated templates. + +If your locale is present here, copy the file, and translate all entries that read "UNLOCALIZED". + If you do not want to translate all of it, simply delete all entries that are still UNLOCALIZED, this will make it equivalent to an "outdated" lang file. + Once you are finished, continue with step 3. + + + +2. Creating a new localization file + +If you couldn't find a started translation in the previous step: +Grab a copy of the full standard localization file here: +https://github.com/Creators-of-Create/Create/blob/mc1.15/dev/src/generated/resources/assets/create/lang/en_us.json + Rename your copied file to the locale it is targeting, and start making your translations by replacing the english text. + Once you are finished, continue with step 3. + + + +3. Publishing your changes + +Any lang file you created or changed belongs into this folder: +https://github.com/Creators-of-Create/Create/blob/mc1.15/dev/src/main/resources/assets/create/lang +This is the lang folder you found this readme in. + You can either open a pull request inserting your file for us, or get in contact on the feedback & help channel linked on Create's project page (CurseForge). + NOTICE: when making PRs, always target the main branch unless your changes are exclusive to a different version of minecraft than the one the main branch is on. + + + +Thank you kindly for your contribution! diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 175a66baa..57fbc9b7e 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -449,7 +449,10 @@ "create.tooltip.chute.fans_push_down": "Fans push from Above", "create.tooltip.chute.fans_pull_up": "Fans pull from Above", "create.tooltip.chute.fans_pull_down": "Fans pull from Below", - + "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + + "create.hint.hose_pulley.title": "Bottomless Supply", + "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "No Targets", "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "Horizontal Funnels", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index 2eae1ce0c..b4baad170 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -34,7 +34,7 @@ "block.create.andesite_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "A protective cover for your _Belts_ and a great way to cover the holes left in your wall because of them.", + "block.create.andesite_tunnel.tooltip.summary": "A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", "block.create.andesite_tunnel.tooltip.control1": "R-Click with Wrench on Side", "block.create.andesite_tunnel.tooltip.action1": "_Adjusts window shutters_ if the tunnel has a window on that face.", @@ -48,7 +48,7 @@ "block.create.brass_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", "block.create.brass_tunnel.tooltip": "BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "_Brass Tunnels_ come with a number of _Filtering_ and _Splitting_ options for your _Belts_.", + "block.create.brass_tunnel.tooltip.summary": "A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", "block.create.brass_tunnel.tooltip.condition1": "When placed side by side", "block.create.brass_tunnel.tooltip.behaviour1": "_Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", "block.create.brass_tunnel.tooltip.condition2": "Filtering", @@ -377,7 +377,7 @@ "block.create.reinforced_rail.tooltip.summary": "A timber stabilized rail, _does not need supports_.", "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", - "block.create.mechanical_mixer.tooltip.summary": "A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", + "block.create.mechanical_mixer.tooltip.summary": "A kinetic whisk providing automated shapeless crafting recipes of multiple ingredients. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", "block.create.mechanical_mixer.tooltip.condition1": "When above Basin", "block.create.mechanical_mixer.tooltip.behaviour1": "Starts to mix items in the basin whenever all necessary ingredients are present. To prevent unwanted recipes, use the filter slot on the basin or cut the rotational force until all desired ingredients have been added.", diff --git a/src/main/resources/assets/create/lang/ru_ru.json b/src/main/resources/assets/create/lang/ru_ru.json index 981f320d5..cf0f2eb4e 100644 --- a/src/main/resources/assets/create/lang/ru_ru.json +++ b/src/main/resources/assets/create/lang/ru_ru.json @@ -1,14 +1,15 @@ { - "_": "->------------------------] Предметы игры [------------------------<-", + "_": "->------------------------] Game Elements [------------------------<-", "block.create.acacia_window": "Акациевое окно", "block.create.acacia_window_pane": "Панель из акациевого окна", + "block.create.adjustable_chain_gearshift": "Регулируемый цепной механизм", "block.create.adjustable_crate": "Регулируемый ящик", - "block.create.adjustable_pulley": "Настраиваемый конвейерный привод", "block.create.adjustable_pulse_repeater": "Регулируемый импульсный повторитель", "block.create.adjustable_repeater": "Регулируемый повторитель", "block.create.analog_lever": "Аналоговый рычаг", + "block.create.andesite_belt_funnel": "Андезитовая конвейерная воронка", "block.create.andesite_bricks": "Андезитовый кирпич", "block.create.andesite_bricks_slab": "Плита из андезитового кирпича", "block.create.andesite_bricks_stairs": "Ступени из андезитового кирпича", @@ -18,15 +19,30 @@ "block.create.andesite_cobblestone_slab": "Андезит-булыжниковая плита", "block.create.andesite_cobblestone_stairs": "Андезит-булыжниковые ступени", "block.create.andesite_cobblestone_wall": "Андезит-булыжниковая стена", + "block.create.andesite_encased_shaft": "Андезитовый вал в кожухе", + "block.create.andesite_funnel": "Андезитовая воронка", "block.create.andesite_pillar": "Андезитовая колонна", + "block.create.andesite_tunnel": "Андезитовый туннель", "block.create.basin": "Чаша", "block.create.belt": "Конвейер", - "block.create.belt_observer": "Конвейерный сканер", - "block.create.belt_tunnel": "Конвейерный туннель", "block.create.birch_window": "Берёзовое окно", "block.create.birch_window_pane": "Панель берёзового окна", + "block.create.black_sail": "Чёрный парус", + "block.create.black_seat": "Чёрное сиденье", + "block.create.black_valve_handle": "Чёрная ручка крана", + "block.create.blaze_burner": "Горелка Всполоха", + "block.create.blue_sail": "Синий парус", + "block.create.blue_seat": "Синее сиденье", + "block.create.blue_valve_handle": "Синяя ручка крана", + "block.create.brass_belt_funnel": "Латунная конвейерная воронка", "block.create.brass_block": "Латунный блок", "block.create.brass_casing": "Латунный корпус", + "block.create.brass_encased_shaft": "Латунный вал в кожухе", + "block.create.brass_funnel": "Латунная воронка", + "block.create.brass_tunnel": "Латунный туннель", + "block.create.brown_sail": "Коричневый парус", + "block.create.brown_seat": "Коричневое сиденье", + "block.create.brown_valve_handle": "Коричневая ручка крана", "block.create.cart_assembler": "Сборщик вагонеток", "block.create.chiseled_dark_scoria": "Резной тёмный пепел", "block.create.chiseled_dolomite": "Резной доломит", @@ -34,18 +50,28 @@ "block.create.chiseled_limestone": "Резной известняк", "block.create.chiseled_scoria": "Резной пепел", "block.create.chiseled_weathered_limestone": "Выветренный резной известняк", + "block.create.chocolate": "Шоколад", + "block.create.chute": "Желоб", "block.create.clockwork_bearing": "Часовой механизм", "block.create.clutch": "Сцепление", "block.create.cogwheel": "Шестерня", + "block.create.content_observer": "Наблюдетель за содержимым", + "block.create.controller_rail": "Контролирующая рельса", "block.create.copper_block": "Медный блок", "block.create.copper_casing": "Медный корпус", "block.create.copper_ore": "Медная руда", "block.create.copper_shingles": "Медная черепица", + "block.create.copper_tiles": "Медная плитка", + "block.create.copper_valve_handle": "Медная ручка крана", "block.create.creative_crate": "Творческий ящик", + "block.create.creative_fluid_tank": "Творческиф жидкостный бак", "block.create.creative_motor": "Творческий мотор", "block.create.crushing_wheel": "Колесо дробления", "block.create.crushing_wheel_controller": "Контроллер колеса дробления", "block.create.cuckoo_clock": "Часы с кукушкой", + "block.create.cyan_sail": "Бирюзовый парус", + "block.create.cyan_seat": "Бирюзовое сииденье", + "block.create.cyan_valve_handle": "Бирюзовая ручка крана", "block.create.dark_oak_window": "Окно из тёмного дуба", "block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб", "block.create.dark_scoria": "Тёмный пепел", @@ -59,6 +85,7 @@ "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепел-булыжника", "block.create.dark_scoria_pillar": "Колонна из тёмного пепел-булыжника", "block.create.deployer": "Автономный активатор", + "block.create.depot": "Депо", "block.create.diorite_bricks": "Диоритовый кирпич", "block.create.diorite_bricks_slab": "Плита из диоритового кирпича", "block.create.diorite_bricks_stairs": "Ступени из диоритового кирпича", @@ -78,10 +105,9 @@ "block.create.dolomite_cobblestone_stairs": "Ступени доломит-булыжника", "block.create.dolomite_cobblestone_wall": "Стена доломит-булыжника", "block.create.dolomite_pillar": "Доломитовая колонна", - "block.create.encased_belt": "Конвейерный привод", + "block.create.encased_chain_drive": "Цепной привод в кожухе", "block.create.encased_fan": "Вентилятор в кожухе", - "block.create.encased_shaft": "Вал в кожухе", - "block.create.extractor": "Извлекающее устройство", + "block.create.encased_fluid_pipe": "Жидкостная труба в кожухе", "block.create.fancy_andesite_bricks": "Красивый андезитовый кирпич", "block.create.fancy_andesite_bricks_slab": "Плита из красивого андезитового кирпича", "block.create.fancy_andesite_bricks_stairs": "Ступени из красивого андезитового кирпича", @@ -118,10 +144,12 @@ "block.create.fancy_weathered_limestone_bricks_slab": "Плита из красивого выветренного известнякового кирпича", "block.create.fancy_weathered_limestone_bricks_stairs": "Ступени из красивого выветренного известнякового кирпича", "block.create.fancy_weathered_limestone_bricks_wall": "Стена из красивого выветренного известнякового кирпича", + "block.create.fluid_pipe": "Жидкостная труба", + "block.create.fluid_tank": "Жидкостный бак", + "block.create.fluid_valve": "Жидкостный вентиль", "block.create.flywheel": "Маховик", "block.create.framed_glass": "Обрамлённое стекло", "block.create.framed_glass_pane": "Обрамлённая стеклянная панель", - "block.create.funnel": "Воронка", "block.create.furnace_engine": "Печной двигатель", "block.create.gabbro": "Габбро", "block.create.gabbro_bricks": "Габбровый кирпич", @@ -135,6 +163,7 @@ "block.create.gabbro_pillar": "Габбро колонна", "block.create.gearbox": "Коробка передач", "block.create.gearshift": "Реверсивный механизм", + "block.create.glass_fluid_pipe": "Стеклянная жидкостная труба", "block.create.granite_bricks": "Гранитный кирпич", "block.create.granite_bricks_slab": "Плита из гранитного кирпича", "block.create.granite_bricks_stairs": "Ступени из гранитного кирпича", @@ -144,9 +173,18 @@ "block.create.granite_cobblestone_stairs": "Ступени из гранит-булыжника", "block.create.granite_cobblestone_wall": "Стена из гранит-булыжника", "block.create.granite_pillar": "Гранитная колонна", + "block.create.gray_sail": "Серый парус", + "block.create.gray_seat": "Серое сиденье", + "block.create.gray_valve_handle": "Серная ручка крана", + "block.create.green_sail": "Зелёный парус", + "block.create.green_seat": "Зелёное сиденье", + "block.create.green_valve_handle": "Зелёная ручка крана", "block.create.hand_crank": "Рукоятка", + "block.create.honey": "Мёд", "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", + "block.create.hose_pulley": "Шкив для шланга", + "block.create.item_drain": "Предметный осушитель", "block.create.jungle_window": "Окно из тропического дерева", "block.create.jungle_window_pane": "Панель окна из тропического дерева", "block.create.large_cogwheel": "Большая шестерня", @@ -159,6 +197,15 @@ "block.create.layered_limestone": "Слоистый известняк", "block.create.layered_scoria": "Слоистый пепел", "block.create.layered_weathered_limestone": "Слоистый выветренный известняк", + "block.create.light_blue_sail": "Голубой парус", + "block.create.light_blue_seat": "Голубое сиденье", + "block.create.light_blue_valve_handle": "Голубая ручка крана", + "block.create.light_gray_sail": "Светло-серый парус", + "block.create.light_gray_seat": "Светло-серое сиденье", + "block.create.light_gray_valve_handle": "Светло-серая ручка крана", + "block.create.lime_sail": "Лаймовый парус", + "block.create.lime_seat": "Лаймовое сиденье", + "block.create.lime_valve_handle": "Лаймовая ручка крана", "block.create.limesand": "Известковый песок", "block.create.limestone": "Известняк", "block.create.limestone_bricks": "Известняковый кирпич", @@ -171,8 +218,11 @@ "block.create.limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.limestone_pillar": "Известковая колонна", "block.create.linear_chassis": "Линейное шасси", - "block.create.linked_extractor": "Беспроводное извлекающее устройство", - "block.create.linked_transposer": "Беспроводной переместитель", + "block.create.lit_blaze_burner": "Зажжёная горелка Всполоха", + "block.create.magenta_sail": "Пурпурный парус", + "block.create.magenta_seat": "Пурпурное сиденье", + "block.create.magenta_valve_handle": "Пурпурная ручка крана", + "block.create.mechanical_arm": "Механическая рука", "block.create.mechanical_bearing": "Механический вращатель", "block.create.mechanical_crafter": "Механический крафтер", "block.create.mechanical_drill": "Механическая дрель", @@ -182,7 +232,9 @@ "block.create.mechanical_piston_head": "Механическая головка поршня", "block.create.mechanical_plough": "Механический плуг", "block.create.mechanical_press": "Механический пресс", + "block.create.mechanical_pump": "Механическая помпа", "block.create.mechanical_saw": "Механическая пила", + "block.create.metal_bracket": "Металлический кронштейн", "block.create.millstone": "Жернов", "block.create.minecart_anchor": "Вагонеточный якорь", "block.create.mossy_andesite": "Замшелый андезит", @@ -200,6 +252,9 @@ "block.create.nozzle": "Форсунка", "block.create.oak_window": "Дубовое окно", "block.create.oak_window_pane": "Панель из дубового окна", + "block.create.orange_sail": "Оранжевый парус", + "block.create.orange_seat": "Оранжевое сиденье", + "block.create.orange_valve_handle": "Оранжевая ручка крана", "block.create.ornate_iron_window": "Украшенное железное окно", "block.create.ornate_iron_window_pane": "Панель из украшенного железного окна", "block.create.overgrown_andesite": "Заросший андезит", @@ -247,6 +302,9 @@ "block.create.paved_weathered_limestone_slab": "Плита из мощёного выветренного известняка", "block.create.paved_weathered_limestone_stairs": "Ступени из мощёного выветренного известняка", "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", + "block.create.pink_sail": "Розовый парус", + "block.create.pink_seat": "Розовое сиденье", + "block.create.pink_valve_handle": "Розовая ручка крана", "block.create.piston_extension_pole": "Удлинитель поршня", "block.create.polished_dark_scoria": "Полированный тёмный пепел", "block.create.polished_dark_scoria_slab": "Плита из полированного тёмного пепла", @@ -272,18 +330,27 @@ "block.create.polished_weathered_limestone_slab": "Плита из полированного выветренного известняка", "block.create.polished_weathered_limestone_stairs": "Ступени из полированного выветренного известняка", "block.create.polished_weathered_limestone_wall": "Стена из полированного выветренного известняка", + "block.create.portable_fluid_interface": "Портативный жидкостный интерфейс", "block.create.portable_storage_interface": "Портативный интерфейс хранения", "block.create.powered_latch": "Механизированная защёлка", "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", "block.create.pulley_magnet": "Шкивный магнит", "block.create.pulse_repeater": "Импульсный повторитель", + "block.create.purple_sail": "Фиолетовый парус", + "block.create.purple_seat": "Фиолетовое сиденье", + "block.create.purple_valve_handle": "Фиолетовая ручка крана", "block.create.radial_chassis": "Радиальное шасси", + "block.create.red_sail": "Красный парус", + "block.create.red_seat": "Красное сиденье", + "block.create.red_valve_handle": "Красная ручка крана", "block.create.redstone_contact": "Контакт сигнала красного камня", "block.create.redstone_link": "Беспроводной передатчик сигнала красного камня", + "block.create.refined_radiance_casing": "Сияющий корпус", "block.create.reinforced_rail": "Усиленные рельсы", "block.create.rope": "Канат", "block.create.rope_pulley": "Лебёдка", "block.create.rotation_speed_controller": "Регулятор скорости вращения", + "block.create.sail_frame": "Рама паруса", "block.create.schematic_table": "Схематичный стол", "block.create.schematicannon": "Схематичная пушка", "block.create.scoria": "Пепел", @@ -298,8 +365,11 @@ "block.create.scoria_pillar": "Колонна из пепла", "block.create.secondary_linear_chassis": "Вторичное линейное шасси", "block.create.sequenced_gearshift": "Последовательный переключатель передач", + "block.create.shadow_steel_casing": "Теневой кожух", "block.create.shaft": "Вал", + "block.create.smart_fluid_pipe": "Умная жидкостная труба", "block.create.speedometer": "Спидометр", + "block.create.spout": "Слив", "block.create.spruce_window": "Еловое окно", "block.create.spruce_window_pane": "Панель из елового окна", "block.create.sticky_mechanical_piston": "Липкий механический поршень", @@ -307,15 +377,9 @@ "block.create.stressometer": "Динамометр", "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", - "block.create.transposer": "Переместитель", "block.create.turntable": "Поворотный стол", - "block.create.vertical_extractor": "Вертикальное извлекающее устройство", "block.create.vertical_framed_glass": "Вертикальное обрамлённое стекло", "block.create.vertical_framed_glass_pane": "Вертикальная обрамлённая стеклянная панель", - "block.create.vertical_funnel": "Вертикальная воронка", - "block.create.vertical_linked_extractor": "Беспроводное вертикальное извлекающее устройство", - "block.create.vertical_linked_transposer": "Вертикальный беспроводной переместитель", - "block.create.vertical_transposer": "Вертикальный переместитель", "block.create.water_wheel": "Водяное колесо", "block.create.weathered_limestone": "Выветренный известняк", "block.create.weathered_limestone_bricks": "Выветренный известняковый кирпич", @@ -327,33 +391,65 @@ "block.create.weathered_limestone_cobblestone_stairs": "Ступени из известняк-булыжника", "block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", + "block.create.white_sail": "Белый парус", + "block.create.white_seat": "Белое сиденье", + "block.create.white_valve_handle": "Белая ручка крана", + "block.create.windmill_bearing": "Подшипник ветряной мельницы", + "block.create.wooden_bracket": "Деревянный кронштейн", + "block.create.yellow_sail": "Жёлтый парус", + "block.create.yellow_seat": "Жёлтое сиденье", + "block.create.yellow_valve_handle": "Жёлтая ручка крана", "block.create.zinc_block": "Цинковый блок", "block.create.zinc_ore": "Цинковая руда", "entity.create.contraption": "Штуковина", + "entity.create.seat": "сиденье", "entity.create.stationary_contraption": "Стационарная штуковина", - "entity.create.super_glue": "Супер клей", + "entity.create.super_glue": "Супер-клей", + + "fluid.create.chocolate": "Шоколад", + "fluid.create.honey": "Мёд", + "fluid.create.milk": "Молоко", + "fluid.create.potion": "Зелье", + "fluid.create.tea": "Чай Строителя", "item.create.andesite_alloy": "Андезитовый сплав", "item.create.attribute_filter": "Фильтр атрибутов", + "item.create.bar_of_chocolate": "Плитка шоколада", "item.create.belt_connector": "Механический ремень", + "item.create.blaze_cake": "Торт Всполоха", + "item.create.blaze_cake_base": "Основа торта Всполоха", "item.create.brass_hand": "Латунная рука", "item.create.brass_ingot": "Латунный слиток", "item.create.brass_nugget": "Кусочек латуни", "item.create.brass_sheet": "Латунный лист", + "item.create.builders_tea": "Чай Строителя", + "item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина", + "item.create.chocolate_bucket": "Ведро шоколада", "item.create.chromatic_compound": "Хроматический компаунд", + "item.create.cinder_flour": "Пепельная мука", "item.create.copper_ingot": "Медный слиток", "item.create.copper_nugget": "Кусочек меди", "item.create.copper_sheet": "Медный лист", "item.create.crafter_slot_cover": "Крышка на слот крафтера", + "item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда", "item.create.crushed_brass": "Дробленая латунь", "item.create.crushed_copper_ore": "Измельчённая медная руда", "item.create.crushed_gold_ore": "Измельчённая золотая руда", "item.create.crushed_iron_ore": "Измельчённая железная руда", + "item.create.crushed_lead_ore": "Измельчённая свинцовая руда", + "item.create.crushed_nickel_ore": "Измельчённая никелевая руда", + "item.create.crushed_osmium_ore": "Измельчённая осмиевая руда", + "item.create.crushed_platinum_ore": "Измельчённая платиновая руда", + "item.create.crushed_quicksilver_ore": "Измельчённая ртутная руда", + "item.create.crushed_silver_ore": "Измельчённая серебрянная руда", + "item.create.crushed_tin_ore": "Измельчённая оловянная руда", + "item.create.crushed_uranium_ore": "Измельчённая урановая руда", "item.create.crushed_zinc_ore": "Измельчённая цинковая руда", "item.create.deforester": "Уничтожитель леса", "item.create.dough": "Тесто", "item.create.electron_tube": "Электронная лампа", + "item.create.empty_blaze_burner": "Пустая горелека Всполоха", "item.create.empty_schematic": "Пустая схематика", "item.create.extendo_grip": "Удлинённая рука", "item.create.filter": "Фильтр", @@ -362,10 +458,12 @@ "item.create.golden_sheet": "Золотой лист", "item.create.handheld_blockzapper": "Ручная блоковая пушка", "item.create.handheld_worldshaper": "Ручной редактор мира", + "item.create.honey_bucket": "Ведро мёда", "item.create.integrated_circuit": "Интегральная схема", "item.create.iron_sheet": "Железный лист", "item.create.lapis_sheet": "Лазуритовый лист", - "item.create.minecart_contraption": "Вагонетка штуковина", + "item.create.minecart_contraption": "Вагонеточная штуковина", + "item.create.minecart_coupling": "Связыватель вагонеток", "item.create.polished_rose_quartz": "Полированный розовый кварц", "item.create.powdered_obsidian": "Порошкообразный обсидиан", "item.create.propeller": "Пропеллер", @@ -376,7 +474,7 @@ "item.create.schematic": "Схематика", "item.create.schematic_and_quill": "Схематика и перо", "item.create.shadow_steel": "Призрачная сталь", - "item.create.super_glue": "Супер клей", + "item.create.super_glue": "Супер-клей", "item.create.tree_fertilizer": "Удобрение для деревьев", "item.create.vertical_gearbox": "Вертикальная коробка передач", "item.create.wand_of_symmetry": "Жезл симметрии", @@ -387,7 +485,7 @@ "item.create.zinc_nugget": "Кусочек цинка", - "_": "->------------------------] Достижения [------------------------<-", + "_": "->------------------------] Advancements [------------------------<-", "advancement.create.root": "Добро пожаловать в Create", "advancement.create.root.desc": "Пришло время начать строить некоторые удивительные штуковины!", @@ -398,28 +496,60 @@ "advancement.create.shifting_gears": "Механизм переключения", "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к шестерне, что позволит изменить скорость вращения.", "advancement.create.overstressed": "Перегрузка", - "advancement.create.overstressed.desc": "Испытайте пределы стресса из первых рук.", - "advancement.create.belt": "Передай все это", + "advancement.create.overstressed.desc": "Испытайте предельную перегрузку из первых рук.", + "advancement.create.belt": "Передайте за проезд!", "advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.", + "advancement.create.tunnel": "В укрытие!", + "advancement.create.tunnel.desc": "Украсьте свой механический ремень Туннелем.", + "advancement.create.splitter_tunnel": "Разделяй и властвуй", + "advancement.create.splitter_tunnel.desc": "Создайте разделитель из группы латунных туннелей..", + "advancement.create.chute": "Упало", + "advancement.create.chute.desc": "Разместите желоб, вертикальный аналог ремня.", + "advancement.create.upward_chute": "Воздушное похищение", + "advancement.create.upward_chute.desc": "Посмотрите как предмет засасывается в желоб с вентилятором.", + "advancement.create.belt_funnel": "Болтающиеся воронки", + "advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху ремня или депо, чтобы создать её специальный тип.", + "advancement.create.belt_funnel_kiss": "Механический ужин", + "advancement.create.belt_funnel_kiss.desc": "Заставте две смонтированные на ремнях воронки поцеловаться.", + "advancement.create.fan": "Механический маг воздуха", + "advancement.create.fan.desc": "Оседлайте поток воздуха от Венитлятора.", + "advancement.create.fan_lava": "Геотермальный пространственный нагреватель", + "advancement.create.fan_lava.desc": "Попадите в поток воздуха, плавящего вещи.", + "advancement.create.fan_water": "Сумасшедшая мойка", + "advancement.create.fan_water.desc": "Попадите в поток воздуха, моющего вещи.", + "advancement.create.fan_smoke": "Механические меха", + "advancement.create.fan_smoke.desc": "Попадите в поток воздуха, коптящего вещи.", "advancement.create.wrench": "Конфигурировать удобно", "advancement.create.wrench.desc": "Создайте гаечный ключ, чтобы помочь себе в создании изобретений.", "advancement.create.goggles": "Стресс-о-зрение", - "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации для компонентов.", - "advancement.create.speedometer": "Что действительно быстро?", + "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации о компонентах.", + "advancement.create.speedometer": "Так быстро?", "advancement.create.speedometer.desc": "Поставьте и подключите спидометр. Посмотрите на спидометр через очки, чтобы прочитать точное значение.", - "advancement.create.stressometer": "Что действительно сильно?", + "advancement.create.stressometer": "Так сильно?", "advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.", + "advancement.create.aesthetics": "Бах! Эстетично!", + "advancement.create.aesthetics.desc": "Разместите кронштейн на валу, трубе или шестерне.", + "advancement.create.reinforced": "Бах! Усилено!", + "advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и механический ремень.", "advancement.create.water_wheel": "Гидравлика", "advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!", + "advancement.create.chocolate_wheel": "Вкусная сила", + "advancement.create.chocolate_wheel.desc": "Зпустите водяное колесо с помощью раплавленного шоколада.", "advancement.create.lava_wheel": "Адское колесо", "advancement.create.lava_wheel.desc": "Это не должно было работать.", + "advancement.create.cuckoo": "Уже?", + "advancement.create.cuckoo.desc": "Станьте свидетелем того, как часы с кукушкой объявляют время сна.", "advancement.create.millstone": "Карманная дробилка", "advancement.create.millstone.desc": "Поставьте и приведите в действие жернов", + "advancement.create.windmill": "Ветерок", + "advancement.create.windmill.desc": "Соберите ветряную мельницу.", + "advancement.create.maxed_windmill": "Сильный ветер", + "advancement.create.maxed_windmill.desc": "Соберите ветряную мельницу максимальной силы.", "advancement.create.andesite_casing": "Андезитовый век", "advancement.create.andesite_casing.desc": "Используйте немного андезитового сплава и дерева для создания корпуса.", "advancement.create.mechanical_drill": "Стационарные выключатели", "advancement.create.mechanical_drill.desc": "Установите и приведите в действие механическую дрель", - "advancement.create.press": "Пресс делает «Бонк!'", + "advancement.create.press": "Пресс делает «Бонк!»", "advancement.create.press.desc": "Приведите механический пресс в действие и используйте его для создания пластин.", "advancement.create.polished_rose_quartz": "Розовый алмаз", "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет прозрачным.", @@ -429,32 +559,80 @@ "advancement.create.mechanical_saw.desc": "Поставьте и подключите механическую пилу", "advancement.create.basin": "Операция в чаше", "advancement.create.basin.desc": "Поставьте чашу и попытайтесь бросить в неё предметы.", - "advancement.create.mixer": "Смешай это", + "advancement.create.mixer": "Смешать, но не взбалтывать", "advancement.create.mixer.desc": "Поставьте механический смешиватель над чашей, подключите его и начните смешивать некоторые ингредиенты.", + "advancement.create.blaze_burner": "Живая печка", + "advancement.create.blaze_burner.desc": "Получить Горелку Всполоха", "advancement.create.compact": "Автоматическое уплотнение", "advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.", - "advancement.create.expert_lane_1": "Знаток дорожек андезита", - "advancement.create.expert_lane_1.desc": "Работа в процессе", "advancement.create.brass": "Действительный сплав", "advancement.create.brass.desc": "Используйте измельчённую медь и измельчённый цинк, чтобы создать немного латуни.", "advancement.create.brass_casing": "Бронзовый век", "advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.", "advancement.create.copper_casing": "Медный век", "advancement.create.copper_casing.desc": "Используйте несколько медных листов для создания медного корпуса.", + "advancement.create.spout": "Буль", + "advancement.create.spout.desc": "Посмотрите как предмет наполняется с помощью Слива.", + "advancement.create.spout_potion": "Основательная пивоварня", + "advancement.create.spout_potion.desc": "Посмотрите как Слив наполняет бутылку зельем.", + "advancement.create.chocolate": "Сказочный мир", + "advancement.create.chocolate.desc": "Получите ведро расплавленного шоколада.", + "advancement.create.item_drain": "Осушение", + "advancement.create.item_drain.desc": "Посмотрите как жидкость выкачивается из предмета, в Предметном осушителе.", + "advancement.create.chained_item_drain": "Поехали!", + "advancement.create.chained_item_drain.desc": "Наблюдайте за тем как предмет едет через несколько соединённых предметных осушителей.", + "advancement.create.glass_pipe": "Поточный шпион", + "advancement.create.glass_pipe.desc": "Наблюдайте через окно в трубе за тем как распространяется жидкость. Окно появится на трубе при использовании гаечного ключа.", + "advancement.create.pipe_collision": "Никогда не скрещивайте потоки!", + "advancement.create.pipe_collision.desc": "Наблюдайте за тем как две жидкости встречаются в вашей сети труб.", + "advancement.create.pipe_spill": "Протечка!", + "advancement.create.pipe_spill.desc": "Посмотрите как открытый конец трубы забирает или размещает блоки жидкости в мире.", + "advancement.create.hose_pulley": "Промышленный полив", + "advancement.create.hose_pulley.desc": "Опустите шланг и смотрите как он высасывает или заполнят пространство жидкостью.", + "advancement.create.infinite_water": "Осушение океана", + "advancement.create.infinite_water.desc": "Выкачивайте воду из резервуара, считающегося бесконечным.", + "advancement.create.infinite_lava": "Уничтожение ядра", + "advancement.create.infinite_lava.desc": "Выкачивайте лаву из бассейна, считающегося бесконечным.", + "advancement.create.infinite_chocolate": "Утопая в воображении", + "advancement.create.infinite_chocolate.desc": "Выкачивайте раславленный шоколад из резервуара, считающегося бесконечным.", "advancement.create.crafter": "Автоматизированная сборка", "advancement.create.crafter.desc": "Поставьте и подключите механический крафтер", + "advancement.create.clockwork_bearing": "Хитрые часы", + "advancement.create.clockwork_bearing.desc": "Соберите структуру, расположенную на часовом механизме.", + "advancement.create.nixie_tube": "Признаки стиля", + "advancement.create.nixie_tube.desc": "Получите и разместите пару Газоразрядных индикаторов.", "advancement.create.deployer": "Тыкайте, ставьте и атакуйте", "advancement.create.deployer.desc": "Приведите в действие автономный активатор, идеальное отражение себя.", + "advancement.create.speed_controller": "Его ненавидят инженеры!", + "advancement.create.speed_controller.desc": "Установите регулятор скорости вращения, идеальное устройство для переключения передач.", + "advancement.create.flywheel": "Сердце фабрики", + "advancement.create.flywheel.desc": "Успешно соедините двигатель с маховиком.", + "advancement.create.overstress_flywheel": "Перенапряжение", + "advancement.create.overstress_flywheel.desc": "Подайте слишком большую нагрузку на печной двигатель.", + "advancement.create.integrated_circuit": "Сложные вычисления", + "advancement.create.integrated_circuit.desc": "Создайте Интегральную схему.", + "advancement.create.mechanical_arm": "Золотые руки!", + "advancement.create.mechanical_arm.desc": "Создайте Механическую руку, выбирете входы и выходы, установите в мире и запитайте. Затем смотрите как она делает за вас всю работу.", + "advancement.create.musical_arm": "Сбацай что-нибудь!", + "advancement.create.musical_arm.desc": "Посмотрите как механическая рука меняет пластинки.", + "advancement.create.arm_many_targets": "Организатор", + "advancement.create.arm_many_targets.desc": "Запрограммируйте механическую руку на 10 и больше выходов.", + "advancement.create.arm_blaze_burner": "Поджигатель", + "advancement.create.arm_blaze_burner.desc": "Запрограммируйте механическую руку на кормление Горелки Всполоха.", "advancement.create.fist_bump": "Брось это, братан!", "advancement.create.fist_bump.desc": "Сделайте два удара кулаком.", "advancement.create.crushing_wheel": "Пара гигантов", "advancement.create.crushing_wheel.desc": "Создайте несколько дробящих колес, чтобы более эффективно разрушать больше материалов.", + "advancement.create.blaze_cake": "Сахарная лихорадка", + "advancement.create.blaze_cake.desc": "Испеките особый торт для вашей Горелки Всполоха.", "advancement.create.chromatic_compound": "Биполярные минералы", "advancement.create.chromatic_compound.desc": "Создайте хроматический компаунд", "advancement.create.shadow_steel": "Возвращение пустоты", "advancement.create.shadow_steel.desc": "Создайте призрачную сталь, металлический слиток небытия.", "advancement.create.refined_radiance": "Яркий и вдохновляющий", "advancement.create.refined_radiance.desc": "Создайте изысканное сияние, мощное хроматическое вещество.", + "advancement.create.chromatic_age": "Хроматический век", + "advancement.create.chromatic_age.desc": "Создайте блоки корпуса из света и тьмы.", "advancement.create.zapper": "Строительство со стилем", "advancement.create.zapper.desc": "Создайте ручную блоковую пушку, которая поможет вам строить.", "advancement.create.upgraded_zapper": "Сияющий овердрайв", @@ -471,12 +649,12 @@ "advancement.create.eob.desc": "Ожидайте больше контента здесь в будущем. <3", - "_": "->------------------------] Пользовательский интерфейс и сообщения [------------------------<-", + "_": "->------------------------] UI & Messages [------------------------<-", "itemGroup.create.base": "Create: Механизмы", "itemGroup.create.palettes": "Create: Декор", - "death.attack.create.crush": "%1$s был обработан колёсами дробления", + "death.attack.create.crush": "%1$s был передроблен", "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", @@ -488,24 +666,31 @@ "create.recipe.crushing": "Измельчение", "create.recipe.milling": "Помол", - "create.recipe.splashing": "Массовое промывание", - "create.recipe.splashing.fan": "Вентилятор за проточной водой", - "create.recipe.smoking_via_fan": "Массовое копчение", - "create.recipe.smoking_via_fan.fan": "Вентилятор за огнем", - "create.recipe.blasting_via_fan": "Массовая плавка", - "create.recipe.blasting_via_fan.fan": "Вентилятор за лавой", + "create.recipe.fan_washing": "Объёмная промывка", + "create.recipe.fan_washing.fan": "Вентилятор за текущей водой", + "create.recipe.fan_smoking": "Объёмное копчение", + "create.recipe.fan_smoking.fan": "Вентилятор за горящим огнём", + "create.recipe.fan_blasting": "Объёмное плавление", + "create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой", "create.recipe.pressing": "Прессование", "create.recipe.mixing": "Смешивание", + "create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка", + "create.recipe.automatic_brewing": "Автоматической смешивание", "create.recipe.packing": "Прессование", - "create.recipe.mechanical_sawing": "Механическое распиливание", + "create.recipe.automatic_packing": "Автоматическая упаковка", + "create.recipe.sawing": "Распиливание", "create.recipe.mechanical_crafting": "Механическое создание", + "create.recipe.automatic_shaped": "Автоматическая форменная сборка", "create.recipe.block_cutting": "Резка блока", "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.mystery_conversion": "Хроматический метаморфоз", - "create.recipe.processing.catalyst": "Катализатор", + "create.recipe.spout_filling": "Заполнение сливом", + "create.recipe.draining": "Осушение предметов", "create.recipe.processing.chance": "%1$s%% шанса", - "create.recipe.processing.chanceToReturn": "%1$s%% шанса вернуть", + "create.recipe.heat_requirement.none": "Не требует нагрева", + "create.recipe.heat_requirement.heated": "Нагрето", + "create.recipe.heat_requirement.superheated": "Перегрето", "create.generic.range": "Диапазон", "create.generic.radius": "Радиус", @@ -519,7 +704,10 @@ "create.generic.unit.minutes": "минут", "create.generic.unit.rpm": "об./мин.", "create.generic.unit.stress": "Н*м", - "create.generic.unit.degrees": "\u00B0", + "create.generic.unit.degrees": "°", + "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "По часовой стрелке", + "create.generic.counter_clockwise": "Против часовой стрелки", "create.action.scroll": "Прокрутка", "create.action.confirm": "Подтвердить", @@ -596,6 +784,12 @@ "create.blockzapper.leftClickToSet": "Щелкните ЛКМ по блоку, чтобы выбрать материал", "create.blockzapper.empty": "Вне блоков!", + "create.minecart_coupling.two_couplings_max": "Вагонетки могут иметь только две связи", + "create.minecart_coupling.unloaded": "Кажется, часть вашего поезда в незагруженных чанках", + "create.minecart_coupling.no_loops": "Связыватели не могут образовывать петлю", + "create.minecart_coupling.removed": "Убраны все связи между вагонетками", + "create.minecart_coupling.too_far": "Вагонетки слишком далеко друг от друга", + "create.contraptions.movement_mode": "Режим движения", "create.contraptions.movement_mode.move_place": "Всегда ставить при остановке", "create.contraptions.movement_mode.move_place_returned": "Ставить только в исходное положение", @@ -607,15 +801,25 @@ "create.contraptions.cart_movement_mode.rotate": "Всегда лицом к движению", "create.contraptions.cart_movement_mode.rotate_paused": "Пауза во время вращения", "create.contraptions.cart_movement_mode.rotation_locked": "Блокировка вращения", + "create.contraptions.windmill.rotation_direction": "Направление вращения", + "create.contraptions.clockwork.clock_hands": "Стрелки часов", + "create.contraptions.clockwork.hour_first": "Сначала часовая стрелка", + "create.contraptions.clockwork.minute_first": "Сначала минутная стрелка", + "create.contraptions.clockwork.hour_first_24": "Сначала 24-часовая стрелка", "create.logistics.filter": "Фильтр", + "create.logistics.recipe_filter": "Фильтр рецепта", + "create.logistics.fluid_filter": "Фильтр жидкости", "create.logistics.firstFrequency": "Частота #1", "create.logistics.secondFrequency": "Частота #2", + "create.logistics.filter.apply": "Фильтр применён к %1$s.", + "create.logistics.filter.apply_click_again": "Фильтр применён к %1$s, кликните еще раз чтобы скопировать количество.", + "create.logistics.filter.apply_count": "Применено извлекаемое количество к фильтру.", "create.gui.goggles.generator_stats": "Статистика генератора:", "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", "create.gui.goggles.at_current_speed": "На текущей скорости", - "create.gui.goggles.base_value": "Базовая стоимость", + "create.gui.goggles.pole_length": "Длина поршня", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", "create.gui.stressometer.title": "Сетевой момент", @@ -627,12 +831,9 @@ "create.gui.adjustable_crate.title": "Регулируемый ящик", "create.gui.adjustable_crate.storageSpace": "Ёмкость", "create.gui.stockpile_switch.title": "Настраиваемый компаратор", - "create.gui.stockpile_switch.lowerLimit": "Нижний порог", - "create.gui.stockpile_switch.upperLimit": "Верхний порог", - "create.gui.stockpile_switch.startAt": "Старт сигнал на", - "create.gui.stockpile_switch.startAbove": "Старт сигнал выше", - "create.gui.stockpile_switch.stopAt": "Стоп сигнал на", - "create.gui.stockpile_switch.stopBelow": "Стоп сигнал ниже", + "create.gui.stockpile_switch.invert_signal": "Инвертировать сигнал", + "create.gui.stockpile_switch.move_to_lower_at": "Двигаться к нижней линии при %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "Двигаться к верхней линии при %1$s%%", "create.gui.sequenced_gearshift.title": "Посл. переключ. передач", "create.gui.sequenced_gearshift.instruction": "Инструкция", "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", @@ -653,7 +854,8 @@ "create.schematicAndQuill.secondPos": "Вторая позиция установлена.", "create.schematicAndQuill.noTarget": "Удерживайте [Ctrl], чтобы выбрать воздушные блоки.", "create.schematicAndQuill.abort": "Выделение убрано", - "create.schematicAndQuill.prompt": "Введите имя для схематики:", + "create.schematicAndQuill.title": "Имя схематики:", + "create.schematicAndQuill.convert": "Сохранить и развернуть немедленно", "create.schematicAndQuill.fallbackName": "Моя схематика", "create.schematicAndQuill.saved": "Сохранено как %1$s", @@ -703,25 +905,30 @@ "create.schematics.uploadTooLarge": "Ваша схематика слишком велика.", "create.schematics.maxAllowedSize": "Максимально допустимый размер файла:", + "create.gui.schematicTable.refresh": "Обновить файлы", + "create.gui.schematicTable.open_folder": "Открыть папку", "create.gui.schematicTable.title": "Схематичный стол", "create.gui.schematicTable.availableSchematics": "Доступные схемы", "create.gui.schematicTable.noSchematics": "Схемы не сохранены", "create.gui.schematicTable.uploading": "Загрузка ...", "create.gui.schematicTable.finished": "Загрузка завершена!", "create.gui.schematicannon.title": "Схематичная пушка", - "create.gui.schematicannon.settingsTitle": "Настройки размещения", "create.gui.schematicannon.listPrinter": "Список материалов", "create.gui.schematicannon.gunpowderLevel": "Порох на %1$s%%", "create.gui.schematicannon.shotsRemaining": "Выстрелов осталось: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "С резервной копией: %1$s", "create.gui.schematicannon.optionEnabled": "В настоящее время включен", "create.gui.schematicannon.optionDisabled": "В настоящее время отключен", + "create.gui.schematicannon.showOptions": "Показать настройки печати", "create.gui.schematicannon.option.dontReplaceSolid": "Не заменять целые блоки", "create.gui.schematicannon.option.replaceWithSolid": "Заменять целые блоки целыми блоками", "create.gui.schematicannon.option.replaceWithAny": "Заменять целые блоки чем угодно", "create.gui.schematicannon.option.replaceWithEmpty": "Заменять целые блоки пустотой", "create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки", "create.gui.schematicannon.option.skipTileEntities": "Защитить имущество", + "create.gui.schematicannon.slot.gunpowder": "Добавьте порох чтобы запитать пушку", + "create.gui.schematicannon.slot.listPrinter": "Положите книгу чтобы создать список предметов для схематики", + "create.gui.schematicannon.slot.schematic": "Положите свою схематику здесь. Убедитесь что она размещена в правильном месте", "create.gui.schematicannon.option.skipMissing.description": "Если пушка не может найти требуемый блок, она будет строить в следующем месте.", "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения данных, такие как сундуки.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Пушка никогда не заменит целые блоки, только не целые и воздух.", @@ -747,6 +954,9 @@ "create.schematicannon.status.schematicNotPlaced": "Схема не загружена", "create.schematicannon.status.schematicExpired": "Срок действия файла схемы истек", + "create.materialChecklist": "Список материалов", + "create.materialChecklist.blocksNotLoaded": "* Дисклеймер *\n\nСписок материалов может быть неточным из-за незагруженных чанков.", + "create.gui.filter.deny_list": "Чёрный список", "create.gui.filter.deny_list.description": "Предметы проходят, если они не соответствуют ни одному из вышеперечисленных. Пустой черный список принимает все.", "create.gui.filter.allow_list": "Белый список", @@ -757,23 +967,66 @@ "create.gui.filter.ignore_data.description": "Предметы совпадают независимо от их атрибутов.", "create.item_attributes.placeable": "можно разместить", + "create.item_attributes.placeable.inverted": "нельзя разместить", "create.item_attributes.consumable": "можно съесть", + "create.item_attributes.consumable.inverted": "нельзя съесть", "create.item_attributes.smeltable": "можно расплавить", + "create.item_attributes.smeltable.inverted": "нельзя расплавить", "create.item_attributes.washable": "можно промыть", - "create.item_attributes.smokable": "можно коптить", + "create.item_attributes.washable.inverted": "нельзя промыть", + "create.item_attributes.smokable": "можно прокоптить", + "create.item_attributes.smokable.inverted": "нельзя прокоптить", + "create.item_attributes.crushable": "можно измельчить", + "create.item_attributes.crushable.inverted": "нельзя разместить", "create.item_attributes.blastable": "плавится в доменной печи", + "create.item_attributes.blastable.inverted": "не плавится в доменной печи", "create.item_attributes.enchanted": "зачарован", + "create.item_attributes.enchanted.inverted": "не зачарован", "create.item_attributes.damaged": "повреждён", + "create.item_attributes.damaged.inverted": "не повреждён", "create.item_attributes.badly_damaged": "сильно повреждён", + "create.item_attributes.badly_damaged.inverted": "не сильно повреждён", "create.item_attributes.not_stackable": "не может складываться", + "create.item_attributes.not_stackable.inverted": "складывается", "create.item_attributes.equipable": "может быть надет", - "create.item_attributes.furnace_fuel": "это топливо", + "create.item_attributes.equipable.inverted": "не ожет быть надет", + "create.item_attributes.furnace_fuel": "является топливом", + "create.item_attributes.furnace_fuel.inverted": "не является топливом", "create.item_attributes.in_tag": "помечен %1$s", + "create.item_attributes.in_tag.inverted": "не помечен %1$s", "create.item_attributes.in_item_group": "принадлежит %1$s", + "create.item_attributes.in_item_group.inverted": "не принадлежит '%1$s'", "create.item_attributes.added_by": "был добавлен %1$s", + "create.item_attributes.added_by.inverted": "не был добавлен %1$s", + "create.item_attributes.has_enchant": "зачарован на %1$s", + "create.item_attributes.has_enchant.inverted": "не зачарован на %1$s", + "create.item_attributes.has_fluid": "содержит %1$s", + "create.item_attributes.has_fluid.inverted": "не содержит %1$s", + "create.item_attributes.has_name": "имеет нестандартное имя %1$s", + "create.item_attributes.has_name.inverted": "не имеет нестандартное имя%1$s", + "create.item_attributes.book_author": "подписана %1$s", + "create.item_attributes.book_author.inverted": "неподписана %1$s", + "create.item_attributes.book_copy_original": "оригинал", + "create.item_attributes.book_copy_original.inverted": "не оригинал", + "create.item_attributes.book_copy_first": "копия первого порядка", + "create.item_attributes.book_copy_first.inverted": "не копия первого порядка", + "create.item_attributes.book_copy_second": "копия второго порядка", + "create.item_attributes.book_copy_second.inverted": "не копия второго порядка", + "create.item_attributes.book_copy_tattered": "полный беспорядок", + "create.item_attributes.book_copy_tattered.inverted": "не полный беспорядок", + "create.item_attributes.astralsorcery_crystal": "имеет характеристики кристалла %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "не имеет характеристики кристалла %1$s", + "create.item_attributes.astralsorcery_constellation": "настроено на %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "не настроено на %1$s", + "create.item_attributes.astralsorcery_perk_gem": "имеет характеристики перка %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "не имеет характеристики перка %1$s", + "create.item_attributes.astralsorcery_amulet": "исправляет %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "не исправляет %1$s", "create.gui.attribute_filter.no_selected_attributes": "Атрибуты не выбраны", "create.gui.attribute_filter.selected_attributes": "Выбранные атрибуты:", + "create.gui.attribute_filter.add_attribute": "Добавлены атрибуты", + "create.gui.attribute_filter.add_inverted_attribute": "Добавлены противоположные атрибуты в список", "create.gui.attribute_filter.allow_list_disjunctive": "Белый список (любой)", "create.gui.attribute_filter.allow_list_disjunctive.description": "Предметы проходят, если у них есть какой-либо из выбранных атрибутов.", "create.gui.attribute_filter.allow_list_conjunctive": "Белый список (все)", @@ -790,12 +1043,12 @@ "create.tooltip.speedRequirement.none": "Нет", "create.tooltip.speedRequirement.medium": "Умеренная", "create.tooltip.speedRequirement.high": "Быстрая", - "create.tooltip.stressImpact": "Требование к моменту: %1$s", + "create.tooltip.stressImpact": "Требование к крутящему моменту: %1$s", "create.tooltip.stressImpact.low": "Низкий", "create.tooltip.stressImpact.medium": "Средний", "create.tooltip.stressImpact.high": "Высокий", "create.tooltip.stressImpact.overstressed": "Перегрузка", - "create.tooltip.capacityProvided": "Ёмкостный момент: %1$s", + "create.tooltip.capacityProvided": "Ёмкостный крутящий момент: %1$s", "create.tooltip.capacityProvided.low": "Маленький", "create.tooltip.capacityProvided.medium": "Средний", "create.tooltip.capacityProvided.high": "Большой", @@ -803,12 +1056,60 @@ "create.tooltip.generationSpeed": "Создаёт %1$s %2$s", "create.tooltip.analogStrength": "Аналоговая сила: %1$s/15", - "create.mechanical_mixer.min_ingredients": "Минимум ингредиентов", + "create.mechanical_arm.extract_from": "Берёт предметы из %1$s", + "create.mechanical_arm.deposit_to": "Складывает предметы в %1$s", + "create.mechanical_arm.summary": "Механическая рука имеет %1$s вход(ов) и %2$s выход(ов).", + "create.mechanical_arm.points_outside_range": "%1$s выбранные точки взаимодействия удалены из-за ограничений диапазона.", + + "create.logistics.when_multiple_outputs_available": "Когда доступно несколько выходов", + + "create.mechanical_arm.selection_mode.round_robin": "По кругу", + "create.mechanical_arm.selection_mode.forced_round_robin": "Принудительно по кругу", + "create.mechanical_arm.selection_mode.prefer_first": "Предпочтительна первичная цель", + + "create.tunnel.selection_mode.split": "Разделить", + "create.tunnel.selection_mode.forced_split": "Принудительно разделить", + "create.tunnel.selection_mode.round_robin": "По кругу", + "create.tunnel.selection_mode.forced_round_robin": "Принудительно по кругу", + "create.tunnel.selection_mode.prefer_nearest": "Придпочтительно ближайшее", + "create.tunnel.selection_mode.randomize": "Случайно", + "create.tunnel.selection_mode.synchronize": "Синхронизировать входы", + + "create.tooltip.chute.header": "Инвормация о желобе", + "create.tooltip.chute.items_move_down": "Предметы двигаются вниз", + "create.tooltip.chute.items_move_up": "Предметы двигаются вверх", + "create.tooltip.chute.no_fans_attached": "Нед подключеных вентиляторов", + "create.tooltip.chute.fans_push_up": "Вентилятор толкает снизу", + "create.tooltip.chute.fans_push_down": "Вентилятор толкает сверху", + "create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху", + "create.tooltip.chute.fans_pull_down": "Вентилятор тянет снизу", + + "create.hint.hose_pulley.title": "Безграничное снабжение", + "create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.", + "create.hint.mechanical_arm_no_targets.title": "Нет целей", + "create.hint.mechanical_arm_no_targets": "Кажется, эта _Механическая рука_ не имеет никаких целей. Выберите _ремни_, _депо_, _воронки_, или другие блоки, с помощью _правого клика_, удерживая _Механическую руку_.", + "create.hint.horizontal_funnel.title": "Горизонтальные воронки", + "create.hint.horizontal_funnel": "Невозможно передавать предметы _напрямую_. Попробуйте запустить _механический ремень_ или _депо_ под вашей воронкой, чтобы извлекать предметы из присоеденённого инвентаря.", + "create.hint.upward_funnel.title": "Воронка направленна вверх", + "create.hint.upward_funnel": "Может перемещать только предметы, вставленные _рукой_, _желобами_ с вентиляторами, или брошенные на неё. Попробуйте использовать _желоба_, если вам нужно перемещать предметы по вертикали.", + "create.hint.empty_bearing.title": "Обновить подшипник", + "create.hint.empty_bearing": "_Правый клик_ по подшипнику _пустой рукой_, чтобы _присоединить_ к нему структуру, которую вы только что построили перед ним.", + "create.hint.full_deployer.title": "Переполнение автономного активатора", + "create.hint.full_deployer": "Похоже, этот _автономный активатор_ содержит _лишние_ _предметы_, которые необходимо _извлечь_. Используйте _воронку_ или _другие способы_, чтобы освободить его от переполнения.", + + "create.gui.config.overlay1": "Привет :)", + "create.gui.config.overlay2": "Это образец оверлея", + "create.gui.config.overlay3": "кликни и тащи с помощью мыши", + "create.gui.config.overlay4": "чтобы переместить его", + "create.gui.config.overlay5": "Нажми ESC чтобы выйти", + "create.gui.config.overlay6": "и сохранить новую позицию", + "create.gui.config.overlay7": "Запусти /create overlay reset", + "create.gui.config.overlay8": "чтобы сбросить позицию до стандартной", "create.command.killTPSCommand": "killtps", "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Тики сервера в настоящее время замедлены на %s мс :o", "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Тики сервера теперь замедлены на %s мс >:)", - "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Тики сервера вернулись к в норму :D", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Тики сервера вернулись в норму :D", "create.command.killTPSCommand.status.usage.0": "[Create]: используйте /killtps stop , чтобы вернуть тик сервера на обычную скорость", "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", "create.command.killTPSCommand.argument.tickTime": "Время тика", @@ -822,9 +1123,10 @@ "create.subtitle.blockzapper_confirm": "Утвердительный динь", "create.subtitle.blockzapper_deny": "Тихий буп", "create.subtitle.block_funnel_eat": "Воронкообразный чмопс", + "create.subtitle.blaze_munch": "Всполох радостно жуёт", - "_": "->------------------------] Описание предметов [------------------------<-", + "_": "->------------------------] Item Descriptions [------------------------<-", "item.create.example_item.tooltip": "EXAMPLE ITEM (just a marker that this tooltip exists)", "item.create.example_item.tooltip.summary": "A brief description of the item. _Underscores_ highlight a term.", @@ -835,6 +1137,161 @@ "item.create.example_item.tooltip.control1": "When Ctrl pressed", "item.create.example_item.tooltip.action1": "These controls are displayed.", + "block.create.andesite_encased_shaft.tooltip": "ANDESITE ENCASED SHAFT", + "block.create.andesite_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите кожух на вал, находящийся _в мире_ импользуя _Андезитовый корпус_. Блоки корпуса не будут использованы.", + + "block.create.brass_encased_shaft.tooltip": "BRASS ENCASED SHAFT", + "block.create.brass_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите кожух на вал, находящийся _в мире_ импользуя _Латунный корпус_. Блоки корпуса не будут использованы.", + + "block.create.wooden_bracket.tooltip": "WOODEN BRACKET", + "block.create.wooden_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя уютное деревянное укрепление.", + + "block.create.metal_bracket.tooltip": "METAL BRACKET", + "block.create.metal_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя прочное индустриальное укрепление.", + + "block.create.andesite_casing.tooltip": "ANDESITE CASING", + "block.create.andesite_casing.tooltip.summary": "Простой корпус для механизмов с множеством применений. Безопасно для декора. Можно использовать для украшения _Валов_ и _механических ремней_.", + + "block.create.andesite_funnel.tooltip": "ANDESITE FUNNEL", + "block.create.andesite_funnel.tooltip.summary": "Стандартный компонент для транспортировки предметов. Может контролироваться _сигналом редстоуна_.", + "block.create.andesite_funnel.tooltip.condition1": "Стандартное поведение", + "block.create.andesite_funnel.tooltip.behaviour1": "_Открытая сторона_ будет собирать предметы с поверхности блока перед ней и _складывать_ их в контейнер на другой стороне воронки.", + "block.create.andesite_funnel.tooltip.condition2": "Если расположена на ремнях, депо и похожих штуках", + "block.create.andesite_funnel.tooltip.behaviour2": "_Собирает_ или _складывает_ предметы на связанный компонент, из или в _инвентарь за ней_. Если у воронки есть направление, его можно изменить с помощью _Гаечного ключа_.", + "block.create.andesite_funnel.tooltip.condition3": "Если расположена вертикально между двумя инвентарями", + "block.create.andesite_funnel.tooltip.behaviour3": "Будет _транспортировать_ предметы _вниз_, как воронка без буфера.", + + "block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL", + "block.create.andesite_tunnel.tooltip.summary": "Защитное покрытие для ваших _Механических ремней_! _Андезитовые туннели_ могут отделять один предмет от стака, когда еще один механический ремень или депо расположены рядом с соновным ремнём.", + "block.create.andesite_tunnel.tooltip.control1": "Правый клик Гаечным ключом по стороне", + "block.create.andesite_tunnel.tooltip.action1": "_Регулирует оконные ставни_, если на этой стороне туннеля есть окно.", + + "block.create.brass_funnel.tooltip": "BRASS FUNNEL", + "block.create.brass_funnel.tooltip.summary": "Стандартный компонент для транспортировки предметов. Может контролироваться _сигналом редстоуна_. Поставляется в комплекте с _фильтром_.", + "block.create.brass_funnel.tooltip.condition1": "Стандарное поведение", + "block.create.brass_funnel.tooltip.behaviour1": "_Открытая сторона_ будет собирать предметы с поверхности блока перед ней и _складывать_ их в контейнер на другой стороне воронки.", + "block.create.brass_funnel.tooltip.condition2": "Если расположена на ремнях, депо и похожих штуках", + "block.create.brass_funnel.tooltip.behaviour2": "_Собирает_ или _складывает_ предметы на связанный компонент, из или в _инвентарь за ней_. Если у воронки есть направление, его можно изменить с помощью _Гаечного ключа_", + "block.create.brass_funnel.tooltip.condition3": "Если расположена вертикально между двумя инвентарями", + "block.create.brass_funnel.tooltip.behaviour3": "Будет _транспортировать_ предметы _вниз_, как воронка без буфера.", + + "block.create.brass_tunnel.tooltip": "BRASS TUNNEL", + "block.create.brass_tunnel.tooltip.summary": "Красивое покрытие для ваших _Механических ремней_! _Латунные туннели_ так же поставляются с фильтрами и возможностью разделения стаков ваших предметов.", + "block.create.brass_tunnel.tooltip.condition1": "При размещении бок о бок", + "block.create.brass_tunnel.tooltip.behaviour1": "_Латунные туннели_ соединяются с другими, позволяя перенаправить поток предметов с одного _ремня_ на другой.", + "block.create.brass_tunnel.tooltip.condition2": "Фильтрация", + "block.create.brass_tunnel.tooltip.behaviour2": "_Латунные тунелли_ поставляюстя с фильтрами, для _входа_ и _выхода_. Если _предмет_ не соответствует _фильтру_, он будет перенаправлен на выход соседнего _туннеля_.", + "block.create.brass_tunnel.tooltip.condition3": "Разделение", + "block.create.brass_tunnel.tooltip.behaviour3": "_Латунный туннель_ может быть настроен для смены метода, по которому _предмет_ сортируется по присоеденённым _ремням_.", + "block.create.brass_tunnel.tooltip.control1": "Правый клик Гаечным ключом по стороне", + "block.create.brass_tunnel.tooltip.action1": "_Регулирует оконные ставни_, если на этой стороне туннеля есть окно.", + "block.create.brass_tunnel.tooltip.control2": "Прокрутка с гаечным ключом по верху", + "block.create.brass_tunnel.tooltip.action2": "Меняет метод разделения у присоеденённых _туннелей_.", + + "block.create.copper_casing.tooltip": "COPPER CASING", + "block.create.copper_casing.tooltip.summary": "Прочный машинный корпус для разнообразного использования. Безопасно для украшения.", + "block.create.copper_casing.tooltip.condition1": "При использовании на жидкостной трубе", + "block.create.copper_casing.tooltip.behaviour1": "Покрывает _жидкостную трубу_ _кожухом_. Трубы в кожухе _закрепят свои соединения_ и не будут соединятся с другими трубами, расположенными по соседству.", + + "block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE", + "block.create.encased_fluid_pipe.tooltip.summary": "_Труба_ в _Медном корпусе_.", + + "block.create.copper_valve_handle.tooltip": "COPPER VALVE HANDLE", + "block.create.copper_valve_handle.tooltip.summary": "Точный источник _вращательной силы_, требующий взаимодействия с игроками. Будьте осторожны, чтобы не утомиться!", + "block.create.copper_valve_handle.tooltip.condition1": "При использовании", + "block.create.copper_valve_handle.tooltip.behaviour1": "Обеспечивает _вращательную силу_ для соединённых устройств. _Присядьте_ чтобы изменить направление вращения.", + + "block.create.seat.tooltip": "SEAT", + "block.create.seat.tooltip.summary": "Присядьте и насладитесь поездкой! Привязывает игроков к собранным _устройствам_. Отлично выглядит как простая мебель! Можно окрасить в разные цвета.", + "block.create.seat.tooltip.condition1": "ПКМ по сиденью", + "block.create.seat.tooltip.behaviour1": "Сажает игрока на _Сиденье_. Нажмите _кнопку_ _приседания_ чтобы слезть.", + + "block.create.chute.tooltip": "CHUTE", + "block.create.chute.tooltip.summary": "_Собирает_ и транспортирует предметы по вертикали и диагонали. Может как брать так класть предметы в _контейнеры_. Вы так же можете взаиодействовать с желобом, разместив сбоку воронку.", + "block.create.chute.tooltip.condition1": "Если соединено с вентилятором", + "block.create.chute.tooltip.behaviour1": "Соеденённые с _вентилятором_ желоба могут двигать _предметы_ вверх, и засасывать их с _ремней_ и _депо_.", + + "block.create.depot.tooltip": "DEPOT", + "block.create.depot.tooltip.summary": "Полезное место куда вы можете класть свои _предметы_. Обеспечивает точку взаимодействия для некоторых машин", + "block.create.depot.tooltip.condition1": "При правом клике", + "block.create.depot.tooltip.behaviour1": "Размещает или забирает _предмет_ с _Депо_. _Блоки_ и _Устройства_, которые могут взаимодействовать с _ремнём_, так же работают с _Депо_.", + + "item.create.blaze_cake.tooltip": "BLAZE CAKE", + "item.create.blaze_cake.tooltip.summary": "Вкусное угощения для вашей трудяги _Горелки Всполоха_. Зажигает их всех!", + + "item.create.empty_blaze_burner.tooltip": "EMPTY BLAZE BURNER", + "item.create.empty_blaze_burner.tooltip.summary": "Маленький железный дом для ваших огненных друзей. Уверен вы найдёте им хорошее применение.", + "item.create.empty_blaze_burner.tooltip.condition1": "При использовани на Всполохе или спавнере Всполохов", + "item.create.empty_blaze_burner.tooltip.behaviour1": "_Захватывает_ Всполоха в горелку", + + "block.create.fluid_pipe.tooltip": "FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "Используется для транспортировки _жидкостей_. Требует _Механическую помпу_ для движения _жидкости_.", + "block.create.fluid_pipe.tooltip.condition1": "Транспортировка жидкости", + "block.create.fluid_pipe.tooltip.behaviour1": "Может соединяться с _жидкостными контейнерами_, такими как _бак_ или _чаша_. Открытые части _трубы_ могут собирать или размещать блоки жидкости в мире. Опасайтесь протечек!", + "block.create.fluid_pipe.tooltip.control1": "Правый клик с ключом", + "block.create.fluid_pipe.tooltip.action1": "Размещает окно на трубе, если доступно.", + + "block.create.hose_pulley.tooltip": "HOSE PULLEY", + "block.create.hose_pulley.tooltip.summary": "Используется для _размещения_ или _удаления_ больших _жидкостных резервуаров_ в мире.", + "block.create.hose_pulley.tooltip.condition1": "Когда управляется кинетически", + "block.create.hose_pulley.tooltip.behaviour1": "_Поднимает_ или _опускает_ шланг, расположение которого определяет максимальную высоту _сбора_ или _размещения_ жидкости.", + "block.create.hose_pulley.tooltip.condition2": "Когда жидкости вытягиваются из шланга", + "block.create.hose_pulley.tooltip.behaviour2": "Начинает _собирать_ блоки жидкости из резервуара, в который опущен шланг. Очень _большие резервуары_ жидкости будут считаться _бесконечными_.", + "block.create.hose_pulley.tooltip.condition3": "Когда жидкости закачиваются в шланг", + "block.create.hose_pulley.tooltip.behaviour3": "Начинает _заполнять_ жидкостью мир, до уровня расположения конца шланга.", + + "block.create.fluid_tank.tooltip": "FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "_Хранит_ ваши любимые _жидкости_. Скалируется в высоту и ширину.", + "block.create.fluid_tank.tooltip.condition1": "Правый клик с гаечным ключом", + "block.create.fluid_tank.tooltip.behaviour1": "Переключает опциональное отображение окна", + + "block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK", + "block.create.creative_fluid_tank.tooltip.summary": "Этот _Жидкостный бак_ позволяет бесконечную репликацию любой жидкости. Скалируется в высоту и ширину.", + "block.create.creative_fluid_tank.tooltip.condition1": "Когда жидкость в баке", + "block.create.creative_fluid_tank.tooltip.behaviour1": "Всё что _извлекает_ из бака, будет снабжаться _бесконечным запасом_ жидкости. Жидкости _закачивающиеся_ в бак будут _удаляться_.", + "block.create.creative_fluid_tank.tooltip.condition2": "Правый клик с гаечным ключом", + "block.create.creative_fluid_tank.tooltip.behaviour2": "Переключает опциональное отображение окна.", + + "block.create.fluid_valve.tooltip": "FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "Останавливает поток жидкости по трубе.", + "block.create.fluid_valve.tooltip.condition1": "Контролируемый поток", + "block.create.fluid_valve.tooltip.behaviour1": "Приложенная _Вращательная сила_ заставит _клапан_ закрыться, останавливая поток _жидкости_. Измените направление _вращательной силы_, чтобы снова открыть клапан.", + + "block.create.mechanical_pump.tooltip": "MECHANICAL PUMP", + "block.create.mechanical_pump.tooltip.summary": "Принимает _Вращательную силу_ и использует ее для перемещения _жидкости_ вдоль _труб_. Имеет максимальный диапазон действия в обоих направлениях. (По умолчанию 16 блоков)", + "block.create.mechanical_pump.tooltip.condition1": "Поток жидкости", + "block.create.mechanical_pump.tooltip.behaviour1": "Приложенная _вращательная сила_ создает давление, которое заставляет _жидкость_ проходить через сеть _труб_. Измените направление _вращательной силы_, чтобы изменить направление потока _жидкости_.", + "block.create.mechanical_pump.tooltip.control1": "Правый клик с гаечным ключом", + "block.create.mechanical_pump.tooltip.action1": "Изменяет направление _помпы_, меняя направление потока жидкости", + + "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "_Жидкостная труба_ с фильтром. Можно настроить какие _жидкости_ могу пройти.", + "block.create.smart_fluid_pipe.tooltip.condition1": "При закачивании жидкостей внутрь", + "block.create.smart_fluid_pipe.tooltip.behaviour1": "Умные трубы заблокируют поток жидкости, если она не соответствует фильтру.", + "block.create.smart_fluid_pipe.tooltip.condition2": "Когда подключена к жидкостному контейнеру", + "block.create.smart_fluid_pipe.tooltip.behaviour2": "Умные трубы _будут_ создавать _поток_ только той жидкости, что _соответствует_ _фильтру_.", + + "block.create.spout.tooltip": "SPOUT", + "block.create.spout.tooltip.summary": "Форсунка для пополнения предметов, имеющих возможность хранить жидкость.", + "block.create.spout.tooltip.condition1": "Транспортировка жидкости", + "block.create.spout.tooltip.behaviour1": "Когда предмет, _с возможностью содержать жидкость_, такой как _ведро_ или _бутылочка_, размещён под сливом, слив будет пытаться заполнить предмет содержащейся в нём _жидкостью_.", + "block.create.spout.tooltip.condition2": "Автоматизация жидкости", + "block.create.spout.tooltip.behaviour2": "Слив расположеный над _ремнём_ или _депо_ будет автоматически взаимодействовать с _предметами, которые могут содержать жидкость_, которые проходят под ним.", + + "block.create.item_drain.tooltip": "ITEM DRAIN", + "block.create.item_drain.tooltip.summary": "Депо с решёткой, которое может выкачивать _жидкость_ из ваших _предметов_", + "block.create.item_drain.tooltip.condition1": "Транспортировка жидкости", + "block.create.item_drain.tooltip.behaviour1": "Когда _предмет с жидкостью_, такой как _ведро_ или _бутылочка_ вставлены с боку, предметный осушитель будет автоматически извлекать жидкость, в свой собственный _бак_. Предмет будет выброшен с противоположной стороны.", + + "block.create.mechanical_arm.tooltip": "MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "Продвинутуе устройство для перемещения _предметов_.", + "block.create.mechanical_arm.tooltip.condition1": "Транспортировка предметов", + "block.create.mechanical_arm.tooltip.behaviour1": "Может брать или размещать предметы в любой открытый инвентарь, такой как _ремень_, _депо_, _воронка_ и _механический крафтер_.", + "block.create.mechanical_arm.tooltip.control1": "Когда в руке", + "block.create.mechanical_arm.tooltip.action1": "Правый клик на _открытом инвентаре_ установит _точку для сбора_, для _механической руки_. Кликните еще раз чтобы установить _точку для размещения_.", + "block.create.mechanical_arm.tooltip.control2": "Прокрутка с ключом", + "block.create.mechanical_arm.tooltip.action2": "Установит порядок размещения для _предметов_, премещаемых _механической рукой_.", + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "Идеально отражает размещаемые блоки по настроенным плоскостям.", "item.create.wand_of_symmetry.tooltip.condition1": "На панели быстрого доступа", @@ -939,9 +1396,6 @@ "block.create.gearbox.tooltip": "GEARBOX", "block.create.gearbox.tooltip.summary": "_Передаёт_ _вращение_ в _4_ _направлениях._ Реверсирует прямые соединения.", - "item.create.vertical_gearbox.tooltip": " VERTICAL GEARBOX", - "item.create.vertical_gearbox.tooltip.summary": "_Передаёт_ _вращение_ в _4_ _направлениях._ Реверсирует прямые соединения.", - "block.create.gearshift.tooltip": "GEARSHIFT", "block.create.gearshift.tooltip.summary": "_Управляет_ _направлением_ _вращения_ для соединенных валов.", "block.create.gearshift.tooltip.condition1": "Когда приведён в действие", @@ -952,15 +1406,15 @@ "block.create.clutch.tooltip.condition1": "Когда приведён в действие", "block.create.clutch.tooltip.behaviour1": "_Прекращает_ передачу вращения на другую сторону.", - "block.create.encased_belt.tooltip": "ENCASED_BELT", - "block.create.encased_belt.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоединённому конвейерному приводу.", - "block.create.encased_belt.tooltip.condition1": "Когда подключён", - "block.create.encased_belt.tooltip.behaviour1": "Прикреплённые блоки будут иметь одинаковую скорость вращения и направление. Присоединённые приводы не обязаны смотреть в ту же сторону.", + "block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE", + "block.create.encased_chain_drive.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в кожухе_. Цепные приводы соединяются, когда расположены рядом друг с другом, без необходимости использовать вал. Их направление не обязательно должно совпадать.", + "block.create.encased_chain_drive.tooltip.condition1": "Когда соединено", + "block.create.encased_chain_drive.tooltip.behaviour1": "Соединённые блоки будут получать _скорость вращения_ и его _направление_ от этого компонента.", - "block.create.adjustable_pulley.tooltip": "ANALOG BELT PULLEY", - "block.create.adjustable_pulley.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоединённому конвейерному приводу. При подаче _аналогового_ _сигнала_ _красного_ _камня_ привод будет вращаться _в_ _2_ _раза_ _быстрее_.", - "block.create.adjustable_pulley.tooltip.condition1": "Управление сигналом красивого камня", - "block.create.adjustable_pulley.tooltip.behaviour1": "_Без_ сигнала он _не_ ускорит работу подключённых приводов. При _полной_ _мощности_ сигнала, _скорость_ _удваивается_.", + "block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT", + "block.create.adjustable_chain_gearshift.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в кожухе_. Полученный _сигнал редстоуна_ будет контролировать, какой размер шестерни взаимодействует с присоединенными цепными приводами.", + "block.create.adjustable_chain_gearshift.tooltip.condition1": "Кнонтроль редстоуном", + "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Без_ сигнала редстоуна присоединённые приводы будут иметь _такую же_ скорость. При получении _сигнала редстоуна_ максимального уровня, соединённые приводы будут вращаться с ровно в два раза меньшей скоростью. Всё, что между этими значениями, будет выдавать скорость от 1 до 2 кратной скорости цепного механизма.", "item.create.belt_connector.tooltip": "BELT CONNECTOR", "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._", @@ -968,8 +1422,6 @@ "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива конвейера. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению конвейера.", "item.create.belt_connector.tooltip.control2": "ПКМ крадясь", "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для конвейера.", - "item.create.belt_connector.tooltip.control3": "Крадясь на конвейере", - "item.create.belt_connector.tooltip.action3": "Вы не будете двигаться.", "item.create.goggles.tooltip": "GOGGLES", "item.create.goggles.tooltip.summary": "Очки для улучшения зрения с помощью полезной кинетической информации.", @@ -1039,6 +1491,15 @@ "block.create.basin.tooltip": "BASIN", "block.create.basin.tooltip.summary": "Удобный _контейнер_ _для_ _предметов_, используемый при обработке _механическим_ _смешивателем_ и _механическим прессом_. Поддерживает компараторы.", + "block.create.basin.tooltip.condition1": "Авто-выход", + "block.create.basin.tooltip.behaviour1": "Когда _открытые инвентари_, такие как ремни, другие чаши, депо и т.д. находятся _под_ чашей, они будут автоматически принимать любые _жидкости_ и _предметы_, созданные в чаше. Это полезно для автоматизации.", + + "block.create.blaze_burner.tooltip": "BLAZE BURNER", + "block.create.blaze_burner.tooltip.summary": "Блок для нагревания чаши, работающий когда в нём находится прирученый Всполох.", + "block.create.blaze_burner.tooltip.condition1": "Когда расположен под чашей", + "block.create.blaze_burner.tooltip.behaviour1": "Производит _тепло_ для рецептов чаши.", + "block.create.blaze_burner.tooltip.condition2": "Когда топливо используется на Горелке Всполоха", + "block.create.blaze_burner.tooltip.behaviour2": "Увеличивает оставшееся время горения, до времени сжигания этого топлива в печке. Поглощает предмет. Используйте _Торт Всполоха_ для больших температур.", "block.create.reinforced_rail.tooltip": "REINFORCED RAIL", "block.create.reinforced_rail.tooltip.summary": "Рельсы, которые не нуждаются в поддержке.", @@ -1047,8 +1508,6 @@ "block.create.mechanical_mixer.tooltip.summary": "Кинетический венчик, используемый для смешивания предметов, находящихся под ним. Требуется _постоянная_ _вращательная_ _сила_ и _чаша_, расположенная внизу (с промежутком между ними).", "block.create.mechanical_mixer.tooltip.condition1": "Когда над чашей", "block.create.mechanical_mixer.tooltip.behaviour1": "Начинает смешивать предметы в бассейне, когда присутствуют все необходимые ингредиенты.", - "block.create.mechanical_mixer.tooltip.condition2": "При использовании с гаечным ключом", - "block.create.mechanical_mixer.tooltip.behaviour2": "_Настраивает_ _минимальное_ _количество_ _общих_ _ингредиентов_ для применяемых рецептов. Используйте эту опцию, чтобы исключить _нежелательные рецепты_ с аналогичными, но с _меньшим_ _количеством_ ингредиентов.", "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip.summary": "_Кинетический_ _сборщик_ для автоматизации любого рецепта крафта. _Поместите_ _ингредиенты_ в сетку, _соответственно_ _нужному_ _рецепту_, и расположите их так, чтобы _создать_ _поток_, который _кончается_ на одном из крафтеров.", @@ -1067,14 +1526,23 @@ "block.create.furnace_engine.tooltip.behaviour1": "_Начинает_ _приводить_ _в_ _действие_ _маховик_, расположенный _перед_ ним (на расстоянии 1 м). Используйте доменную печь для более высоких скоростей.", "block.create.flywheel.tooltip": "FLYWHEEL", - "block.create.flywheel.tooltip.summary": "Большое металлическое колесо для _удержания_ и _стабилизации_ создаваемой силы с помощью _прикреплённого_ _двигателя_. Маховики _соединяются_ с _двигателями_, если они находятся на расстоянии _1_ _м_ друг от друга и под углом _90\u00B0_ друг к другу.", + "block.create.flywheel.tooltip.summary": "Большое металлическое колесо для _удержания_ и _стабилизации_ создаваемой силы с помощью _прикреплённого_ _двигателя_. Маховики _соединяются_ с _двигателями_, если они находятся на расстоянии _1_ _м_ друг от друга и под углом _90°_ друг к другу.", "block.create.flywheel.tooltip.condition1": "При подключении к работающему двигателю", "block.create.flywheel.tooltip.behaviour1": "Обеспечивает вращательную силу для подключенного устройства в зависимости от силы и скорости генератора.", "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", - "block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов в и из _конструкции_, перемещаемой поршнем, шасси, вагонеткой или конвейром.", + "block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов внутрь или из _конструкции_, перемещаемой _поршнем_, _шасси_, _вагонеткой_ или _ремнём_.", "block.create.portable_storage_interface.tooltip.condition1": "Во время движения", "block.create.portable_storage_interface.tooltip.behaviour1": "Взаимодействует со стационарными переместителями так, что переместители, обращенные в сторону от интерфейса, вытягивают предметы, а транспортеры, нацеленные на интерфейс, вставляют предметы из прикреплённого инвентаря. Конструкция ненадолго остановится при обмене предметов.", + "block.create.portable_storage_interface.tooltip.condition2": "Когда запитан редстоуном", + "block.create.portable_storage_interface.tooltip.behaviour2": "Немедленно _разрывает_ все соединения.", + + "block.create.portable_fluid_interface.tooltip": "PORTABLE FLUID INTERFACE", + "block.create.portable_fluid_interface.tooltip.summary": "Переносная точка обмена для _перемещения жидкостей_ из или в конструкцию, перемещаемую _поршнем_, _подшипником_, _вагонеткой_ или _лебёдкой_. Два смежных интерфейса должны располагаться _лицом друг_ _к другу_, на расстоянии _1-2 блока друг от друга_.", + "block.create.portable_fluid_interface.tooltip.condition1": "При движении", + "block.create.portable_fluid_interface.tooltip.behaviour1": "Взаимодействует со стационарными _переносными интерфейсами хранения_ для передачи жидкостей в устройство или из него. Трубы, вставленые в _Стационарный интерфейс_, будут напрямую взаимодействовать с резервуарами на устройстве. Конструкция на короткое время остановится для обмена жидкостями.", + "block.create.portable_fluid_interface.tooltip.condition2": "При получении сигнала редстоуна", + "block.create.portable_fluid_interface.tooltip.behaviour2": "Немедленно _разрывает_ текущие соединения.", "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", "block.create.rotation_speed_controller.tooltip.summary": "_Настраиваемое_ _реле_, способное _ускорять_ или _замедлять_ скорость до любой желаемой.", @@ -1086,11 +1554,6 @@ "block.create.mechanical_piston.tooltip.condition1": "При вращении", "block.create.mechanical_piston.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", - "block.create.sticky_mechanical_piston.tooltip": "STICKY MECHANICAL PISTON", - "block.create.sticky_mechanical_piston.tooltip.summary": "Более продвинутая версия _липкого_ _поршня_. Он использует _силу_ _вращения_ для _точного_ перемещения прикреплённых конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без _удлинителей_ поршень _не_ будет двигаться. Используйте блоки _шасси_ или _слизи_, чтобы перемещать _более_ одной линии блоков.", - "block.create.sticky_mechanical_piston.tooltip.condition1": "При вращении", - "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", - "block.create.piston_extension_pole.tooltip": "PISTON POLE", "block.create.piston_extension_pole.tooltip.summary": "Используется для увеличения длины _механического_ _поршня_.", "block.create.piston_extension_pole.tooltip.condition1": "При присоединении к механическому поршню", @@ -1100,8 +1563,19 @@ "block.create.mechanical_bearing.tooltip.summary": "Используется для _вращения_ _больших_ _конструкций_ или генерации _силы_ _вращения_ с помощью ветра.", "block.create.mechanical_bearing.tooltip.condition1": "При вращении", "block.create.mechanical_bearing.tooltip.behaviour1": "Начинает вращение прикреплённых блоков. Используйте блоки шасси или слизи, чтобы перемещать более одного блока.", - "block.create.mechanical_bearing.tooltip.condition2": "При подаче сигнала красного камня", - "block.create.mechanical_bearing.tooltip.behaviour2": "Обеспечивает вращательную силу, создаваемую вращением прикреплённой структуры. Структура должна включать подходящие _парусные_ _блоки_ (в настоящее время любой шерстяной блок).", + + "block.create.windmill_bearing.tooltip": "WINDMILL BEARING", + "block.create.windmill_bearing.tooltip.summary": "Нужен для использования _ротационной силы_ от ветра. Присоедините постройку собственного дизайна и смотрите как она крутится!", + "block.create.windmill_bearing.tooltip.condition1": "При клике правой кнопкой мыши", + "block.create.windmill_bearing.tooltip.behaviour1": "Обеспечивает _Ротационную силу_, сгенерированную от вращения присоеденённой структуры. Структура должна иметь _Парус_ или _Шерсть_. Используйте _Шасси_, _Слизь_ или _Супер-клей_ чтобы двигать больше одного блока.", + + "block.create.sail_frame.tooltip": "SAIL FRAME", + "block.create.sail_frame.tooltip.summary": "Полезный строительный блок и источник кинетической энергии, когда используется как часть конструкции на _Подшипнике ветряной мельницы_.", + + "block.create.white_sail.tooltip": "SAIL", + "block.create.white_sail.tooltip.summary": "Полезный строительный блок и источник кинетической энергии, когда используется как часть конструкции на _Подшипнике ветряной мельницы_. Доступен в разных цветах.", + "block.create.white_sail.tooltip.condition1": "При клике правой кнопкой с красителем в руке", + "block.create.white_sail.tooltip.behaviour1": "Меняет цвет паруса.", "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", "block.create.clockwork_bearing.tooltip.summary": "Усовершенствованная версия _радиального_ _шасси_ для вращения _до_ _двух_ стрелок в соответствии с текущим _игровым_ _временем_.", @@ -1120,11 +1594,15 @@ "block.create.cart_assembler.tooltip.condition1": "При размещении над рельсами", "block.create.cart_assembler.tooltip.behaviour1": "По умолчанию _разбирает_ _вагонетки_, _при_ _подаче_ _сигнала_ красного камня _собирает-.", "block.create.cart_assembler.tooltip.condition2": "При размещении над энергорельсами", - "block.create.cart_assembler.tooltip.behaviour2": "_Собирает_ и _ускоряет_ вагонетки _при_ _сигнале_ красного камня, в противном случае _разбирает_ и _удерживает_ их.", - "block.create.cart_assembler.tooltip.condition3": "При размещении над рельсами с датчиком", - "block.create.cart_assembler.tooltip.behaviour3": "_Собирает_ _разобранные_ вагонетки, _разбирает_ _собранные_ вагонетки.", - "block.create.cart_assembler.tooltip.condition4": "При размещении над активирующими рельсами", - "block.create.cart_assembler.tooltip.behaviour4": "_Разбирает_ _тележки_ _при_ сигнале_ красного камня.", + "block.create.cart_assembler.tooltip.behaviour2": "_Собирает_ и _ускоряет_ вагонетки при _активном сигнале_ красного камня, в противном случае _разбирает_ и _удерживает_ их.", + "block.create.cart_assembler.tooltip.control1": "Когда размещён на рельсах", + "block.create.cart_assembler.tooltip.action1": "_Собирает_ проходящие вагонетки, _если запитан_, и _разбирает_ их, если нет.", + "block.create.cart_assembler.tooltip.control2": "Когда размещён на активированых рельсах", + "block.create.cart_assembler.tooltip.action2": "Собирает и _ускоряет_ вагонетки _если запитан_, разбирает и _держит_ их на месте, если нет.", + "block.create.cart_assembler.tooltip.control3": "Когда размещён на рельсах с датчиком", + "block.create.cart_assembler.tooltip.action3": "_Собирает не собраные_ вагонетки, и _разбирает собраные_.", + "block.create.cart_assembler.tooltip.control4": "Когда размещён на активирущих рельсах", + "block.create.cart_assembler.tooltip.action4": "_Разбирает_ вагонетки если запитан.", "block.create.rope_pulley.tooltip": "ROPE PULLEY", "block.create.rope_pulley.tooltip.summary": "Перемещает прикреплённые _блоки_ и _конструкции_ по _вертикали_. Используйте блоки _шасси_ или _слизи_, чтобы перемещать более одного блока.", @@ -1140,6 +1618,9 @@ "block.create.linear_chassis.tooltip.control1": "ПКМ сгустком слизи", "block.create.linear_chassis.tooltip.action1": "Делает нужную сторону липкой. При перемещении шасси будет тянуть прикреплённые блоки независимо от направления движения.", + "block.create.secondary_linear_chassis.tooltip": "SECONDARY LINEAR CHASSIS", + "block.create.secondary_linear_chassis.tooltip.summary": "Второй тип _Линейного шасси_, которое не соеденяется с другими.", + "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", "block.create.radial_chassis.tooltip.summary": "Конфигурируемый базовый блок, соединяющий конструкции для движения.", "block.create.radial_chassis.tooltip.condition1": "При движении", @@ -1179,10 +1660,9 @@ "block.create.stockpile_switch.tooltip.summary": "Подаёт сигнал красного камня в зависимости от _заполниности_ _прикреплённого_ _ящика_.", "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего предела", "block.create.stockpile_switch.tooltip.behaviour1": "Не подаёт _сигнал_ _красного_ _камня_.", - "block.create.stockpile_switch.tooltip.condition2": "Когда выше верхнего предела", - "block.create.stockpile_switch.tooltip.behaviour2": "Начинает давать _сигнал_ _красного_ _камня_, пака нижний предел не будет достигнут снова.", - "block.create.stockpile_switch.tooltip.control1": "При ПКМ", - "block.create.stockpile_switch.tooltip.action1": "Открывается _интерфейс_ _конфигурации_.", + + "block.create.content_observer.tooltip": "CONTENT OBSERVER", + "block.create.content_observer.tooltip.summary": "_Обнаруживает элементы_ внутри _контейнеров_ и _конвейеров_, соответствующие настроенному _фильтру_. Если наблюдаемый инвентарь, ремень или шланг содержит совпадающий элемент, этот компонент излучает сигнал красного камня. Когда наблюдаемая _ воронка передает_ соответствующий предмет, этот компонент испускает _импульс_.", "block.create.redstone_link.tooltip": "REDSTONE LINK", "block.create.redstone_link.tooltip.summary": "_Беспроводной_ _передатчик_ сигнала красного камня. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", @@ -1197,6 +1677,8 @@ "block.create.nixie_tube.tooltip.summary": "Красивый дисплей с питанием от _сигнала_ _красного_ _камня_ в диапазоне от 0 до 15.", "block.create.nixie_tube.tooltip.condition1": "При подаче сигнала красного камня", "block.create.nixie_tube.tooltip.behaviour1": "Показывает _текущую_ _силу_ _сигнала_ красного камня в качестве отображаемого значения.", + "block.create.nixie_tube.tooltip.condition2": "С биркой", + "block.create.nixie_tube.tooltip.behaviour2": "Отображает _содержимое_ вашей _бирки_, если несколько газоразрядных индикаторов _подключены_ в _одну линию_.", "block.create.redstone_contact.tooltip": "REDSTONE CONTACT", "block.create.redstone_contact.tooltip.summary": "Простое устройство для продвинутых механизмов. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", @@ -1206,7 +1688,7 @@ "block.create.redstone_contact.tooltip.behaviour2": "Активирует все стационарные контакты, которые проходит.", "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", - "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стеков любого предмета. Поддерживает компараторы.", + "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стэков любого предмета. Поддерживает компараторы.", "block.create.adjustable_crate.tooltip.control1": "При ПКМ", "block.create.adjustable_crate.tooltip.action1": "Открывается _интерфейс_.", @@ -1215,76 +1697,17 @@ "block.create.creative_crate.tooltip.condition1": "Когда предмет в слоте фильтра", "block.create.creative_crate.tooltip.behaviour1": "Все, что извлечено из этого контейнера, обеспечит бесконечную поставку указанного предмета. Предметы, _вставленные_ в этот ящик, будут _аннулированы_.", - "block.create.extractor.tooltip": "EXTRACTOR", - "block.create.extractor.tooltip.summary": "_Берет_ _предметы_ из прикреплённого _инвентаря_ и _бросает_ их на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов.", - "block.create.extractor.tooltip.condition1": "При получении сигнал красного камня", - "block.create.extractor.tooltip.behaviour1": "Приостанавливает извлечение.", - "block.create.extractor.tooltip.condition2": "В конвейере", - "block.create.extractor.tooltip.behaviour2": "Извлекающие устройства могут вытягивать предметы с _конвейеров_, усиленных _латунным_ _корпусом_. Когда извлекающие устройство не может бросать предметы, конвейер останавливается.", - "block.create.extractor.tooltip.control1": "ПКМ по фильтру", - "block.create.extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Извлекающие устройство будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", - - "block.create.transposer.tooltip": "TRANSPOSER", - "block.create.transposer.tooltip.summary": "_Берет_ _предметы_ из прикреплённого _инвентаря_ и немедленно помещает их в целевой _инвентарь_. Может быть назначен стек предметов в качестве _фильтра_.", - "block.create.transposer.tooltip.condition1": "При получении сигнала красного камня", - "block.create.transposer.tooltip.behaviour1": "_Приостанавливает_ преместитель.", - "block.create.transposer.tooltip.condition2": "В конвейере", - "block.create.transposer.tooltip.behaviour2": "Переместители могут вытягивать предметы с _конвейеров_, усиленных _латунным_ _корпусом_. Когда переместитель не может бросать предметы, конвейер останавливается.", - "block.create.transposer.tooltip.control1": "ПКМ по фильтру", - "block.create.transposer.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Переместитель будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", - "block.create.deployer.tooltip": "DEPLOYER", "block.create.deployer.tooltip.summary": "_Ударяет_, _использует_ и _активирует_. Эта машина постарается максимально _имитировать_ _игрока_. Может _брать_ и _класть_ _предметы_ в соседний _инвентарь_. Может быть назначен _фильтр_ в виде стака предметов.", "block.create.deployer.tooltip.condition1": "При вращении", "block.create.deployer.tooltip.behaviour1": "_Вытягивает_ _руку_ и _активирует_ на _2_ _м_ _впереди_ себя.", "block.create.deployer.tooltip.condition2": "ПКМ гаечным ключом", "block.create.deployer.tooltip.behaviour2": "Переключает режим удара. В режиме пробивки автономный активатор попытается использовать свой предмет, чтобы разбить блоки или нанести урон сущностям.", - - "block.create.linked_extractor.tooltip": "LINKED EXTRACTOR", - "block.create.linked_extractor.tooltip.summary": "_Берет_ _предметы_ из прикреплённого _инвентаря_ и _бросает_ их на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов. Может управляться удаленно через беспроводной передатчик сигнала красного камня.", - "block.create.linked_extractor.tooltip.condition1": "Когда соединение активно", - "block.create.linked_extractor.tooltip.behaviour1": "Приостанавливает извлечение.", - "block.create.linked_extractor.tooltip.control1": "ПКМ по фильтру", - "block.create.linked_extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Извлекающие устройство будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", - "block.create.linked_extractor.tooltip.control2": "При ПКМ предметом на частотном пространстве", - "block.create.linked_extractor.tooltip.action2": "Назначает текущий _удерживаемый_ _предмет_ как часть прослушиваемой частоты. Каждый раз когда на беспроводной передатчик сигнала красного камня, настроенного на ту-же частоту подаётся сигнал - извлечение приостанавливается.", - - "block.create.linked_transposer.tooltip": "LINKED TRANSPOSER", - "block.create.linked_transposer.tooltip.summary": "_Берет_ _предметы_ из прикрёпленного _инвентаря_ и немедленно помещает их в целевой _инвентарь_. Может быть назначен стек предметов в качестве _фильтра_. Может управляться удаленно через беспроводной передатчик сигнала красного камня.", - "block.create.linked_transposer.tooltip.condition1": "Когда соединение активно", - "block.create.linked_transposer.tooltip.behaviour1": "_Приостанавливает_ преместитель.", - "block.create.linked_transposer.tooltip.control1": "ПКМ по фильтру", - "block.create.linked_transposer.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Переместитель будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", - "block.create.linked_transposer.tooltip.control2": "При ПКМ предметом на частотном пространстве", - "block.create.linked_transposer.tooltip.action2": "Назначает текущий _удерживаемый_ _предмет_ как часть прослушиваемой частоты. Каждый раз когда на беспроводной передатчик сигнала красного камня, настроенного на ту-же частоту подаётся сигнал - переместитель приостанавливается.", - - "block.create.funnel.tooltip": "FUNNEL", - "block.create.funnel.tooltip.summary": "_Собирает_ _поступающие_ _предметы_ и вставляет их в прилагаемый _инвентарь_, если это возможно. Может собирать предметы из мира или из конвейера.", - "block.create.funnel.tooltip.condition1": "Сбор предметов с конвейера", - "block.create.funnel.tooltip.behaviour1": "Воронки могут вытягивать предметы с _конвейеров_, когда они находятся над ними, сбоку или на конце. При отсутствии свободного места в прилагаемом инвентаре, предметы _на_ _конвейере_ _не_ _останавливаются_.", - - "block.create.belt_tunnel.tooltip": "BELT TUNNEL", - "block.create.belt_tunnel.tooltip.summary": "Эстетичный вариант для прохождения ваших _конвейеров_ сквозь стены. Конвейеры при этом должны быть усилены латунным корпусом. Туннели могут с_инхронизироваться_ _со_ _своими_ _соседями_, пропуская предметы, только если все туннели в группе имеют одно ожидание. [Ctrl]", - "block.create.belt_tunnel.tooltip.control1": "ПКМ по передней стороне ключом", - "block.create.belt_tunnel.tooltip.action1": "Переключает _синхронизированное_ _поведение_. Синхронизированные туннели удерживают предметы до тех пор, пока их соседи не получат предмет.", - "block.create.belt_tunnel.tooltip.control2": "ПКМ по стороне ключом", - "block.create.belt_tunnel.tooltip.action2": "_Регулирует_ _шторки_, если у туннеля есть окно на этой стороне.", + "block.create.deployer.tooltip.condition3": "Когда установлен фильтр", + "block.create.deployer.tooltip.behaviour3": "Автоматический активатор будет активирован, если только удерживаемый предмет _совпадает_ с предметом в _фильтре_. Не совпадающие предметы не могут быть помещены; Удерживаемые предметы, соответствующие фильтру, не могут быть извлечены.", "block.create.brass_casing.tooltip": "BRASS CASING", - "block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Сейф для украшения.", - "block.create.brass_casing.tooltip.condition1": "При использовании на конвейере", - "block.create.brass_casing.tooltip.behaviour1": "Усиливает конвейеры латунным основанием. Усиленные конвейеры _поддерживают_ _конвейерные_ _тунели_, _извлекающие_ _устройства_, _воронки_ и _периместители_, взаимодействующие с конвейером сбоку и снизу.", - - "block.create.belt_observer.tooltip": "BELT OBSERVER", - "block.create.belt_observer.tooltip.summary": "Обнаруживает предметы и объекты, проходящие мимо по _конвейеру_ перед ним. Используйте _гаечный_ _ключ_ для смены режима. Не предметы всегда будут обрабатываться в режиме обнаружения независимо от настроек.", - "block.create.belt_observer.tooltip.condition1": "Режим обнаружения", - "block.create.belt_observer.tooltip.behaviour1": "_Обеспечивает_ _сигнал_ красного камня, _пока_ _соответствующий_ _предмет_ находится в наблюдаемом сегменте конвейера.", - "block.create.belt_observer.tooltip.condition2": "Импульсный режим", - "block.create.belt_observer.tooltip.behaviour2": "_Издаёт_ _импульс_, когда _соответствующий_ _элемент_ проходит центр наблюдаемого сегмента конвейера.", - "block.create.belt_observer.tooltip.condition3": "Режим выброса", - "block.create.belt_observer.tooltip.behaviour3": "_Выбрасывает_ _соответствующие_ _предметы со стороны. Если целевой конвейер или пространство _занято_, предмет будет удерживаться на месте.", - "block.create.belt_observer.tooltip.condition4": "Режим разделения", - "block.create.belt_observer.tooltip.behaviour4": "_Разбивает_ _соответствующий_ _стек_ _предметов_ и _выбрасывает_ _половину_ из него сбоку.", + "block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Безопасно для украшения.", "block.create.pulse_repeater.tooltip": "PULSE REPEATER", "block.create.pulse_repeater.tooltip.summary": "Простая схема обрезки длинны проходящего сигнала до _1_ _тика_.", @@ -1304,6 +1727,11 @@ "block.create.powered_latch.tooltip": "POWERED LATCH", "block.create.powered_latch.tooltip.summary": "Рычаг, которым можно управлять с помощью сигналов красного камня. Сигнал с задней стороны включает его, сигнал со стороны сбрасывает его.", + "block.create.controller_rail.tooltip": "CONTROLLER RAIL", + "block.create.controller_rail.tooltip.summary": "_Все-направленные запитанные рельсы_, позволяющие _точную настройку_ _скорости_ вагонеток.", + "block.create.controller_rail.tooltip.condition1": "Когда запитано редстоун-сигналом", + "block.create.controller_rail.tooltip.behaviour1": "_Ускоряет_ или _замедляет_ _прошедшие вагонетки_, на велечину зависящую от _силы сигнала_. Распространая сигнал красного камня на соседние контролирующие рельсы. Питание двух контроллирующих рельс с разной мощностью приведет к тому, что дорожки между ними будут интерполировать свой сигнал.", + "block.create.speedometer.tooltip": "SPEEDOMETER", "block.create.speedometer.tooltip.summary": "Измеряет и отображает _скорость_ _вращения_ прикреплённых кинетических компонентов. Поддерживает _компараторы_.", "block.create.speedometer.tooltip.condition1": "При вращении", @@ -1314,10 +1742,10 @@ "block.create.stressometer.tooltip.condition1": "При вращении", "block.create.stressometer.tooltip.behaviour1": "Указывает цвет, соответствующий уровню момента. Перенапряженные сети перестанут двигаться. Напряжение можно снять, добавив в сеть дополнительные источники вращения.", - "tool.create.sand_paper.tooltip": "SAND PAPER", - "tool.create.sand_paper.tooltip.summary": "Грубая бумага, которую можно использовать для _полировки_ _материалов_. Может быть автоматически применен с помощью автономного активатора.", - "tool.create.sand_paper.tooltip.condition1": "При использовании", - "tool.create.sand_paper.tooltip.behaviour1": "Полирует предметы, находящиеся в другой руке или лежащие на полу, при наведении на них", + "item.create.sand_paper.tooltip": "SAND PAPER", + "item.create.sand_paper.tooltip.summary": "Грубая бумага, которую можно использовать для _полировки материалов_. Может применяться автоматически с помощью автономного активатора.", + "item.create.sand_paper.tooltip.condition1": "Когда используется", + "item.create.sand_paper.tooltip.behaviour1": "Полирует предметы во _второй руке_, или лежащие _на полу_, если _смотреть на них_", "item.create.super_glue.tooltip": "SUPER GLUE", "item.create.super_glue.tooltip.summary": "Приклейте блок к другому, и они навсегда будут неразлучны.", @@ -1326,22 +1754,30 @@ "item.create.super_glue.tooltip.condition2": "Кода в другой руке", "item.create.super_glue.tooltip.behaviour2": "Автоматически _прикрепляет_ _блоки_, расположенные от основной руки, к той _стороне_, _против_ _которой_ они были.", + "item.create.builders_tea.tooltip": "BUILDERS TEA", + "item.create.builders_tea.tooltip.summary": "Идеальный напиток для начала дня. _Мотивирует и насыщает_.", + "item.create.refined_radiance.tooltip": "REFINED RADIANCE", "item.create.refined_radiance.tooltip.summary": "Хроматический материал, _добытый_ _из_ _поглощенного_ _света_.", "item.create.shadow_steel.tooltip": "SHADOW STEEL", "item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.", + "item.create.minecart_coupling.tooltip": "MINECART COUPLING", + "item.create.minecart_coupling.tooltip.summary": "_Соединяет_ ваши _вагонетки_ или or _Перевозочные устройства_ вместе, чтобы создать великолепный поезд.", + "item.create.minecart_coupling.tooltip.condition1": "При использовании на вагонетке", + "item.create.minecart_coupling.tooltip.behaviour1": "_Соединяет_ две вагонетки вместе, пытаясь держать их на _определенной дистанции_ при движении.", + "item.create.crafter_slot_cover.tooltip": "SLOT COVER", "item.create.crafter_slot_cover.tooltip.summary": "Используется для обозначения слота как пустой слот рецепта в _механическом_ _крафтере_. Крафтеры не обязательно должны образовывать полную квадратную сетку. Это полезно если есть рецепты, где ингредиенты располагаются _по_ _диагонали_ друг к другу.", "create.tooltip.wip": "WIP", "create.tooltip.workInProgress": "Работа продолжается!", "create.tooltip.randomWipDescription0": "Пожалуйста держите этот предмет подальше от детей!", - "create.tooltip.randomWipDescription1": "Маленькая панда умирает каждый раз, когда вы используете этот предмет. Каждый. Время.", + "create.tooltip.randomWipDescription1": "Маленькая панда умирает каждый раз, когда вы используете этот предмет. Каждый. Раз.", "create.tooltip.randomWipDescription2": "Используйте на свой страх и риск.", "create.tooltip.randomWipDescription3": "Это не тот предмет, который вы ищете, *шевелит пальцами* пожалуйста, ускорьтесь.", - "create.tooltip.randomWipDescription4": "Этот предмет самоуничтожится за 10 секунд. 10, 9, 8...", + "create.tooltip.randomWipDescription4": "Этот предмет самоуничтожится через 10 секунд. 10, 9, 8...", "create.tooltip.randomWipDescription5": "Поверьте мне, это бесполезно.", "create.tooltip.randomWipDescription6": "Используя этот пункт, вы тем самым соглашаетесь с нашим отказом от ответственности и соглашаетесь с его условиями.", "create.tooltip.randomWipDescription7": "Этот, возможно, но не для тебя. Как насчет этого?", diff --git a/src/main/resources/assets/create/models/block/belt_tunnel/item.json b/src/main/resources/assets/create/models/block/belt_tunnel/item.json index 7a0e31101..387034dcc 100644 --- a/src/main/resources/assets/create/models/block/belt_tunnel/item.json +++ b/src/main/resources/assets/create/models/block/belt_tunnel/item.json @@ -228,7 +228,7 @@ "scale": [0.25, 0.25, 0.25] }, "gui": { - "rotation": [30, 225, 0], + "rotation": [30, 135, 0], "translation": [0, 1, 0], "scale": [0.5, 0.5, 0.5] }, diff --git a/src/main/resources/assets/create/models/block/bracket/cog/ground.json b/src/main/resources/assets/create/models/block/bracket/cog/ground.json index d219fe22e..cb04e2b39 100644 --- a/src/main/resources/assets/create/models/block/bracket/cog/ground.json +++ b/src/main/resources/assets/create/models/block/bracket/cog/ground.json @@ -3,7 +3,8 @@ "parent": "block/block", "textures": { "4": "#plate", - "5": "#bracket" + "5": "#bracket", + "particle": "#plate" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/clutch/item.json b/src/main/resources/assets/create/models/block/clutch/item.json index eda38aa09..102f2202d 100644 --- a/src/main/resources/assets/create/models/block/clutch/item.json +++ b/src/main/resources/assets/create/models/block/clutch/item.json @@ -14,11 +14,11 @@ "from": [0, 0, 0], "to": [16, 2, 16], "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "north": {"uv": [0, 14, 16, 16], "texture": "#1"}, "east": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 14, 16, 16], "texture": "#1"}, "west": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"} } }, @@ -36,12 +36,12 @@ "from": [0, 14, 0], "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 2], "texture": "#0"}, + "north": {"uv": [0, 0, 16, 2], "texture": "#1"}, "east": {"uv": [0, 0, 16, 2], "texture": "#0"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#1"}, "west": {"uv": [0, 0, 16, 2], "texture": "#0"}, "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#0"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/funnel/block.json b/src/main/resources/assets/create/models/block/funnel/block.json deleted file mode 100644 index 9f46b9da0..000000000 --- a/src/main/resources/assets/create/models/block/funnel/block.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "create:block/brass_funnel_plating", - "1": "create:block/brass_block", - "2": "create:block/brass_funnel", - "3": "create:block/brass_funnel_back", - "particle": "#1" - }, - "elements": [ - { - "from": [2.1, -1.9, 2.1], - "to": [13.9, 2, 13.9], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 7, 10]}, - "faces": { - "north": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "east": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "south": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "west": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "up": {"uv": [0, 4, 12, 16], "texture": "#2"}, - "down": {"uv": [6, 8, 12, 14], "texture": "#3"} - } - }, - { - "from": [2, 10, 14], - "to": [14, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, 12]}, - "faces": { - "north": {"uv": [2, 1, 14, 7], "texture": "#1"}, - "south": {"uv": [1, 0, 7, 3], "texture": "#0"}, - "up": {"uv": [2, 14, 14, 16], "texture": "#1"}, - "down": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#1"} - } - }, - { - "from": [2, 10, 0], - "to": [14, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, -2]}, - "faces": { - "north": {"uv": [1, 0, 7, 3], "texture": "#0"}, - "south": {"uv": [2, 1, 14, 7], "texture": "#1"}, - "up": {"uv": [2, 0, 14, 2], "texture": "#1"}, - "down": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#1"} - } - }, - { - "from": [0, 10, 0], - "to": [2, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [-2, 19, -2]}, - "faces": { - "north": {"uv": [7, 0, 8, 3], "texture": "#0"}, - "east": {"uv": [0, 1, 16, 7], "texture": "#1"}, - "south": {"uv": [0, 0, 1, 3], "texture": "#0"}, - "west": {"uv": [0, 0, 8, 3], "texture": "#0"}, - "up": {"uv": [0, 0, 2, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#1"} - } - }, - { - "from": [14, 10, 0], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [12, 19, -2]}, - "faces": { - "north": {"uv": [0, 0, 1, 3], "texture": "#0"}, - "east": {"uv": [0, 0, 8, 3], "texture": "#0"}, - "south": {"uv": [7, 0, 8, 3], "texture": "#0"}, - "west": {"uv": [0, 1, 16, 7], "texture": "#1"}, - "up": {"uv": [14, 0, 16, 16], "texture": "#1"}, - "down": {"uv": [14, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [2, 6, 2], - "to": [14, 10, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 15, 10]}, - "faces": { - "north": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "east": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "south": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "west": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "down": {"uv": [0, 0, 6, 6], "texture": "#3"} - } - }, - { - "from": [2, 11, 2], - "to": [14, 15, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 10]}, - "faces": { - "up": {"uv": [0, 8, 6, 14], "texture": "#3"} - } - }, - { - "from": [3, 2, 3], - "to": [13, 6, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 11, 10]}, - "faces": { - "north": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, - "east": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, - "south": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, - "west": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block_ceiling.json b/src/main/resources/assets/create/models/block/funnel/block_ceiling.json new file mode 100644 index 000000000..5a70211b5 --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/block_ceiling.json @@ -0,0 +1,134 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "2_2": "create:block/brass_funnel_pull" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, 6, 0], + "to": [16.05, 12, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, + "faces": { + "north": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, + "east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [0, 0, 2, 6], "rotation": 180, "texture": "#2_2"}, + "west": {"uv": [0, 12, 16, 6], "texture": "#2_2"}, + "up": {"uv": [15, 0, 16, 8], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 8], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "LeftWall", + "from": [-0.05, 6, 0], + "to": [2, 12, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, + "faces": { + "north": {"uv": [2, 0, 0, 6], "texture": "#2_2"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, + "west": {"uv": [0, 6, 16, 0], "texture": "#2_2"}, + "up": {"uv": [8, 0, 9, 8], "texture": "#7"}, + "down": {"uv": [7, 0, 8, 8], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 6, 0], + "to": [14, 12, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, + "faces": { + "north": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [9, 13, 15, 16], "rotation": 180, "texture": "#7"}, + "up": {"uv": [9, 0, 15, 3], "texture": "#7"}, + "down": {"uv": [1, 0, 7, 3], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 6, 14], + "to": [14, 12, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 18]}, + "faces": { + "north": {"uv": [15, 13, 9, 16], "rotation": 180, "texture": "#7"}, + "south": {"uv": [14, 0, 2, 6], "rotation": 180, "texture": "#2_2"}, + "up": {"uv": [9, 3, 15, 0], "texture": "#7"}, + "down": {"uv": [0.5, 12.5, 7.5, 11.5], "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 7, 6], + "to": [14, 8, 15], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, + "faces": { + "down": {"uv": [0, 9, 6, 13.5], "rotation": 180, "texture": "#3"} + } + }, + { + "from": [1, 11, 1], + "to": [15, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 21, 10]}, + "faces": { + "north": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, + "east": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, + "south": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, + "west": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, + "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, 14, 2.05], + "to": [13.9, 18.1, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 24.1]}, + "faces": { + "north": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "east": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "south": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "west": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "up": {"uv": [6, 8, 12, 14], "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, 11.9, 2.05], + "to": [13.9, 14, 13.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 24.1]}, + "faces": { + "north": {"uv": [0, 1.5, 6, 0.5], "rotation": 180, "texture": "#6"}, + "east": {"uv": [2.5, 0.5, 8, 1.5], "texture": "#5"}, + "west": {"uv": [2.5, 1.5, 8, 0.5], "rotation": 180, "texture": "#5"} + } + } + ], + "groups": [ + { + "name": "block_retracted", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [6, 7] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block_ceiling_old.json b/src/main/resources/assets/create/models/block/funnel/block_ceiling_old.json new file mode 100644 index 000000000..d5fd6b599 --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/block_ceiling_old.json @@ -0,0 +1,147 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "2_2": "create:block/brass_funnel_pull" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, 6, -2], + "to": [16.05, 12, 14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, + "faces": { + "north": {"uv": [0, 0, 2, 6], "texture": "#2_2"}, + "east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [14, 0, 16, 6], "texture": "#2_2"}, + "west": {"uv": [0, 12, 16, 6], "texture": "#2_2"}, + "up": {"uv": [15, 0, 16, 8], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 8], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "LeftWall", + "from": [-0.05, 6, -2], + "to": [2, 12, 14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, + "faces": { + "north": {"uv": [16, 0, 14, 6], "rotation": 180, "texture": "#2_2"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [0, 0, 2, 6], "texture": "#2_2"}, + "west": {"uv": [0, 6, 16, 0], "texture": "#2_2"}, + "up": {"uv": [8, 0, 9, 8], "texture": "#7"}, + "down": {"uv": [7, 0, 8, 8], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 6, -2], + "to": [14, 12, 4], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, + "faces": { + "north": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [9, 13, 15, 16], "rotation": 180, "texture": "#7"}, + "up": {"uv": [9, 0, 15, 3], "texture": "#7"}, + "down": {"uv": [1, 0, 7, 3], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 7, 4], + "to": [14, 8, 13], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, + "faces": { + "down": {"uv": [0, 9, 6, 13.5], "rotation": 180, "texture": "#3"} + } + }, + { + "name": "Top", + "from": [0.05, 12, 14], + "to": [15.95, 15.95, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 2]}, + "faces": { + "north": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"}, + "east": {"uv": [16, 11, 15, 13], "texture": "#7"}, + "south": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"}, + "west": {"uv": [9, 11, 8, 13], "texture": "#7"}, + "up": {"uv": [0, 13.5, 8, 14.5], "texture": "#7"}, + "down": {"uv": [0, 11.5, 8, 12.5], "texture": "#7"} + } + }, + { + "name": "Top", + "from": [0, 14, 13.1], + "to": [16, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 1.1]}, + "faces": { + "east": {"uv": [6, 13, 5, 13.5], "rotation": 270, "texture": "#7"}, + "south": {"uv": [0, 13.5, 8, 14.5], "rotation": 180, "texture": "#7"}, + "west": {"uv": [7, 13, 6, 13.5], "rotation": 270, "texture": "#7"}, + "up": {"uv": [0, 13, 8, 13.5], "texture": "#7"} + } + }, + { + "from": [1, 11, 0], + "to": [15, 14, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 21, 9]}, + "faces": { + "north": {"uv": [6.5, 0, 8, 6], "rotation": 270, "texture": "#3"}, + "east": {"uv": [1, 6.5, 4.5, 8], "rotation": 180, "texture": "#3"}, + "west": {"uv": [1, 6, 4.5, 7.5], "texture": "#3"}, + "up": {"uv": [8, 0, 11.5, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, 14, 1.05], + "to": [13.9, 18.1, 13.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 23.1]}, + "faces": { + "north": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "east": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "south": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "west": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, + "up": {"uv": [6, 8, 12, 14], "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, 11.9, 1.05], + "to": [13.9, 14, 12.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 23.1]}, + "faces": { + "north": {"uv": [0, 1.5, 6, 0.5], "rotation": 180, "texture": "#6"}, + "east": {"uv": [2.5, 0.5, 8, 1.5], "texture": "#5"}, + "west": {"uv": [2.5, 1.5, 8, 0.5], "rotation": 180, "texture": "#5"} + } + } + ], + "groups": [ + { + "name": "block_retracted", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4, 5, 6] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [7, 8] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block_floor.json b/src/main/resources/assets/create/models/block/funnel/block_floor.json new file mode 100644 index 000000000..ecd156783 --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/block_floor.json @@ -0,0 +1,134 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "2_2": "create:block/brass_funnel_pull" + }, + "elements": [ + { + "name": "LeftWall", + "from": [-0.05, 4, 0], + "to": [2, 10, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]}, + "faces": { + "north": {"uv": [14, 0, 16, 6], "texture": "#2_2"}, + "east": {"uv": [0, 12, 16, 6], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [0, 0, 2, 6], "texture": "#2_2"}, + "west": {"uv": [0, 0, 16, 6], "texture": "#2_2"}, + "up": {"uv": [0, 0, 1, 8], "texture": "#7"}, + "down": {"uv": [15, 0, 16, 8], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "LeftWall", + "from": [14, 4, 0], + "to": [16.05, 10, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]}, + "faces": { + "north": {"uv": [2, 0, 0, 6], "rotation": 180, "texture": "#2_2"}, + "east": {"uv": [0, 6, 16, 0], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [14, 0, 16, 6], "texture": "#2_2"}, + "west": {"uv": [0, 6, 16, 12], "texture": "#2_2"}, + "up": {"uv": [7, 0, 8, 8], "texture": "#7"}, + "down": {"uv": [8, 0, 9, 8], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 4, 0], + "to": [14, 10, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]}, + "faces": { + "north": {"uv": [2, 0, 14, 6], "texture": "#2_2"}, + "south": {"uv": [9, 13, 15, 16], "texture": "#7"}, + "up": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "down": {"uv": [9, 0, 15, 3], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 4, 14], + "to": [14, 10, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 18]}, + "faces": { + "north": {"uv": [15, 13, 9, 16], "texture": "#7"}, + "south": {"uv": [14, 0, 2, 6], "texture": "#2_2"}, + "up": {"uv": [0.5, 12.5, 7.5, 11.5], "rotation": 180, "texture": "#7"}, + "down": {"uv": [9, 3, 15, 0], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [2, 8, 6], + "to": [14, 9, 15], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]}, + "faces": { + "up": {"uv": [0, 9, 6, 13.5], "texture": "#3"} + } + }, + { + "from": [1, 2, 1], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -5, 10]}, + "faces": { + "north": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, + "east": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, + "south": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, + "west": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, + "down": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, -2.1, 2.05], + "to": [13.9, 2, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 24.1]}, + "faces": { + "north": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "east": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "south": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "west": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [6, 8, 12, 14], "rotation": 180, "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, 2, 2.05], + "to": [13.9, 4.1, 13.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -6, 24.1]}, + "faces": { + "north": {"uv": [0, 1.5, 6, 0.5], "texture": "#6"}, + "east": {"uv": [2.5, 1.5, 8, 0.5], "texture": "#5"}, + "west": {"uv": [2.5, 0.5, 8, 1.5], "rotation": 180, "texture": "#5"} + } + } + ], + "groups": [ + { + "name": "block_retracted", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [6, 7] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block_wall.json b/src/main/resources/assets/create/models/block/funnel/block_wall.json new file mode 100644 index 000000000..23c63640f --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/block_wall.json @@ -0,0 +1,150 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "2_2": "create:block/brass_funnel_pull" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, 1, 6], + "to": [16.05, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#7"}, + "east": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#2_2"}, + "south": {"uv": [15, 0, 16, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2_2"}, + "up": {"uv": [0, 0, 2, 6], "rotation": 180, "texture": "#2_2"}, + "down": {"uv": [14, 0, 16, 6], "texture": "#2_2"} + } + }, + { + "name": "LeftWall", + "from": [-0.05, 1, 6], + "to": [2, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [7, 0, 8, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2_2"}, + "south": {"uv": [8, 0, 9, 8], "texture": "#7"}, + "west": {"uv": [0, 6, 16, 0], "rotation": 90, "texture": "#2_2"}, + "up": {"uv": [16, 0, 14, 6], "texture": "#2_2"}, + "down": {"uv": [0, 0, 2, 6], "texture": "#2_2"} + } + }, + { + "name": "Top", + "from": [2, 11, 6], + "to": [14, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "south": {"uv": [9, 0, 15, 3], "texture": "#7"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#2_2"}, + "down": {"uv": [9, 13, 15, 16], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [0.05, -1, 12], + "to": [15.95, 1, 15.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 17]}, + "faces": { + "north": {"uv": [0, 11.5, 8, 12.5], "rotation": 180, "texture": "#7"}, + "east": {"uv": [16, 11, 15, 13], "rotation": 270, "texture": "#7"}, + "south": {"uv": [0, 13.5, 8, 14.5], "texture": "#7"}, + "west": {"uv": [9, 11, 8, 13], "rotation": 90, "texture": "#7"}, + "up": {"uv": [8, 11, 16, 13], "texture": "#7"}, + "down": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"} + } + }, + { + "name": "Top", + "from": [0, 1, 14], + "to": [16, 1.9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13.9, 17]}, + "faces": { + "north": {"uv": [0, 7, 0.5, 15], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 13, 6, 13.5], "texture": "#7"}, + "south": {"uv": [0, 13, 8, 13.5], "texture": "#7"}, + "west": {"uv": [8, 13, 7, 13.5], "texture": "#7"}, + "up": {"uv": [8, 11, 16, 13], "texture": "#7"}, + "down": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"} + } + }, + { + "from": [1, 8, 11], + "to": [15, 15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 6, 21]}, + "faces": { + "east": {"uv": [1, 6.5, 4.5, 8], "rotation": 90, "texture": "#3"}, + "south": {"uv": [8, 0, 11.5, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [1, 6, 4.5, 7.5], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6.5, 0, 8, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, 1.9, 14], + "to": [13.9, 13.95, 18.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 6]}, + "faces": { + "north": {"uv": [0, 7.5, 6, 13.5], "texture": "#3"}, + "east": {"uv": [0, 0, 12, 4], "rotation": 90, "texture": "#6"}, + "south": {"uv": [6, 8, 12, 14], "texture": "#3"}, + "west": {"uv": [0, 0, 12, 4], "rotation": 270, "texture": "#6"}, + "up": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "Back", + "from": [2.1, 2.9, 11.9], + "to": [13.9, 13.95, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 22]}, + "faces": { + "east": {"uv": [2.5, 0.5, 8, 1.5], "rotation": 270, "texture": "#5"}, + "west": {"uv": [2.5, 1.5, 8, 0.5], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 1.5, 6, 0.5], "texture": "#6"} + } + }, + { + "name": "RearBackPlate", + "from": [2, 9.9, 10], + "to": [14, 11.9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 6.9, 8]}, + "faces": { + "down": {"uv": [0, 11.5, 6, 14], "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "block_retracted", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [6, 7, 8] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/flap.json b/src/main/resources/assets/create/models/block/funnel/flap.json new file mode 100644 index 000000000..94b2a6bb9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/flap.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "4": "create:block/brass_funnel_back" + }, + "elements": [ + { + "name": "F4", + "from": [11, 0, 9], + "to": [14, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [-24.5, -7.5, 9]}, + "faces": { + "north": {"uv": [14, 8.5, 12.5, 13.5], "texture": "#4"}, + "east": {"uv": [13.5, 8.5, 14, 13.5], "texture": "#4"}, + "south": {"uv": [12.5, 8.5, 14, 13.5], "texture": "#4"}, + "west": {"uv": [12.5, 8.5, 13, 13.5], "texture": "#4"}, + "up": {"uv": [12.5, 8.5, 14, 9], "texture": "#4"}, + "down": {"uv": [12.5, 14.5, 14, 15], "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/item.json b/src/main/resources/assets/create/models/block/funnel/item.json index 62aa61fe0..8a9560327 100644 --- a/src/main/resources/assets/create/models/block/funnel/item.json +++ b/src/main/resources/assets/create/models/block/funnel/item.json @@ -1,104 +1,230 @@ { "credit": "Made with Blockbench", "parent": "block/block", + "texture_size": [32, 32], "textures": { - "0": "create:block/brass_funnel_plating", - "1": "create:block/brass_block", - "2": "create:block/brass_funnel", + "2": "create:block/brass_funnel_neutral", "3": "create:block/brass_funnel_back", - "particle": "#1" + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "particle": "create:block/brass_block" }, "elements": [ { - "from": [2.1, -1.9, 2.1], - "to": [13.9, 2, 13.9], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 7, 10]}, + "name": "LeftWall", + "from": [14, -3, 8], + "to": [16, 0, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "east": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "south": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "west": {"uv": [0, 0, 12, 4], "texture": "#2"}, - "up": {"uv": [0, 4, 12, 16], "texture": "#2"}, - "down": {"uv": [6, 8, 12, 14], "texture": "#3"} + "north": {"uv": [0, 8, 1, 9.5], "texture": "#7"}, + "east": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"}, + "south": {"uv": [15, 8, 16, 9.5], "texture": "#7"}, + "west": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"}, + "down": {"uv": [14, 10, 16, 16], "texture": "#particle"} } }, { - "from": [2, 10, 14], - "to": [14, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, 12]}, + "name": "LeftWall", + "from": [0, -3, 8], + "to": [2, 0, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [2, 1, 14, 7], "texture": "#1"}, - "south": {"uv": [1, 0, 7, 3], "texture": "#0"}, - "up": {"uv": [2, 14, 14, 16], "texture": "#1"}, - "down": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#1"} + "north": {"uv": [7, 8, 8, 9.5], "texture": "#7"}, + "east": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"}, + "south": {"uv": [8, 7.5, 9, 9], "texture": "#7"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 10, 2, 16], "texture": "#particle"} } }, { - "from": [2, 10, 0], - "to": [14, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 19, -2]}, + "name": "LeftWall", + "from": [14, 0, 8], + "to": [16, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [1, 0, 7, 3], "texture": "#0"}, - "south": {"uv": [2, 1, 14, 7], "texture": "#1"}, - "up": {"uv": [2, 0, 14, 2], "texture": "#1"}, - "down": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#1"} + "north": {"uv": [0, 0, 1, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, + "south": {"uv": [15, 0, 16, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, + "up": {"uv": [14, 0, 16, 6], "texture": "#2"} } }, { - "from": [0, 10, 0], - "to": [2, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [-2, 19, -2]}, + "name": "LeftWall", + "from": [0, 0, 8], + "to": [2, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [7, 0, 8, 3], "texture": "#0"}, - "east": {"uv": [0, 1, 16, 7], "texture": "#1"}, - "south": {"uv": [0, 0, 1, 3], "texture": "#0"}, - "west": {"uv": [0, 0, 8, 3], "texture": "#0"}, - "up": {"uv": [0, 0, 2, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#1"} + "north": {"uv": [7, 0, 8, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, + "south": {"uv": [8, 0, 9, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, + "up": {"uv": [16, 0, 14, 6], "texture": "#2"} } }, { - "from": [14, 10, 0], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [12, 19, -2]}, + "name": "Top", + "from": [2, 10, 8], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [6, -8, 8]}, "faces": { - "north": {"uv": [0, 0, 1, 3], "texture": "#0"}, - "east": {"uv": [0, 0, 8, 3], "texture": "#0"}, - "south": {"uv": [7, 0, 8, 3], "texture": "#0"}, - "west": {"uv": [0, 1, 16, 7], "texture": "#1"}, - "up": {"uv": [14, 0, 16, 16], "texture": "#1"}, - "down": {"uv": [14, 0, 16, 16], "texture": "#1"} + "north": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "south": {"uv": [9, 0, 15, 3], "texture": "#7"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#2"}, + "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2"} } }, { - "from": [2, 6, 2], + "name": "Top", + "from": [2, -2, 12], "to": [14, 10, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 15, 10]}, + "rotation": {"angle": 0, "axis": "y", "origin": [6, -14, 8]}, "faces": { - "north": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "east": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "south": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "west": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"}, - "down": {"uv": [0, 0, 6, 6], "texture": "#3"} + "north": {"uv": [0, 8, 6, 14], "texture": "#3"}, + "south": {"uv": [9, 3, 15, 9.5], "texture": "#7"} } }, { - "from": [2, 11, 2], - "to": [14, 15, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 10]}, + "name": "LeftBottom", + "from": [15, -5, 8], + "to": [16, -3, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "up": {"uv": [0, 8, 6, 14], "texture": "#3"} + "north": {"uv": [0, 9.5, 0.5, 10.5], "texture": "#7"}, + "east": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "west": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} } }, { - "from": [3, 2, 3], - "to": [13, 6, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 11, 10]}, + "name": "LeftBottom", + "from": [0, -5, 8], + "to": [1, -3, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "north": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, - "east": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, - "south": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"}, - "west": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"} + "north": {"uv": [7.5, 9.5, 8, 10.5], "texture": "#7"}, + "east": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "west": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} + } + }, + { + "name": "Back", + "from": [2.1, -2.1, 14], + "to": [13.9, 13.95, 18.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 6]}, + "faces": { + "east": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "south": {"uv": [9, 1, 15, 9], "texture": "#7"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "RearBackPlate", + "from": [1, -5, 10], + "to": [15, -2, 16.05], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, + "faces": { + "north": {"uv": [1, 13, 15, 16], "texture": "#particle"}, + "south": {"uv": [0.5, 13, 7.5, 14.5], "texture": "#7"}, + "up": {"uv": [1, 10, 15, 16], "texture": "#particle"}, + "down": {"uv": [8.5, 13, 15.5, 16], "texture": "#7"} + } + }, + { + "name": "BackPlateLeft", + "from": [15, -5, 14], + "to": [16, -2, 16.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "east": {"uv": [0, 14.5, 1, 16], "texture": "#7"}, + "south": {"uv": [7.5, 14.5, 8, 16], "texture": "#7"}, + "west": {"uv": [7, 14.5, 8, 16], "texture": "#7"}, + "up": {"uv": [0, 15, 1, 14.5], "rotation": 270, "texture": "#7"}, + "down": {"uv": [0, 0, 1, 2], "texture": "#particle"} + } + }, + { + "name": "BackPlateLeft", + "from": [0, -5, 14], + "to": [1, -2, 16.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "east": {"uv": [8, 14.5, 7, 16], "texture": "#7"}, + "south": {"uv": [0, 14.5, 0.5, 16], "texture": "#7"}, + "west": {"uv": [1, 14.5, 0, 16], "texture": "#7"}, + "up": {"uv": [0, 15, 1, 14.5], "rotation": 270, "texture": "#7"}, + "down": {"uv": [0, 0, 1, 2], "texture": "#particle"} + } + }, + { + "from": [1, -2, 14], + "to": [15, 15, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 6, 22]}, + "faces": { + "east": {"uv": [1, 6, 9, 6.5], "rotation": 90, "texture": "#3"}, + "south": {"uv": [8, 0, 16, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [1, 6, 9, 6.5], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 0, 6.5, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "F4", + "from": [11, -3, 9], + "to": [14, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [-24.5, -7.5, 9]}, + "faces": { + "north": {"uv": [14, 8.5, 12.5, 15], "texture": "#3"}, + "east": {"uv": [13.5, 8.5, 14, 15], "texture": "#3"}, + "south": {"uv": [12.5, 8.5, 14, 15], "texture": "#3"}, + "west": {"uv": [12.5, 8.5, 13, 15], "texture": "#3"}, + "up": {"uv": [12.5, 8.5, 14, 9], "texture": "#3"}, + "down": {"uv": [12.5, 14.5, 14, 15], "texture": "#3"} + } + }, + { + "name": "F5", + "from": [8, -3, 9], + "to": [11, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [-27.5, -7.5, 9]}, + "faces": { + "north": {"uv": [14, 8.5, 12.5, 15], "texture": "#3"}, + "east": {"uv": [13.5, 8.5, 14, 15], "texture": "#3"}, + "south": {"uv": [12.5, 8.5, 14, 15], "texture": "#3"}, + "west": {"uv": [12.5, 8.5, 13, 15], "texture": "#3"}, + "up": {"uv": [12.5, 8.5, 14, 9], "texture": "#3"}, + "down": {"uv": [12.5, 14.5, 14, 15], "texture": "#3"} + } + }, + { + "name": "F6", + "from": [5, -3, 9], + "to": [8, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [-30.5, -7.5, 9]}, + "faces": { + "north": {"uv": [14, 8.5, 12.5, 15], "texture": "#3"}, + "east": {"uv": [13.5, 8.5, 14, 15], "texture": "#3"}, + "south": {"uv": [12.5, 8.5, 14, 15], "texture": "#3"}, + "west": {"uv": [12.5, 8.5, 13, 15], "texture": "#3"}, + "up": {"uv": [12.5, 8.5, 14, 9], "texture": "#3"}, + "down": {"uv": [12.5, 14.5, 14, 15], "texture": "#3"} + } + }, + { + "name": "F7", + "from": [2, -3, 9], + "to": [5, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [-33.5, -7.5, 9]}, + "faces": { + "north": {"uv": [14, 8.5, 12.5, 15], "texture": "#3"}, + "east": {"uv": [13.5, 8.5, 14, 15], "texture": "#3"}, + "south": {"uv": [12.5, 8.5, 14, 15], "texture": "#3"}, + "west": {"uv": [12.5, 8.5, 13, 15], "texture": "#3"}, + "up": {"uv": [12.5, 8.5, 14, 9], "texture": "#3"}, + "down": {"uv": [12.5, 14.5, 14, 15], "texture": "#3"} } } ], @@ -122,18 +248,58 @@ "scale": [0.4, 0.4, 0.4] }, "ground": { - "translation": [0, 3, 0], + "translation": [0, 3, -1.5], "scale": [0.25, 0.25, 0.25] }, "gui": { "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] + "translation": [1, 1, 0], + "scale": [0.5, 0.5, 0.5] }, "head": { - "rotation": [0, 90, 0] + "translation": [0, -14, 3.25] }, "fixed": { + "translation": [0, 1.5, -3], "scale": [0.5, 0.5, 0.5] } - } + }, + "groups": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4, 5, 6, 7] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [8, 9, 10, 11] + } + ] + }, 12, + { + "name": "flap", + "origin": [8, 8, 8], + "children": [13] + }, + { + "name": "flap", + "origin": [8, 8, 8], + "children": [14] + }, + { + "name": "flap", + "origin": [8, 8, 8], + "children": [15] + }, + { + "name": "flap", + "origin": [8, 8, 8], + "children": [16] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/horizontal.json b/src/main/resources/assets/create/models/block/gantry_pinion/horizontal.json new file mode 100644 index 000000000..a35a3b443 --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_pinion/horizontal.json @@ -0,0 +1,153 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "8": "create:block/bearing_top_wooden", + "9": "create:block/windmill_bearing_side", + "10": "create:block/pinion", + "particle": "create:block/andesite_casing", + "opening": "create:block/gearbox" + }, + "elements": [ + { + "name": "Bottom", + "from": [0, 0, 0], + "to": [16, 16, 4], + "faces": { + "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#8"}, + "east": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#9"}, + "south": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#8"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#9"}, + "up": {"uv": [0, 8, 16, 12], "rotation": 180, "texture": "#10"}, + "down": {"uv": [0, 8, 16, 12], "texture": "#10"} + } + }, + { + "name": "Bottom", + "from": [6, 0, -4], + "to": [10, 16, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, + "faces": { + "north": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, + "up": {"uv": [6, 12, 10, 16], "rotation": 180, "texture": "#10"}, + "down": {"uv": [6, 12, 10, 16], "texture": "#10"} + } + }, + { + "name": "Bottom", + "from": [0, 6, -4], + "to": [16, 10, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, + "faces": { + "north": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [10, 12, 14, 16], "rotation": 270, "texture": "#10"}, + "west": {"uv": [6, 12, 10, 16], "rotation": 90, "texture": "#10"}, + "up": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Core", + "from": [1, 1, 2], + "to": [15, 15, 12], + "faces": { + "north": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#opening"}, + "east": {"uv": [1, 4, 15, 14], "rotation": 270, "texture": "#opening"}, + "south": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#opening"}, + "west": {"uv": [1, 4, 15, 14], "rotation": 90, "texture": "#opening"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#opening"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#opening"} + } + }, + { + "name": "Top", + "from": [0, 0, 12], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#8"}, + "east": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#9"}, + "south": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#8"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#9"}, + "up": {"uv": [0, 0, 16, 4], "rotation": 180, "texture": "#9"}, + "down": {"uv": [0, 0, 16, 4], "texture": "#9"} + } + }, + { + "name": "SideWest", + "from": [0, 14, 4], + "to": [16, 16, 12], + "faces": { + "east": {"uv": [14, 0, 16, 8], "rotation": 270, "texture": "#10"}, + "west": {"uv": [0, 0, 2, 8], "rotation": 90, "texture": "#10"}, + "up": {"uv": [0, 0, 16, 8], "rotation": 180, "texture": "#10"}, + "down": {"uv": [0, 0, 16, 8], "texture": "#10"} + } + }, + { + "name": "SideEast", + "from": [0, 0, 4], + "to": [16, 2, 12], + "faces": { + "east": {"uv": [0, 0, 2, 8], "rotation": 270, "texture": "#10"}, + "west": {"uv": [14, 0, 16, 8], "rotation": 90, "texture": "#10"}, + "up": {"uv": [0, 0, 16, 8], "rotation": 180, "texture": "#10"}, + "down": {"uv": [0, 0, 16, 8], "texture": "#10"} + } + } + ], + "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], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 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": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 2.25, 0], + "scale": [0.45, 0.45, 0.45] + } + }, + "groups": [ + { + "name": "item_andesite", + "origin": [8, 8, 8], + "children": [] + }, + { + "name": "item", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/item.json b/src/main/resources/assets/create/models/block/gantry_pinion/item.json new file mode 100644 index 000000000..1e2349978 --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_pinion/item.json @@ -0,0 +1,346 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "3": "create:block/cogwheel", + "8": "create:block/bearing_top_wooden", + "9": "create:block/windmill_bearing_side", + "10": "create:block/pinion", + "11": "create:block/axis_top", + "particle": "create:block/andesite_casing", + "opening": "create:block/gearbox" + }, + "elements": [ + { + "name": "Gear", + "from": [10.5, -10, 6.5], + "to": [13.5, 8, 9.5], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear2", + "from": [10.5, -2.5, -1], + "to": [13.5, 0.5, 17], + "rotation": {"angle": 22.5, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 180, "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear3", + "from": [10.5, -10, 6.5], + "to": [13.5, 8, 9.5], + "rotation": {"angle": 22.5, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear4", + "from": [10.5, -2.5, -1], + "to": [13.5, 0.5, 17], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseInner", + "from": [11, -7, 2], + "to": [13, 5, 14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [0, 6, 6, 7], "rotation": 90, "texture": "#3"}, + "east": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "west": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseOuter", + "from": [10, -5, 4], + "to": [14, 3, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [0, 4, 4, 6], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear", + "from": [2.5, -10, 6.5], + "to": [5.5, 8, 9.5], + "rotation": {"angle": -22.5, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear3", + "from": [2.5, -2.5, -1], + "to": [5.5, 0.5, 17], + "rotation": {"angle": 22.5, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 180, "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear4", + "from": [2.5, -10, 6.5], + "to": [5.5, 8, 9.5], + "rotation": {"angle": 22.5, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear5", + "from": [2.5, -2.5, -1], + "to": [5.5, 0.5, 17], + "rotation": {"angle": -22.5, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseInner", + "from": [3, -7, 2], + "to": [5, 5, 14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [0, 6, 6, 7], "rotation": 90, "texture": "#3"}, + "east": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "west": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseOuter", + "from": [2, -5, 4], + "to": [6, 3, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [0, 4, 4, 6], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Bottom", + "from": [0, 0, 0], + "to": [16, 4, 16], + "faces": { + "north": {"uv": [0, 8, 16, 12], "texture": "#10"}, + "east": {"uv": [0, 0, 16, 4], "texture": "#9"}, + "south": {"uv": [0, 8, 16, 12], "texture": "#10"}, + "west": {"uv": [0, 0, 16, 4], "texture": "#9"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#8"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#8"} + } + }, + { + "name": "Bottom", + "from": [6, -4, 0], + "to": [10, 0, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 8]}, + "faces": { + "north": {"uv": [6, 12, 10, 16], "texture": "#10"}, + "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [6, 12, 10, 16], "texture": "#10"}, + "west": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [6, 0, 10, 16], "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [0, -4, 6], + "to": [16, 0, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 8]}, + "faces": { + "north": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "east": {"uv": [10, 12, 14, 16], "texture": "#10"}, + "south": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [6, 12, 10, 16], "texture": "#10"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Core", + "from": [1, 2, 1], + "to": [15, 12, 15], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#opening"}, + "east": {"uv": [1, 4, 15, 14], "texture": "#opening"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#opening"}, + "west": {"uv": [1, 4, 15, 14], "texture": "#opening"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#opening"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#opening"} + } + }, + { + "name": "Top", + "from": [0, 12, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 4], "texture": "#9"}, + "east": {"uv": [0, 0, 16, 4], "texture": "#9"}, + "south": {"uv": [0, 0, 16, 4], "texture": "#9"}, + "west": {"uv": [0, 0, 16, 4], "texture": "#9"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#8"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "SideWest", + "from": [0, 4, 0], + "to": [16, 12, 2], + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#10"}, + "east": {"uv": [14, 0, 16, 8], "texture": "#10"}, + "south": {"uv": [0, 0, 16, 8], "texture": "#10"}, + "west": {"uv": [0, 0, 2, 8], "texture": "#10"} + } + }, + { + "name": "SideEast", + "from": [0, 4, 14], + "to": [16, 12, 16], + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#10"}, + "east": {"uv": [0, 0, 2, 8], "texture": "#10"}, + "south": {"uv": [0, 0, 16, 8], "texture": "#10"}, + "west": {"uv": [14, 0, 16, 8], "texture": "#10"} + } + }, + { + "name": "Axis", + "from": [0, 6, 6], + "to": [16, 10, 10], + "faces": { + "north": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#11"}, + "south": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [6, 6, 10, 10], "texture": "#11"}, + "up": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"} + } + } + ], + "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], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 135, 0], + "translation": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 2.25, 0], + "scale": [0.45, 0.45, 0.45] + } + }, + "groups": [ + { + "name": "cogwheel_shaftless", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "cogwheel_shaftless", + "origin": [8, 8, 8], + "children": [6, 7, 8, 9, 10, 11] + }, + { + "name": "item_andesite", + "origin": [8, 8, 8], + "children": [] + }, + { + "name": "item", + "origin": [8, 8, 8], + "children": [12, 13, 14, 15, 16, 17, 18, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [19] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/vertical.json b/src/main/resources/assets/create/models/block/gantry_pinion/vertical.json new file mode 100644 index 000000000..9c7ed51bf --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_pinion/vertical.json @@ -0,0 +1,153 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "8": "create:block/bearing_top_wooden", + "9": "create:block/windmill_bearing_side", + "10": "create:block/pinion", + "particle": "create:block/andesite_casing", + "opening": "create:block/gearbox" + }, + "elements": [ + { + "name": "Bottom", + "from": [0, 0, 0], + "to": [16, 16, 4], + "faces": { + "north": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#8"}, + "east": {"uv": [0, 8, 16, 12], "rotation": 270, "texture": "#10"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#8"}, + "west": {"uv": [0, 8, 16, 12], "rotation": 90, "texture": "#10"}, + "up": {"uv": [0, 0, 16, 4], "rotation": 180, "texture": "#9"}, + "down": {"uv": [0, 0, 16, 4], "texture": "#9"} + } + }, + { + "name": "Bottom", + "from": [0, 6, -4], + "to": [16, 10, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, + "faces": { + "north": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [6, 12, 10, 16], "rotation": 270, "texture": "#10"}, + "west": {"uv": [6, 12, 10, 16], "rotation": 90, "texture": "#10"}, + "up": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Bottom", + "from": [6, 0, -4], + "to": [10, 16, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, + "faces": { + "north": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, + "up": {"uv": [10, 12, 14, 16], "rotation": 180, "texture": "#10"}, + "down": {"uv": [6, 12, 10, 16], "texture": "#10"} + } + }, + { + "name": "Core", + "from": [1, 1, 2], + "to": [15, 15, 12], + "faces": { + "north": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#opening"}, + "east": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#opening"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#opening"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#opening"}, + "up": {"uv": [1, 4, 15, 14], "rotation": 180, "texture": "#opening"}, + "down": {"uv": [1, 4, 15, 14], "texture": "#opening"} + } + }, + { + "name": "Top", + "from": [0, 0, 12], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#8"}, + "east": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#9"}, + "south": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#8"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#9"}, + "up": {"uv": [0, 0, 16, 4], "rotation": 180, "texture": "#9"}, + "down": {"uv": [0, 0, 16, 4], "texture": "#9"} + } + }, + { + "name": "SideWest", + "from": [0, 0, 4], + "to": [2, 16, 12], + "faces": { + "east": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#10"}, + "west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#10"}, + "up": {"uv": [14, 0, 16, 8], "rotation": 180, "texture": "#10"}, + "down": {"uv": [0, 0, 2, 8], "texture": "#10"} + } + }, + { + "name": "SideEast", + "from": [14, 0, 4], + "to": [16, 16, 12], + "faces": { + "east": {"uv": [0, 0, 16, 8], "rotation": 270, "texture": "#10"}, + "west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#10"}, + "up": {"uv": [0, 0, 2, 8], "rotation": 180, "texture": "#10"}, + "down": {"uv": [14, 0, 16, 8], "texture": "#10"} + } + } + ], + "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], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 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": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 2.25, 0], + "scale": [0.45, 0.45, 0.45] + } + }, + "groups": [ + { + "name": "item_andesite", + "origin": [8, 8, 8], + "children": [] + }, + { + "name": "item", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/wheels.json b/src/main/resources/assets/create/models/block/gantry_pinion/wheels.json new file mode 100644 index 000000000..7c54b4893 --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_pinion/wheels.json @@ -0,0 +1,224 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/cogwheel", + "particle": "create:block/andesite_casing" + }, + "elements": [ + { + "name": "Gear", + "from": [10.5, -10, 6.5], + "to": [13.5, 8, 9.5], + "rotation": {"angle": 0, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear2", + "from": [10.5, -2.5, -1], + "to": [13.5, 0.5, 17], + "rotation": {"angle": 45, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 180, "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear3", + "from": [10.5, -10, 6.5], + "to": [13.5, 8, 9.5], + "rotation": {"angle": 45, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear4", + "from": [10.5, -2.5, -1], + "to": [13.5, 0.5, 17], + "rotation": {"angle": 0, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseInner", + "from": [11, -7, 2], + "to": [13, 5, 14], + "rotation": {"angle": 0, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [0, 6, 6, 7], "rotation": 90, "texture": "#3"}, + "east": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "west": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseOuter", + "from": [10, -5, 4], + "to": [14, 3, 12], + "rotation": {"angle": 0, "axis": "x", "origin": [12, -1, 8]}, + "faces": { + "north": {"uv": [0, 4, 4, 6], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear", + "from": [2.5, -10, 6.5], + "to": [5.5, 8, 9.5], + "rotation": {"angle": 0, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear3", + "from": [2.5, -2.5, -1], + "to": [5.5, 0.5, 17], + "rotation": {"angle": 45, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 180, "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear4", + "from": [2.5, -10, 6.5], + "to": [5.5, 8, 9.5], + "rotation": {"angle": 45, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [7, 7.5, 16, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "Gear5", + "from": [2.5, -2.5, -1], + "to": [5.5, 0.5, 17], + "rotation": {"angle": 0, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [5.5, 7.5, 7, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "south": {"uv": [5.5, 7.5, 7, 9], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 6, 16, 7.5], "texture": "#3"}, + "up": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"}, + "down": {"uv": [7, 7.5, 16, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseInner", + "from": [3, -7, 2], + "to": [5, 5, 14], + "rotation": {"angle": 0, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [0, 6, 6, 7], "rotation": 90, "texture": "#3"}, + "east": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "west": {"uv": [4, 0, 10, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 6, 6, 7], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "GearCaseOuter", + "from": [2, -5, 4], + "to": [6, 3, 12], + "rotation": {"angle": 0, "axis": "x", "origin": [4, -1, 8]}, + "faces": { + "north": {"uv": [0, 4, 4, 6], "rotation": 90, "texture": "#3"}, + "east": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "south": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 4, 4, 6], "rotation": 270, "texture": "#3"} + } + } + ], + "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], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 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": [0, 1.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 2.25, 0], + "scale": [0.45, 0.45, 0.45] + } + }, + "groups": [ + { + "name": "cogwheel_shaftless", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "cogwheel_shaftless", + "origin": [8, 8, 8], + "children": [6, 7, 8, 9, 10, 11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_end.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_end.json new file mode 100644 index 000000000..a459fd12b --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_end.json @@ -0,0 +1,69 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "1": "create:block/axis_top", + "2": "create:block/gantry_shaft", + "3": "create:block/cogwheel", + "particle": "#2" + }, + "elements": [ + { + "from": [4, 11, 4], + "to": [12, 14, 12], + "faces": { + "north": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "east": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "south": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "west": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#3"}, + "down": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#3"} + } + }, + { + "from": [5, 0, 5], + "to": [11, 11, 11], + "shade": false, + "faces": { + "north": {"uv": [8, 5, 14, 16], "texture": "#2"}, + "east": {"uv": [2, 5, 8, 16], "texture": "#2"}, + "south": {"uv": [4, 5, 10, 16], "texture": "#2"}, + "west": {"uv": [6, 5, 12, 16], "texture": "#2"} + } + }, + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "south": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "up": {"uv": [6, 6, 10, 10], "texture": "#1"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "rack", + "origin": [8, 8, 8], + "children": [ + { + "name": "end", + "origin": [8, 8, 8], + "children": [0, 1, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [2] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_middle.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_middle.json new file mode 100644 index 000000000..8d4416d92 --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_middle.json @@ -0,0 +1,40 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/gantry_shaft", + "particle": "#2" + }, + "elements": [ + { + "from": [5, 0, 5], + "to": [11, 16, 11], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 6, 16], "texture": "#2"}, + "east": {"uv": [2, 0, 8, 16], "texture": "#2"}, + "south": {"uv": [4, 0, 10, 16], "texture": "#2"}, + "west": {"uv": [6, 0, 12, 16], "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "rack", + "origin": [8, 8, 8], + "children": [ + { + "name": "middle", + "origin": [8, 8, 8], + "children": [0, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_single.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_single.json new file mode 100644 index 000000000..cccb1fd78 --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_single.json @@ -0,0 +1,103 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "1": "create:block/axis_top", + "2": "create:block/gantry_shaft", + "3": "create:block/cogwheel", + "particle": "#2" + }, + "elements": [ + { + "from": [4, 2, 4], + "to": [12, 5, 12], + "faces": { + "north": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "east": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "south": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "west": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "up": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#3"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#3"} + } + }, + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, + "south": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, + "up": {"uv": [6, 6, 10, 10], "texture": "#1"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#1"} + } + }, + { + "from": [4, 11, 4], + "to": [12, 14, 12], + "faces": { + "north": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "east": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "south": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "west": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "up": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#3"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#3"} + } + }, + { + "from": [5, 5, 5], + "to": [11, 11, 11], + "shade": false, + "faces": { + "north": {"uv": [4, 5, 10, 11], "rotation": 180, "texture": "#2"}, + "east": {"uv": [3, 5, 9, 11], "rotation": 180, "texture": "#2"}, + "south": {"uv": [0, 5, 6, 11], "rotation": 180, "texture": "#2"}, + "west": {"uv": [6, 5, 12, 11], "rotation": 180, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "rack", + "origin": [8, 8, 8], + "children": [ + { + "name": "end", + "origin": [8, 8, 8], + "children": [0, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [] + } + ] + }, + { + "name": "middle", + "origin": [8, 8, 8], + "children": [ + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [1] + } + ] + }, + { + "name": "start", + "origin": [8, 8, 8], + "children": [2, 3, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_start.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_start.json new file mode 100644 index 000000000..b77bfceba --- /dev/null +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_start.json @@ -0,0 +1,69 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "1": "create:block/axis_top", + "2": "create:block/gantry_shaft", + "3": "create:block/cogwheel", + "particle": "#2" + }, + "elements": [ + { + "from": [4, 2, 4], + "to": [12, 5, 12], + "faces": { + "north": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "east": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "south": {"uv": [14.5, 0, 16, 4], "rotation": 90, "texture": "#3"}, + "west": {"uv": [14.5, 0, 16, 4], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#3"}, + "down": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#3"} + } + }, + { + "from": [5, 5, 5], + "to": [11, 16, 11], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 6, 11], "texture": "#2"}, + "east": {"uv": [2, 0, 8, 11], "texture": "#2"}, + "south": {"uv": [4, 0, 10, 11], "texture": "#2"}, + "west": {"uv": [6, 0, 12, 11], "texture": "#2"} + } + }, + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "south": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "up": {"uv": [6, 6, 10, 10], "texture": "#1"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "rack", + "origin": [8, 8, 8], + "children": [ + { + "name": "start", + "origin": [8, 8, 8], + "children": [0, 1, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [2] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/gearshift/block.json b/src/main/resources/assets/create/models/block/gearshift/block.json index 1189b38c5..01d833677 100644 --- a/src/main/resources/assets/create/models/block/gearshift/block.json +++ b/src/main/resources/assets/create/models/block/gearshift/block.json @@ -14,10 +14,10 @@ "faces": { "north": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#0"}, "east": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#0"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 14, 16, 16], "texture": "#0"} + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 14, 16, 16], "texture": "#1"} } }, { @@ -34,12 +34,12 @@ "from": [0, 0, 14], "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, "east": {"uv": [0, 0, 16, 2], "rotation": 270, "texture": "#0"}, "south": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#0"}, "west": {"uv": [0, 0, 16, 2], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 0, 16, 2], "texture": "#0"} + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 0, 16, 2], "texture": "#1"} } }, { @@ -47,7 +47,7 @@ "from": [0, 0, 2], "to": [2, 16, 14], "faces": { - "east": {"uv": [0, 2, 16, 14], "rotation": 270, "texture": "#0"}, + "east": {"uv": [0, 2, 16, 14], "rotation": 270, "texture": "#1"}, "west": {"uv": [0, 2, 16, 14], "rotation": 90, "texture": "#0"}, "up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#0"}, "down": {"uv": [0, 2, 2, 14], "texture": "#0"} @@ -59,7 +59,7 @@ "to": [16, 16, 14], "faces": { "east": {"uv": [0, 2, 16, 14], "rotation": 270, "texture": "#0"}, - "west": {"uv": [0, 2, 16, 14], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 2, 16, 14], "rotation": 90, "texture": "#1"}, "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#0"}, "down": {"uv": [14, 2, 16, 14], "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/gearshift/item.json b/src/main/resources/assets/create/models/block/gearshift/item.json index 52e8f3ac2..13d81d0df 100644 --- a/src/main/resources/assets/create/models/block/gearshift/item.json +++ b/src/main/resources/assets/create/models/block/gearshift/item.json @@ -14,11 +14,11 @@ "from": [0, 0, 0], "to": [16, 2, 16], "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "north": {"uv": [0, 14, 16, 16], "texture": "#1"}, "east": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 14, 16, 16], "texture": "#1"}, "west": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"} } }, @@ -36,12 +36,12 @@ "from": [0, 14, 0], "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 2], "texture": "#0"}, + "north": {"uv": [0, 0, 16, 2], "texture": "#1"}, "east": {"uv": [0, 0, 16, 2], "texture": "#0"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#1"}, "west": {"uv": [0, 0, 16, 2], "texture": "#0"}, "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#0"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json b/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json index be9c98dc7..d4da4d489 100644 --- a/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json +++ b/src/main/resources/assets/create/models/block/rotation_speed_controller/block.json @@ -2,117 +2,86 @@ "credit": "Made with Blockbench", "parent": "create:block/large_wheels", "textures": { + "0": "create:block/rotation_speed_controller", + "3": "create:block/brass_funnel_plating", "4": "create:block/brass_gearbox", - "5": "create:block/brass_casing_side", - "6": "create:block/brass_casing", - "8": "create:block/encased_chain_drive_middle", - "9": "create:block/brass_block", - "particle": "create:block/brass_casing" + "5": "create:block/rotation_speed_controller_top", + "6": "create:block/brass_block", + "particle": "create:block/brass_gearbox" }, "elements": [ - { - "from": [1, 2, 1], - "to": [6, 15, 5], - "faces": { - "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "east": {"uv": [12, 1, 16, 14], "texture": "#5"}, - "south": {"uv": [4, 1, 9, 14], "texture": "#6"}, - "west": {"uv": [1, 1, 5, 14], "texture": "#6"}, - "up": {"uv": [1, 10, 5, 15], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [10, 2, 1], - "to": [15, 15, 5], - "faces": { - "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [5, 1, 1, 14], "texture": "#6"}, - "south": {"uv": [9, 1, 4, 14], "texture": "#6"}, - "west": {"uv": [16, 1, 12, 14], "texture": "#5"}, - "up": {"uv": [1, 1, 5, 6], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [1, 2, 11], - "to": [6, 15, 15], - "faces": { - "north": {"uv": [4, 1, 9, 14], "texture": "#6"}, - "east": {"uv": [0, 1, 4, 14], "texture": "#5"}, - "south": {"uv": [1, 1, 6, 14], "texture": "#4"}, - "west": {"uv": [11, 1, 15, 14], "texture": "#6"}, - "up": {"uv": [11, 10, 15, 15], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [10, 2, 11], - "to": [15, 15, 15], - "faces": { - "north": {"uv": [9, 1, 4, 14], "texture": "#6"}, - "east": {"uv": [15, 1, 11, 14], "texture": "#6"}, - "south": {"uv": [6, 1, 1, 14], "texture": "#4"}, - "west": {"uv": [4, 1, 0, 14], "texture": "#5"}, - "up": {"uv": [11, 1, 15, 6], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [1, 2, 5], - "to": [6, 8, 11], - "faces": { - "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "west": {"uv": [5, 8, 11, 14], "texture": "#6"}, - "up": {"uv": [5, 3, 11, 8], "rotation": 90, "texture": "#6"} - } - }, - { - "from": [10, 2, 5], - "to": [15, 8, 11], - "faces": { - "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [11, 8, 5, 14], "texture": "#6"}, - "up": {"uv": [5, 8, 11, 3], "rotation": 90, "texture": "#6"} - } - }, - { - "from": [10, 9, 5], - "to": [14, 14, 11], - "faces": { - "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [12, 9, 6, 14], "texture": "#5"}, - "west": {"uv": [12, 9, 6, 14], "texture": "#5"}, - "up": {"uv": [6, 6, 12, 2], "rotation": 90, "texture": "#5"}, - "down": {"uv": [6, 6, 12, 2], "rotation": 90, "texture": "#5"} - } - }, - { - "from": [2, 9, 5], - "to": [6, 14, 11], - "faces": { - "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "east": {"uv": [6, 9, 12, 14], "texture": "#5"}, - "west": {"uv": [6, 9, 12, 14], "texture": "#5"}, - "up": {"uv": [6, 2, 12, 6], "rotation": 90, "texture": "#5"}, - "down": {"uv": [6, 2, 12, 6], "rotation": 90, "texture": "#5"} - } - }, { "from": [0, 0, 0], - "to": [16, 2, 16], + "to": [16, 4, 16], "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#4"}, - "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#6"} + "north": {"uv": [0, 12, 16, 16], "texture": "#0"}, + "east": {"uv": [0, 12, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 12, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 12, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#4"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#6"} } }, { - "from": [6, 2, 1], - "to": [10, 11, 15], + "from": [0, 8, 0], + "to": [5, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 18, 8]}, "faces": { - "north": {"uv": [6, 5, 10, 14], "texture": "#4"}, - "south": {"uv": [6, 5, 10, 14], "texture": "#4"}, - "up": {"uv": [1, 6, 15, 10], "rotation": 90, "texture": "#8"} + "north": {"uv": [6, 6, 11, 0], "texture": "#0"}, + "east": {"uv": [0, 10, 16, 16], "texture": "#4"}, + "south": {"uv": [0, 0, 5, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#3"}, + "up": {"uv": [0, 0, 5, 16], "texture": "#5"}, + "down": {"uv": [0, 0, 5, 16], "texture": "#6"} + } + }, + { + "from": [1, 4, 1], + "to": [15, 12, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, + "faces": { + "north": {"uv": [1, 4, 15, 12], "texture": "#4"}, + "east": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "south": {"uv": [1, 4, 15, 12], "texture": "#4"}, + "west": {"uv": [1, 4, 15, 12], "texture": "#0"}, + "up": {"uv": [1, 1, 15, 15], "texture": "#5"} + } + }, + { + "from": [11, 8, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [19, 18, 8]}, + "faces": { + "north": {"uv": [0, 0, 5, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 8, 3], "texture": "#3"}, + "south": {"uv": [6, 6, 11, 0], "texture": "#0"}, + "west": {"uv": [0, 10, 16, 16], "texture": "#4"}, + "up": {"uv": [11, 0, 16, 16], "texture": "#5"}, + "down": {"uv": [11, 0, 16, 16], "texture": "#6"} + } + }, + { + "from": [10, 11, 0], + "to": [11, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 18, 8]}, + "faces": { + "north": {"uv": [5, 0, 6, 3], "texture": "#0"}, + "south": {"uv": [5, 6, 6, 3], "texture": "#0"}, + "west": {"uv": [6, 0, 3, 16], "rotation": 90, "texture": "#5"}, + "up": {"uv": [11, 0, 10, 16], "texture": "#5"}, + "down": {"uv": [15, 0, 16, 16], "texture": "#6"} + } + }, + { + "from": [5, 11, 0], + "to": [6, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 18, 8]}, + "faces": { + "north": {"uv": [5, 6, 6, 3], "texture": "#0"}, + "east": {"uv": [6, 0, 3, 16], "rotation": 90, "texture": "#5"}, + "south": {"uv": [5, 0, 6, 3], "texture": "#0"}, + "up": {"uv": [6, 0, 5, 16], "texture": "#5"}, + "down": {"uv": [16, 0, 15, 16], "texture": "#6"} } } ] diff --git a/src/main/resources/assets/create/models/block/rotation_speed_controller/bracket.json b/src/main/resources/assets/create/models/block/rotation_speed_controller/bracket.json new file mode 100644 index 000000000..7ca552898 --- /dev/null +++ b/src/main/resources/assets/create/models/block/rotation_speed_controller/bracket.json @@ -0,0 +1,210 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/brass_casing", + "3": "create:block/brass_casing_side", + "4": "create:block/brass_block", + "5": "create:block/rotation_speed_controller_bracket", + "6": "create:block/rotation_speed_controller", + "particle": "create:block/brass_block" + }, + "elements": [ + { + "from": [11.9, 3, 2], + "to": [14, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, -24]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [4.1, 3, 2], + "to": [11.9, 13, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4.5, -24]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "west": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [2, 3, 2], + "to": [4.1, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4.5, -24]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [2, 10, 2], + "to": [4.1, 13, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 11.5, -24]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [12.5, 6, 3.5], + "to": [13.5, 14, 4.5], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 14, -16]}, + "faces": { + "north": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "south": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "up": {"uv": [13, 9, 14, 10], "texture": "#3"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 10, 2], + "to": [14, 13, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 11.5, -24]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2.5, 6, 3.5], + "to": [3.5, 14, 4.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, -16]}, + "faces": { + "north": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "south": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "up": {"uv": [13, 9, 14, 10], "texture": "#3"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 3, 10], + "to": [14, 6, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, -16]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [4.1, 3, 10], + "to": [11.9, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4.5, -16]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "west": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [2, 3, 10], + "to": [4.1, 6, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4.5, -16]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [2, 10, 10], + "to": [4.1, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 11.5, -16]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [12.5, 6, 11.5], + "to": [13.5, 14, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 14, -8]}, + "faces": { + "north": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "south": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "up": {"uv": [13, 9, 14, 10], "texture": "#3"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 10, 10], + "to": [14, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 11.5, -16]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2.5, 6, 11.5], + "to": [3.5, 14, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, -8]}, + "faces": { + "north": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "east": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "south": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 13, 14, 14], "rotation": 90, "texture": "#3"}, + "up": {"uv": [13, 9, 14, 10], "texture": "#3"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [1, -2, 10], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "faces": { + "north": {"uv": [0, 10, 14, 15], "texture": "#5"}, + "east": {"uv": [11, 1, 16, 6], "texture": "#6"}, + "south": {"uv": [0, 10, 14, 15], "texture": "#5"}, + "west": {"uv": [11, 1, 16, 6], "texture": "#6"}, + "up": {"uv": [10, 1, 15, 15], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [1, -2, 1], + "to": [15, 3, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "faces": { + "north": {"uv": [14, 10, 0, 15], "texture": "#5"}, + "east": {"uv": [11, 1, 16, 6], "texture": "#6"}, + "south": {"uv": [0, 10, 14, 15], "texture": "#5"}, + "west": {"uv": [11, 1, 16, 6], "texture": "#6"}, + "up": {"uv": [15, 1, 10, 15], "rotation": 90, "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json b/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json index 3d97bf020..160965c86 100644 --- a/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json +++ b/src/main/resources/assets/create/models/block/rotation_speed_controller/item.json @@ -1,101 +1,17 @@ { "credit": "Made with Blockbench", - "parent": "block/block", + "parent": "create:block/block", "textures": { "0": "create:block/axis", "3": "create:block/axis_top", "4": "create:block/brass_gearbox", - "5": "create:block/brass_casing_side", - "6": "create:block/brass_casing", - "8": "create:block/encased_chain_drive_middle", "9": "create:block/brass_block", - "particle": "create:block/brass_casing" + "particle": "create:block/brass_gearbox", + "1_0": "create:block/rotation_speed_controller", + "1_3": "create:block/brass_funnel_plating", + "1_5": "create:block/rotation_speed_controller_top" }, "elements": [ - { - "from": [1, 2, 1], - "to": [6, 15, 5], - "faces": { - "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "east": {"uv": [12, 1, 16, 14], "texture": "#5"}, - "south": {"uv": [4, 1, 9, 14], "texture": "#6"}, - "west": {"uv": [1, 1, 5, 14], "texture": "#6"}, - "up": {"uv": [1, 10, 5, 15], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [10, 2, 1], - "to": [15, 15, 5], - "faces": { - "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [5, 1, 1, 14], "texture": "#6"}, - "south": {"uv": [9, 1, 4, 14], "texture": "#6"}, - "west": {"uv": [16, 1, 12, 14], "texture": "#5"}, - "up": {"uv": [1, 1, 5, 6], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [1, 2, 11], - "to": [6, 15, 15], - "faces": { - "north": {"uv": [4, 1, 9, 14], "texture": "#6"}, - "east": {"uv": [0, 1, 4, 14], "texture": "#5"}, - "south": {"uv": [1, 1, 6, 14], "texture": "#4"}, - "west": {"uv": [11, 1, 15, 14], "texture": "#6"}, - "up": {"uv": [11, 10, 15, 15], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [10, 2, 11], - "to": [15, 15, 15], - "faces": { - "north": {"uv": [9, 1, 4, 14], "texture": "#6"}, - "east": {"uv": [15, 1, 11, 14], "texture": "#6"}, - "south": {"uv": [6, 1, 1, 14], "texture": "#4"}, - "west": {"uv": [4, 1, 0, 14], "texture": "#5"}, - "up": {"uv": [11, 1, 15, 6], "rotation": 90, "texture": "#9"} - } - }, - { - "from": [1, 2, 5], - "to": [6, 8, 11], - "faces": { - "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "west": {"uv": [5, 8, 11, 14], "texture": "#6"}, - "up": {"uv": [5, 3, 11, 8], "rotation": 90, "texture": "#6"} - } - }, - { - "from": [10, 2, 5], - "to": [15, 8, 11], - "faces": { - "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [11, 8, 5, 14], "texture": "#6"}, - "up": {"uv": [5, 8, 11, 3], "rotation": 90, "texture": "#6"} - } - }, - { - "from": [2, 9, 5], - "to": [6, 14, 11], - "faces": { - "north": {"uv": [10, 1, 15, 14], "texture": "#4"}, - "east": {"uv": [6, 9, 12, 14], "texture": "#5"}, - "west": {"uv": [6, 9, 12, 14], "texture": "#5"}, - "up": {"uv": [8, 2, 14, 6], "rotation": 90, "texture": "#5"}, - "down": {"uv": [8, 2, 14, 6], "rotation": 90, "texture": "#5"} - } - }, - { - "from": [10, 9, 5], - "to": [14, 14, 11], - "faces": { - "north": {"uv": [15, 1, 10, 14], "texture": "#4"}, - "east": {"uv": [6, 9, 12, 14], "texture": "#5"}, - "west": {"uv": [6, 9, 12, 14], "texture": "#5"}, - "up": {"uv": [8, 2, 14, 6], "rotation": 270, "texture": "#5"}, - "down": {"uv": [8, 2, 14, 6], "rotation": 90, "texture": "#5"} - } - }, { "name": "Axis", "from": [6, 6, 0], @@ -111,24 +27,84 @@ }, { "from": [0, 0, 0], - "to": [16, 2, 16], + "to": [16, 4, 16], "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#5"}, - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#4"}, - "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#6"} + "north": {"uv": [0, 12, 16, 16], "texture": "#1_0"}, + "east": {"uv": [0, 12, 16, 16], "texture": "#1_0"}, + "south": {"uv": [0, 12, 16, 16], "texture": "#1_0"}, + "west": {"uv": [0, 12, 16, 16], "texture": "#1_0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#4"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#9"} } }, { - "from": [6, 2, 1], - "to": [10, 11, 15], + "from": [0, 8, 0], + "to": [5, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 18, 8]}, "faces": { - "north": {"uv": [6, 5, 10, 14], "texture": "#4"}, - "south": {"uv": [6, 5, 10, 14], "texture": "#4"}, - "up": {"uv": [1, 6, 15, 10], "rotation": 90, "texture": "#8"} + "north": {"uv": [6, 6, 11, 0], "texture": "#1_0"}, + "east": {"uv": [0, 10, 16, 16], "texture": "#4"}, + "south": {"uv": [0, 0, 5, 6], "texture": "#1_0"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#1_3"}, + "up": {"uv": [0, 0, 5, 16], "texture": "#1_5"}, + "down": {"uv": [0, 0, 5, 16], "texture": "#9"} } + }, + { + "from": [1, 4, 1], + "to": [15, 12, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, + "faces": { + "north": {"uv": [1, 4, 15, 12], "texture": "#4"}, + "east": {"uv": [1, 4, 15, 12], "texture": "#1_0"}, + "south": {"uv": [1, 4, 15, 12], "texture": "#4"}, + "west": {"uv": [1, 4, 15, 12], "texture": "#1_0"}, + "up": {"uv": [1, 1, 15, 15], "texture": "#1_5"} + } + }, + { + "from": [11, 8, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [19, 18, 8]}, + "faces": { + "north": {"uv": [0, 0, 5, 6], "texture": "#1_0"}, + "east": {"uv": [0, 0, 8, 3], "texture": "#1_3"}, + "south": {"uv": [6, 6, 11, 0], "texture": "#1_0"}, + "west": {"uv": [0, 10, 16, 16], "texture": "#4"}, + "up": {"uv": [11, 0, 16, 16], "texture": "#1_5"}, + "down": {"uv": [11, 0, 16, 16], "texture": "#9"} + } + }, + { + "from": [10, 11, 0], + "to": [11, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 18, 8]}, + "faces": { + "north": {"uv": [5, 0, 6, 3], "texture": "#1_0"}, + "south": {"uv": [5, 6, 6, 3], "texture": "#1_0"}, + "west": {"uv": [6, 0, 3, 16], "rotation": 90, "texture": "#1_5"}, + "up": {"uv": [11, 0, 10, 16], "texture": "#1_5"}, + "down": {"uv": [15, 0, 16, 16], "texture": "#9"} + } + }, + { + "from": [5, 11, 0], + "to": [6, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 18, 8]}, + "faces": { + "north": {"uv": [5, 6, 6, 3], "texture": "#1_0"}, + "east": {"uv": [6, 0, 3, 16], "rotation": 90, "texture": "#1_5"}, + "south": {"uv": [5, 0, 6, 3], "texture": "#1_0"}, + "up": {"uv": [6, 0, 5, 16], "texture": "#1_5"}, + "down": {"uv": [16, 0, 15, 16], "texture": "#9"} + } + } + ], + "groups": [0, + { + "name": "block", + "origin": [8, 8, 8], + "children": [1, 2, 3, 4, 5, 6] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sequenced_gearshift/idle.json b/src/main/resources/assets/create/models/block/sequenced_gearshift/idle.json index 25b73b6ec..d1ea1860b 100644 --- a/src/main/resources/assets/create/models/block/sequenced_gearshift/idle.json +++ b/src/main/resources/assets/create/models/block/sequenced_gearshift/idle.json @@ -2,73 +2,44 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/brass_casing", "1": "create:block/brass_gearbox", "4": "create:block/sequenced_gearshift", "particle": "create:block/brass_gearbox" }, "elements": [ - { - "name": "Core", - "from": [1, 1, 1], - "to": [15, 15, 15], - "faces": { - "north": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "up": {"uv": [1, 1, 15, 15], "texture": "#4"}, - "down": {"uv": [1, 1, 15, 15], "texture": "#4"} - } - }, - { - "name": "Top", - "from": [0, 14, 0], - "to": [5, 16, 16], - "faces": { - "north": {"uv": [11, 0, 16, 2], "texture": "#0"}, - "east": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, - "south": {"uv": [0, 0, 5, 2], "texture": "#0"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, - "up": {"uv": [0, 0, 5, 16], "texture": "#4"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#0"} - } - }, { "name": "Bottom", - "from": [0, 0, 0], - "to": [5, 2, 16], - "faces": { - "north": {"uv": [11, 14, 16, 16], "texture": "#0"}, - "east": {"uv": [2, 0, 0, 16], "rotation": 90, "texture": "#4"}, - "south": {"uv": [0, 14, 5, 16], "texture": "#0"}, - "west": {"uv": [2, 0, 0, 16], "rotation": 90, "texture": "#4"}, - "up": {"uv": [0, 16, 16, 0], "texture": "#0"}, - "down": {"uv": [0, 16, 5, 0], "texture": "#4"} - } - }, - { - "name": "Top", - "from": [11, 14, 0], + "from": [0, 14, 0], "to": [16, 16, 16], "faces": { - "north": {"uv": [16, 0, 11, 2], "texture": "#0"}, - "east": {"uv": [0, 16, 2, 0], "rotation": 90, "texture": "#4"}, - "south": {"uv": [5, 0, 0, 2], "texture": "#0"}, - "west": {"uv": [0, 16, 2, 0], "rotation": 90, "texture": "#4"}, - "up": {"uv": [11, 0, 16, 16], "texture": "#4"}, - "down": {"uv": [16, 0, 0, 16], "texture": "#0"} + "north": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} } }, { - "name": "Bottom", - "from": [11, 0, 0], + "name": "Core", + "from": [1, 2, 1], + "to": [15, 14, 15], + "faces": { + "north": {"uv": [1, 2, 15, 14], "rotation": 180, "texture": "#1"}, + "south": {"uv": [1, 2, 15, 14], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "Top", + "from": [0, 0, 0], "to": [16, 2, 16], "faces": { - "north": {"uv": [0, 14, 5, 16], "texture": "#0"}, - "east": {"uv": [2, 16, 0, 0], "rotation": 90, "texture": "#4"}, - "south": {"uv": [11, 14, 16, 16], "texture": "#0"}, - "west": {"uv": [2, 16, 0, 0], "rotation": 90, "texture": "#4"}, - "up": {"uv": [16, 16, 0, 0], "texture": "#0"}, - "down": {"uv": [11, 16, 16, 0], "texture": "#4"} + "north": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#4"} } }, { @@ -76,10 +47,10 @@ "from": [0, 2, 0], "to": [2, 14, 16], "faces": { - "north": {"uv": [14, 2, 16, 14], "texture": "#0"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#0"}, - "south": {"uv": [0, 2, 2, 14], "texture": "#0"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#0"} + "north": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#1"}, + "south": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#4"} } }, { @@ -87,24 +58,18 @@ "from": [14, 2, 0], "to": [16, 14, 16], "faces": { - "north": {"uv": [0, 2, 2, 14], "texture": "#0"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#0"}, - "south": {"uv": [14, 2, 16, 14], "texture": "#0"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#0"} + "north": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#1"} } } ], "groups": [ { - "name": "encased_shaft", + "name": "block", "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6, - { - "name": "shaft", - "origin": [8, 8, 8], - "children": [] - } - ] + "children": [0, 1, 2, 3, 4] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sequenced_gearshift/item.json b/src/main/resources/assets/create/models/block/sequenced_gearshift/item.json index b87b557db..c6aecc103 100644 --- a/src/main/resources/assets/create/models/block/sequenced_gearshift/item.json +++ b/src/main/resources/assets/create/models/block/sequenced_gearshift/item.json @@ -2,99 +2,13 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/brass_casing", "1": "create:block/brass_gearbox", "4": "create:block/sequenced_gearshift", - "particle": "create:block/axis", + "particle": "create:block/brass_gearbox", "1_0": "create:block/axis", "1_1": "create:block/axis_top" }, "elements": [ - { - "name": "Core", - "from": [1, 1, 1], - "to": [15, 15, 15], - "faces": { - "north": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "up": {"uv": [1, 1, 15, 15], "texture": "#4"}, - "down": {"uv": [1, 1, 15, 15], "texture": "#4"} - } - }, - { - "name": "Top", - "from": [0, 14, 0], - "to": [5, 16, 16], - "faces": { - "north": {"uv": [11, 0, 16, 2], "texture": "#0"}, - "east": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, - "south": {"uv": [0, 0, 5, 2], "texture": "#0"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, - "up": {"uv": [0, 0, 5, 16], "texture": "#4"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#0"} - } - }, - { - "name": "Bottom", - "from": [0, 0, 0], - "to": [5, 2, 16], - "faces": { - "north": {"uv": [11, 14, 16, 16], "texture": "#0"}, - "east": {"uv": [2, 0, 0, 16], "rotation": 90, "texture": "#4"}, - "south": {"uv": [0, 14, 5, 16], "texture": "#0"}, - "west": {"uv": [2, 0, 0, 16], "rotation": 90, "texture": "#4"}, - "up": {"uv": [0, 16, 16, 0], "texture": "#0"}, - "down": {"uv": [0, 16, 5, 0], "texture": "#4"} - } - }, - { - "name": "Top", - "from": [11, 14, 0], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [16, 0, 11, 2], "texture": "#0"}, - "east": {"uv": [0, 16, 2, 0], "rotation": 90, "texture": "#4"}, - "south": {"uv": [5, 0, 0, 2], "texture": "#0"}, - "west": {"uv": [0, 16, 2, 0], "rotation": 90, "texture": "#4"}, - "up": {"uv": [11, 0, 16, 16], "texture": "#4"}, - "down": {"uv": [16, 0, 0, 16], "texture": "#0"} - } - }, - { - "name": "Bottom", - "from": [11, 0, 0], - "to": [16, 2, 16], - "faces": { - "north": {"uv": [0, 14, 5, 16], "texture": "#0"}, - "east": {"uv": [2, 16, 0, 0], "rotation": 90, "texture": "#4"}, - "south": {"uv": [11, 14, 16, 16], "texture": "#0"}, - "west": {"uv": [2, 16, 0, 0], "rotation": 90, "texture": "#4"}, - "up": {"uv": [16, 16, 0, 0], "texture": "#0"}, - "down": {"uv": [11, 16, 16, 0], "texture": "#4"} - } - }, - { - "name": "SideWest", - "from": [0, 2, 0], - "to": [2, 14, 16], - "faces": { - "north": {"uv": [14, 2, 16, 14], "texture": "#0"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#0"}, - "south": {"uv": [0, 2, 2, 14], "texture": "#0"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#0"} - } - }, - { - "name": "SideEast", - "from": [14, 2, 0], - "to": [16, 14, 16], - "faces": { - "north": {"uv": [0, 2, 2, 14], "texture": "#0"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#0"}, - "south": {"uv": [14, 2, 16, 14], "texture": "#0"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#0"} - } - }, { "name": "Axis", "from": [6, 6, 0], @@ -107,17 +21,85 @@ "up": {"uv": [6, 0, 10, 16], "texture": "#1_0"}, "down": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#1_0"} } + }, + { + "name": "Bottom", + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "name": "Core", + "from": [1, 2, 1], + "to": [15, 14, 15], + "faces": { + "north": {"uv": [1, 2, 15, 14], "rotation": 180, "texture": "#1"}, + "south": {"uv": [1, 2, 15, 14], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "Top", + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "SideWest", + "from": [0, 2, 0], + "to": [2, 14, 16], + "faces": { + "north": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#1"}, + "south": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#4"} + } + }, + { + "name": "SideEast", + "from": [14, 2, 0], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 2, 16, 14], "rotation": 180, "texture": "#1"} + } } ], "groups": [ { "name": "encased_shaft", "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6, + "children": [ { "name": "shaft", "origin": [8, 8, 8], - "children": [7] + "children": [0] + } + ] + }, + { + "name": "idle", + "origin": [8, 8, 8], + "children": [ + { + "name": "block", + "origin": [8, 8, 8], + "children": [1, 2, 3, 4, 5] } ] } diff --git a/src/main/resources/assets/create/models/block/smart_chute/block.json b/src/main/resources/assets/create/models/block/smart_chute/block.json new file mode 100644 index 000000000..8977344b6 --- /dev/null +++ b/src/main/resources/assets/create/models/block/smart_chute/block.json @@ -0,0 +1,194 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "1": "create:block/chute_diagonal", + "2": "create:block/brass_funnel_plating", + "3": "create:block/brass_block", + "5": "create:block/brass_funnel_tall", + "13": "create:block/chute", + "particle": "block/hopper_outside" + }, + "elements": [ + { + "from": [3, 9, 1], + "to": [13, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 16, -3]}, + "faces": { + "north": {"uv": [9.5, 0, 14.5, 3.5], "texture": "#13"}, + "south": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "up": {"uv": [1, 0, 6, 1], "texture": "#13"} + } + }, + { + "from": [3, 9, 13], + "to": [13, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 16, 19]}, + "faces": { + "north": {"uv": [9.5, 0, 14.5, 4], "texture": "#13"}, + "south": {"uv": [9.5, 0, 14.5, 3.5], "texture": "#13"}, + "up": {"uv": [1, 0, 6, 1], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [1, 9, 1], + "to": [3, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]}, + "faces": { + "north": {"uv": [14.5, 0, 15.5, 3.5], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "south": {"uv": [8.5, 0, 9.5, 3.5], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 3.5], "texture": "#13"}, + "up": {"uv": [0, 0, 1, 7], "texture": "#13"} + } + }, + { + "from": [13, 9, 1], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 16, 7]}, + "faces": { + "north": {"uv": [8.5, 0, 9.5, 3.5], "texture": "#13"}, + "east": {"uv": [8.5, 0, 15.5, 3.5], "texture": "#13"}, + "south": {"uv": [14.5, 0, 15.5, 3.5], "texture": "#13"}, + "west": {"uv": [8.5, 0, 15.5, 4], "texture": "#13"}, + "up": {"uv": [0, 0, 1, 7], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 5, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 15]}, + "faces": { + "north": {"uv": [0, 5.5, 8, 8], "texture": "#1"}, + "east": {"uv": [0, 5.5, 8, 8], "texture": "#1"}, + "south": {"uv": [0, 5.5, 8, 8], "texture": "#1"}, + "west": {"uv": [0, 5.5, 8, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#13"}, + "down": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#13"} + } + }, + { + "from": [13, 1, 2], + "to": [14, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 9]}, + "faces": { + "north": {"uv": [9, 4, 9.5, 7.5], "texture": "#13"}, + "east": {"uv": [9, 4, 15, 7.5], "texture": "#13"}, + "south": {"uv": [14.5, 4, 15, 7.5], "texture": "#13"}, + "west": {"uv": [9, 4, 15, 8], "texture": "#13"}, + "down": {"uv": [9, 7.5, 15, 8], "rotation": 90, "texture": "#13"} + } + }, + { + "from": [2, 1, 2], + "to": [3, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 9]}, + "faces": { + "north": {"uv": [14.5, 4, 15, 7.5], "texture": "#13"}, + "east": {"uv": [9, 4, 15, 8], "texture": "#13"}, + "south": {"uv": [9, 4, 9.5, 7.5], "texture": "#13"}, + "west": {"uv": [9, 4, 15, 7.5], "texture": "#13"}, + "down": {"uv": [9, 7.5, 15, 8], "rotation": 90, "texture": "#13"} + } + }, + { + "from": [3, 1, 13], + "to": [13, 8, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 20]}, + "faces": { + "north": {"uv": [9.5, 4, 14.5, 8], "texture": "#13"}, + "south": {"uv": [9.5, 4, 14.5, 7.5], "texture": "#13"}, + "down": {"uv": [9.5, 7.5, 14.5, 8], "texture": "#13"} + } + }, + { + "from": [3, 1, 2], + "to": [13, 8, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 9]}, + "faces": { + "north": {"uv": [9.5, 4, 14.5, 7.5], "texture": "#13"}, + "south": {"uv": [9.5, 4, 14.5, 8], "texture": "#13"}, + "down": {"uv": [9.5, 7.5, 14.5, 8], "texture": "#13"} + } + }, + { + "from": [3, 13, 3], + "to": [13, 14, 13], + "faces": { + "up": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#13"}, + "down": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#13"} + } + }, + { + "from": [0, 9, 0], + "to": [2, 15, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 8]}, + "faces": { + "north": {"uv": [7, 0, 8, 3], "texture": "#2"}, + "south": {"uv": [0, 0, 1, 3], "texture": "#2"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#2"}, + "up": {"uv": [0, 0, 2, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#3"} + } + }, + { + "from": [2, 9, 0], + "to": [14, 15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 8]}, + "faces": { + "north": {"uv": [1, 0, 7, 3], "texture": "#2"}, + "east": {"uv": [7, 0, 8, 3], "texture": "#2"}, + "west": {"uv": [0, 0, 1, 3], "texture": "#2"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 2, 2, 14], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [2, 9, 14], + "to": [14, 15, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 8]}, + "faces": { + "east": {"uv": [8, 0, 7, 3], "texture": "#2"}, + "south": {"uv": [7, 0, 1, 3], "texture": "#2"}, + "west": {"uv": [1, 0, 0, 3], "texture": "#2"}, + "up": {"uv": [2, 2, 0, 14], "rotation": 90, "texture": "#3"}, + "down": {"uv": [2, 2, 0, 14], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [14, 9, 0], + "to": [16, 15, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 8]}, + "faces": { + "north": {"uv": [0, 0, 1, 3], "texture": "#2"}, + "east": {"uv": [8, 0, 0, 3], "texture": "#2"}, + "south": {"uv": [7, 0, 8, 3], "texture": "#2"}, + "up": {"uv": [2, 0, 0, 16], "texture": "#3"}, + "down": {"uv": [2, 0, 0, 16], "texture": "#3"} + } + }, + { + "from": [1, 7, 1], + "to": [15, 9, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [21, 18, 9]}, + "faces": { + "north": {"uv": [1, 4, 15, 6], "texture": "#5"}, + "east": {"uv": [1, 4, 15, 6], "texture": "#5"}, + "south": {"uv": [1, 4, 15, 6], "texture": "#5"}, + "west": {"uv": [1, 4, 15, 6], "texture": "#5"}, + "down": {"uv": [1, 1, 15, 15], "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "ChuteTop", + "origin": [9, 16, -7], + "children": [0, 1, 2, 3, 4] + }, + { + "name": "ChuteBase", + "origin": [8, 8, -7], + "children": [5, 6, 7, 8] + }, 9, 10, 11, 12, 13, 14] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/smart_chute/block_powered.json b/src/main/resources/assets/create/models/block/smart_chute/block_powered.json new file mode 100644 index 000000000..1a2636b1b --- /dev/null +++ b/src/main/resources/assets/create/models/block/smart_chute/block_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/smart_chute/block", + "textures": { + "5": "create:block/brass_funnel_tall_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png b/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png index 6f4ed26a8..e7b7b046d 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png and b/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png b/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png index bf0abd43f..8fa778d40 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png and b/src/main/resources/assets/create/textures/block/andesite_funnel_pull.png differ diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_push.png b/src/main/resources/assets/create/textures/block/andesite_funnel_push.png index ede3d171e..980f0bda9 100644 Binary files a/src/main/resources/assets/create/textures/block/andesite_funnel_push.png and b/src/main/resources/assets/create/textures/block/andesite_funnel_push.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/black.png b/src/main/resources/assets/create/textures/block/belt/black.png new file mode 100644 index 000000000..7208c37dc Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/black.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/black_diagonal.png b/src/main/resources/assets/create/textures/block/belt/black_diagonal.png new file mode 100644 index 000000000..01b7556cb Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/black_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/blue.png b/src/main/resources/assets/create/textures/block/belt/blue.png new file mode 100644 index 000000000..1fde542ce Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/blue.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/blue_diagonal.png b/src/main/resources/assets/create/textures/block/belt/blue_diagonal.png new file mode 100644 index 000000000..9f09d64cb Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/blue_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/brown.png b/src/main/resources/assets/create/textures/block/belt/brown.png new file mode 100644 index 000000000..944db3c46 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/brown.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/brown_diagonal.png b/src/main/resources/assets/create/textures/block/belt/brown_diagonal.png new file mode 100644 index 000000000..104903161 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/brown_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/cyan.png b/src/main/resources/assets/create/textures/block/belt/cyan.png new file mode 100644 index 000000000..414590282 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/cyan.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/cyan_diagonal.png b/src/main/resources/assets/create/textures/block/belt/cyan_diagonal.png new file mode 100644 index 000000000..3bcf44a87 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/cyan_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/gray.png b/src/main/resources/assets/create/textures/block/belt/gray.png new file mode 100644 index 000000000..f306a29cd Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/gray.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/gray_diagonal.png b/src/main/resources/assets/create/textures/block/belt/gray_diagonal.png new file mode 100644 index 000000000..ff2bdc34c Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/gray_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/green.png b/src/main/resources/assets/create/textures/block/belt/green.png new file mode 100644 index 000000000..cd41d7c14 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/green.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/green_diagonal.png b/src/main/resources/assets/create/textures/block/belt/green_diagonal.png new file mode 100644 index 000000000..a79967666 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/green_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/light_blue.png b/src/main/resources/assets/create/textures/block/belt/light_blue.png new file mode 100644 index 000000000..c19b5d0c5 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/light_blue.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/light_blue_diagonal.png b/src/main/resources/assets/create/textures/block/belt/light_blue_diagonal.png new file mode 100644 index 000000000..ad344f524 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/light_blue_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/light_gray.png b/src/main/resources/assets/create/textures/block/belt/light_gray.png new file mode 100644 index 000000000..ca67d7c8e Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/light_gray.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/light_gray_diagonal.png b/src/main/resources/assets/create/textures/block/belt/light_gray_diagonal.png new file mode 100644 index 000000000..f9ba32f48 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/light_gray_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/lime.png b/src/main/resources/assets/create/textures/block/belt/lime.png new file mode 100644 index 000000000..ca40f812b Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/lime.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/lime_diagonal.png b/src/main/resources/assets/create/textures/block/belt/lime_diagonal.png new file mode 100644 index 000000000..ac8405b3c Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/lime_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/magenta.png b/src/main/resources/assets/create/textures/block/belt/magenta.png new file mode 100644 index 000000000..2c751984a Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/magenta.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/magenta_diagonal.png b/src/main/resources/assets/create/textures/block/belt/magenta_diagonal.png new file mode 100644 index 000000000..f7539d185 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/magenta_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/orange.png b/src/main/resources/assets/create/textures/block/belt/orange.png new file mode 100644 index 000000000..d4356e978 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/orange.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/orange_diagonal.png b/src/main/resources/assets/create/textures/block/belt/orange_diagonal.png new file mode 100644 index 000000000..7e774efee Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/orange_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/pink.png b/src/main/resources/assets/create/textures/block/belt/pink.png new file mode 100644 index 000000000..e8271fcff Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/pink.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/pink_diagonal.png b/src/main/resources/assets/create/textures/block/belt/pink_diagonal.png new file mode 100644 index 000000000..c4441a5ed Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/pink_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/purple.png b/src/main/resources/assets/create/textures/block/belt/purple.png new file mode 100644 index 000000000..a34dadade Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/purple.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/purple_diagonal.png b/src/main/resources/assets/create/textures/block/belt/purple_diagonal.png new file mode 100644 index 000000000..a86fbfc6c Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/purple_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/red.png b/src/main/resources/assets/create/textures/block/belt/red.png new file mode 100644 index 000000000..9de781a48 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/red.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/red_diagonal.png b/src/main/resources/assets/create/textures/block/belt/red_diagonal.png new file mode 100644 index 000000000..ec53e50c9 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/red_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/white.png b/src/main/resources/assets/create/textures/block/belt/white.png new file mode 100644 index 000000000..3edb40a1a Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/white.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/white_diagonal.png b/src/main/resources/assets/create/textures/block/belt/white_diagonal.png new file mode 100644 index 000000000..06694cb35 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/white_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/yellow.png b/src/main/resources/assets/create/textures/block/belt/yellow.png new file mode 100644 index 000000000..ef615bfcf Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/yellow.png differ diff --git a/src/main/resources/assets/create/textures/block/belt/yellow_diagonal.png b/src/main/resources/assets/create/textures/block/belt/yellow_diagonal.png new file mode 100644 index 000000000..b682d0be3 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/belt/yellow_diagonal.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_plating.png b/src/main/resources/assets/create/textures/block/brass_funnel_plating.png index 76fe0d542..014d9ba8d 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_plating.png and b/src/main/resources/assets/create/textures/block/brass_funnel_plating.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_pull.png b/src/main/resources/assets/create/textures/block/brass_funnel_pull.png index f8fe8e44b..df455d78e 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_pull.png and b/src/main/resources/assets/create/textures/block/brass_funnel_pull.png differ diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_push.png b/src/main/resources/assets/create/textures/block/brass_funnel_push.png index 18eb09320..6b1c6d0e7 100644 Binary files a/src/main/resources/assets/create/textures/block/brass_funnel_push.png and b/src/main/resources/assets/create/textures/block/brass_funnel_push.png differ diff --git a/src/main/resources/assets/create/textures/block/clutch_off.png b/src/main/resources/assets/create/textures/block/clutch_off.png index 2988f8b8f..802f5bbb7 100644 Binary files a/src/main/resources/assets/create/textures/block/clutch_off.png and b/src/main/resources/assets/create/textures/block/clutch_off.png differ diff --git a/src/main/resources/assets/create/textures/block/clutch_on.png b/src/main/resources/assets/create/textures/block/clutch_on.png index 15abb7c36..c080a88d7 100644 Binary files a/src/main/resources/assets/create/textures/block/clutch_on.png and b/src/main/resources/assets/create/textures/block/clutch_on.png differ diff --git a/src/main/resources/assets/create/textures/block/cogwheel.png b/src/main/resources/assets/create/textures/block/cogwheel.png index 944bb51a6..bf3cd5cf9 100644 Binary files a/src/main/resources/assets/create/textures/block/cogwheel.png and b/src/main/resources/assets/create/textures/block/cogwheel.png differ diff --git a/src/main/resources/assets/create/textures/block/gantry_shaft.png b/src/main/resources/assets/create/textures/block/gantry_shaft.png new file mode 100644 index 000000000..b11a4a8d6 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/gantry_shaft.png differ diff --git a/src/main/resources/assets/create/textures/block/gantry_shaft_flipped.png b/src/main/resources/assets/create/textures/block/gantry_shaft_flipped.png new file mode 100644 index 000000000..8971a8d65 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/gantry_shaft_flipped.png differ diff --git a/src/main/resources/assets/create/textures/block/gantry_shaft_powered.png b/src/main/resources/assets/create/textures/block/gantry_shaft_powered.png new file mode 100644 index 000000000..b3111e74a Binary files /dev/null and b/src/main/resources/assets/create/textures/block/gantry_shaft_powered.png differ diff --git a/src/main/resources/assets/create/textures/block/gantry_shaft_powered_flipped.png b/src/main/resources/assets/create/textures/block/gantry_shaft_powered_flipped.png new file mode 100644 index 000000000..4e7c55ddb Binary files /dev/null and b/src/main/resources/assets/create/textures/block/gantry_shaft_powered_flipped.png differ diff --git a/src/main/resources/assets/create/textures/block/gearbox.png b/src/main/resources/assets/create/textures/block/gearbox.png index 2a6056dc0..1d2cb6b81 100644 Binary files a/src/main/resources/assets/create/textures/block/gearbox.png and b/src/main/resources/assets/create/textures/block/gearbox.png differ diff --git a/src/main/resources/assets/create/textures/block/gearshift_off.png b/src/main/resources/assets/create/textures/block/gearshift_off.png index e9504c00b..e3e5d4a4c 100644 Binary files a/src/main/resources/assets/create/textures/block/gearshift_off.png and b/src/main/resources/assets/create/textures/block/gearshift_off.png differ diff --git a/src/main/resources/assets/create/textures/block/gearshift_on.png b/src/main/resources/assets/create/textures/block/gearshift_on.png index 50faee2c9..65f83e83e 100644 Binary files a/src/main/resources/assets/create/textures/block/gearshift_on.png and b/src/main/resources/assets/create/textures/block/gearshift_on.png differ diff --git a/src/main/resources/assets/create/textures/block/pinion.png b/src/main/resources/assets/create/textures/block/pinion.png new file mode 100644 index 000000000..68c43c3e6 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/pinion.png differ diff --git a/src/main/resources/assets/create/textures/block/rotation_speed_controller.png b/src/main/resources/assets/create/textures/block/rotation_speed_controller.png new file mode 100644 index 000000000..214cd3a91 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/rotation_speed_controller.png differ diff --git a/src/main/resources/assets/create/textures/block/rotation_speed_controller_bracket.png b/src/main/resources/assets/create/textures/block/rotation_speed_controller_bracket.png new file mode 100644 index 000000000..fcc00d5db Binary files /dev/null and b/src/main/resources/assets/create/textures/block/rotation_speed_controller_bracket.png differ diff --git a/src/main/resources/assets/create/textures/block/rotation_speed_controller_top.png b/src/main/resources/assets/create/textures/block/rotation_speed_controller_top.png new file mode 100644 index 000000000..5d11cd315 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/rotation_speed_controller_top.png differ diff --git a/src/main/resources/assets/create/textures/block/sequenced_gearshift.png b/src/main/resources/assets/create/textures/block/sequenced_gearshift.png index 1e0a9443c..bcafe5f20 100644 Binary files a/src/main/resources/assets/create/textures/block/sequenced_gearshift.png and b/src/main/resources/assets/create/textures/block/sequenced_gearshift.png differ diff --git a/src/main/resources/assets/create/textures/block/sequenced_gearshift_1.png b/src/main/resources/assets/create/textures/block/sequenced_gearshift_1.png index 7a0d375d6..d5bc2ae41 100644 Binary files a/src/main/resources/assets/create/textures/block/sequenced_gearshift_1.png and b/src/main/resources/assets/create/textures/block/sequenced_gearshift_1.png differ diff --git a/src/main/resources/assets/create/textures/block/sequenced_gearshift_2.png b/src/main/resources/assets/create/textures/block/sequenced_gearshift_2.png index c6f63c365..f6f3304f4 100644 Binary files a/src/main/resources/assets/create/textures/block/sequenced_gearshift_2.png and b/src/main/resources/assets/create/textures/block/sequenced_gearshift_2.png differ diff --git a/src/main/resources/assets/create/textures/block/sequenced_gearshift_3.png b/src/main/resources/assets/create/textures/block/sequenced_gearshift_3.png index 0ed6ea628..95affcedb 100644 Binary files a/src/main/resources/assets/create/textures/block/sequenced_gearshift_3.png and b/src/main/resources/assets/create/textures/block/sequenced_gearshift_3.png differ diff --git a/src/main/resources/assets/create/textures/block/sequenced_gearshift_4.png b/src/main/resources/assets/create/textures/block/sequenced_gearshift_4.png index 8c4e19434..4f984c196 100644 Binary files a/src/main/resources/assets/create/textures/block/sequenced_gearshift_4.png and b/src/main/resources/assets/create/textures/block/sequenced_gearshift_4.png differ diff --git a/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png b/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png index 628c9f076..77f9f402d 100644 Binary files a/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png and b/src/main/resources/assets/create/textures/block/sequenced_gearshift_5.png differ diff --git a/src/main/resources/data/create/recipes/compat/ae2/crushing/certus_ore.json b/src/main/resources/data/create/recipes/compat/ae2/crushing/certus_ore.json new file mode 100644 index 000000000..973dd4630 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/crushing/certus_ore.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:crushing", + "ingredients": [ + { + "item": "appliedenergistics2:quartz_ore" + } + ], + "results": [ + { + "item": "appliedenergistics2:certus_quartz_crystal", + "count": 2 + }, + { + "item": "appliedenergistics2:certus_quartz_dust", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 300 +} diff --git a/src/main/resources/data/create/recipes/compat/ae2/crushing/charged_certus_ore.json b/src/main/resources/data/create/recipes/compat/ae2/crushing/charged_certus_ore.json new file mode 100644 index 000000000..0f82a5e55 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/crushing/charged_certus_ore.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:crushing", + "ingredients": [ + { + "item": "appliedenergistics2:charged_quartz_ore" + } + ], + "results": [ + { + "item": "appliedenergistics2:charged_certus_quartz_crystal", + "count": 2 + }, + { + "item": "appliedenergistics2:certus_quartz_dust", + "count": 1, + "chance": 0.25 + }, + { + "item": "minecraft:cobblestone", + "count": 1, + "chance": 0.125 + } + ], + "processingTime": 300 +} diff --git a/src/main/resources/data/create/recipes/compat/ae2/milling/certus_quartz.json b/src/main/resources/data/create/recipes/compat/ae2/milling/certus_quartz.json new file mode 100644 index 000000000..6f8022a4a --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/milling/certus_quartz.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:gems/certus_quartz" + } + ], + "results": [ + { + "item": "appliedenergistics2:certus_quartz_dust", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/ae2/milling/ender_pearl.json b/src/main/resources/data/create/recipes/compat/ae2/milling/ender_pearl.json new file mode 100644 index 000000000..abab859dd --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/milling/ender_pearl.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:ender_pearls" + } + ], + "results": [ + { + "item": "appliedenergistics2:ender_dust", + "count": 1 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/ae2/milling/glowflower.json b/src/main/resources/data/create/recipes/compat/ae2/milling/glowflower.json new file mode 100644 index 000000000..431878641 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/milling/glowflower.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "appliedenergistics2:certus_quartz_crystal" + } + ], + "results": [ + { + "item": "appliedenergistics2:certus_quartz_dust", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/ae2/milling/gold.json b/src/main/resources/data/create/recipes/compat/ae2/milling/gold.json new file mode 100644 index 000000000..bfbc249f2 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/milling/gold.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:ingots/gold" + } + ], + "results": [ + { + "item": "appliedenergistics2:gold_dust", + "count": 1 + } + ], + "processingTime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/ae2/milling/iron.json b/src/main/resources/data/create/recipes/compat/ae2/milling/iron.json new file mode 100644 index 000000000..a7f0e56e5 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/milling/iron.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:ingots/iron" + } + ], + "results": [ + { + "item": "appliedenergistics2:iron_dust", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/ae2/milling/nether_quartz.json b/src/main/resources/data/create/recipes/compat/ae2/milling/nether_quartz.json new file mode 100644 index 000000000..e9b4aa015 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/milling/nether_quartz.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:milling", + "ingredients": [ + { + "tag": "forge:gems/quartz" + } + ], + "results": [ + { + "item": "appliedenergistics2:nether_quartz_dust", + "count": 1 + } + ], + "processingTime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/ae2/milling/sky_stone_block.json b/src/main/resources/data/create/recipes/compat/ae2/milling/sky_stone_block.json new file mode 100644 index 000000000..145402282 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/milling/sky_stone_block.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:milling", + "ingredients": [ + { + "item": "appliedenergistics2:sky_stone_block" + } + ], + "results": [ + { + "item": "appliedenergistics2:sky_dust", + "count": 1 + } + ], + "processingTime": 300 +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/compat/ae2/mixing/fluix_crystal.json b/src/main/resources/data/create/recipes/compat/ae2/mixing/fluix_crystal.json new file mode 100644 index 000000000..c3cef0d65 --- /dev/null +++ b/src/main/resources/data/create/recipes/compat/ae2/mixing/fluix_crystal.json @@ -0,0 +1,32 @@ +{ + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "appliedenergistics2" + } + ], + "type": "create:mixing", + "ingredients": [ + { + "tag": "forge:dusts/redstone" + }, + { + "fluid": "minecraft:water", + "nbt": {}, + "amount": 250 + }, + { + "item": "appliedenergistics2:charged_certus_quartz_crystal" + }, + { + "tag": "forge:gems/quartz" + } + ], + "results": [ + { + "item": "appliedenergistics2:fluix_crystal", + "count": 2 + } + ], + "heatRequirement": "none" +} \ No newline at end of file